diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm
index d4fe617c4c2..c7ffbefb0d2 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_lodge.dmm
@@ -8,7 +8,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/floor,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/tile,
@@ -21,7 +21,7 @@
pixel_x = 5;
pixel_y = 8
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/carpet/royalblack,
@@ -75,7 +75,7 @@
},
/area/ruin/huntinglodge)
"bV" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/effect/turf_decal/weather/snow/corner{
@@ -153,7 +153,7 @@
/turf/open/floor/wood/tile,
/area/ruin/huntinglodge)
"cS" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/turf/open/misc/hay/icemoon,
@@ -167,7 +167,7 @@
pixel_y = -4
},
/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/turf/open/floor/carpet/red,
@@ -293,7 +293,7 @@
/turf/open/floor/wood/large,
/area/ruin/huntinglodge)
"fb" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
@@ -388,7 +388,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/large,
@@ -552,7 +552,7 @@
},
/obj/item/bodypart/head/ethereal,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/item/chair/stool,
@@ -674,7 +674,7 @@
/obj/effect/decal/cleanable/blood/footprints{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/carpet/royalblack,
@@ -752,7 +752,7 @@
/area/ruin/huntinglodge)
"mb" = (
/obj/item/ammo_casing/shotgun/buckshot/spent,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
@@ -1021,7 +1021,7 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/item/chair/stool,
@@ -1042,7 +1042,7 @@
/area/icemoon/surface/outdoors/nospawn)
"rI" = (
/obj/effect/decal/cleanable/blood/tracks,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/turf_decal/weather/snow/corner{
@@ -1088,7 +1088,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/effect/decal/cleanable/brimdust,
@@ -1243,7 +1243,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 5
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/item/kirbyplants/random,
@@ -1343,7 +1343,7 @@
/area/icemoon/surface/outdoors/nospawn)
"xz" = (
/obj/effect/decal/cleanable/blood/gibs/body,
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/siding/wood/corner,
/obj/effect/turf_decal/siding/wood/corner{
@@ -1485,7 +1485,7 @@
/area/icemoon/surface/outdoors/nospawn)
"yO" = (
/obj/effect/decal/cleanable/garbage,
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/obj/effect/decal/cleanable/blood/footprints{
dir = 2
},
@@ -1550,7 +1550,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/gibs/core,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/tile,
@@ -1579,13 +1579,13 @@
/turf/open/floor/wood/large,
/area/ruin/huntinglodge)
"As" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/turf/open/misc/asteroid/snow/icemoon/do_not_chasm,
/area/icemoon/surface/outdoors/nospawn)
"Aw" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/effect/turf_decal/weather/snow/corner{
@@ -1610,7 +1610,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/turf/open/floor/wood/large,
@@ -1693,7 +1693,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/large,
@@ -1767,7 +1767,7 @@
"Dc" = (
/obj/effect/turf_decal/siding/wood,
/obj/structure/chair/stool/directional/south,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/confetti,
@@ -1782,7 +1782,7 @@
/turf/open/floor/wood,
/area/ruin/huntinglodge)
"Dq" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/stone/icemoon,
@@ -1952,7 +1952,7 @@
/turf/open/floor/wood,
/area/ruin/huntinglodge)
"EY" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/turf_decal/weather/snow/corner{
@@ -2330,7 +2330,7 @@
/obj/effect/turf_decal/siding/wood,
/obj/structure/chair/stool/directional/south,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/tile,
@@ -2353,7 +2353,7 @@
dir = 1
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/confetti,
@@ -2461,7 +2461,7 @@
/obj/structure/chair/stool/directional/south,
/obj/effect/decal/cleanable/plastic,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/tile,
@@ -2484,7 +2484,7 @@
dir = 1
},
/obj/structure/chair/stool/directional/north,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/confetti,
@@ -2521,7 +2521,7 @@
/turf/open/floor/carpet/green,
/area/ruin/huntinglodge)
"NN" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
@@ -2555,7 +2555,7 @@
/area/ruin/huntinglodge)
"Ok" = (
/obj/effect/turf_decal/siding/wood,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/wood/tile,
@@ -2730,7 +2730,7 @@
dir = 4
},
/obj/effect/decal/cleanable/blood/gibs/limb,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/turf_decal/siding/wood/corner{
@@ -2765,7 +2765,7 @@
/obj/effect/decal/cleanable/blood/footprints{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/turf_decal/siding/wood/corner{
@@ -2777,11 +2777,11 @@
/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/mob/living/basic/viscerator,
@@ -2789,7 +2789,7 @@
/area/ruin/huntinglodge)
"RB" = (
/obj/effect/decal/cleanable/blood/gibs/body,
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/checker,
/area/ruin/huntinglodge)
@@ -2836,7 +2836,7 @@
/turf/open/floor/stone/icemoon,
/area/icemoon/surface/outdoors/nospawn)
"Sp" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
@@ -2904,7 +2904,7 @@
/obj/effect/turf_decal/weather/snow/corner{
dir = 1
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/stone/icemoon,
@@ -3095,7 +3095,7 @@
/area/ruin/huntinglodge)
"Xd" = (
/obj/effect/decal/cleanable/blood/drip,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/floor/carpet/royalblack,
@@ -3197,7 +3197,7 @@
pixel_x = -1;
pixel_y = -1
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/turf_decal/weather/snow/corner{
@@ -3235,7 +3235,7 @@
/obj/machinery/door/airlock/wood{
color = "#beada5"
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/structure/fans/tiny,
@@ -3284,7 +3284,7 @@
/turf/open/floor/carpet,
/area/ruin/huntinglodge)
"ZI" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/item/bodypart/head/ethereal,
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm
index 05d5324cac0..c62c9f09e4e 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm
@@ -207,7 +207,7 @@
/turf/closed/indestructible/reinforced,
/area/ruin/powered/mailroom)
"vV" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth_large,
/area/ruin/powered/mailroom)
"wc" = (
@@ -433,7 +433,7 @@
/turf/open/floor/iron/smooth_large,
/area/ruin/powered/mailroom)
"TN" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/door/puzzle/keycard/icebox/office,
/turf/open/floor/iron/white,
/area/ruin/powered/mailroom)
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
index e41c2db6863..51b616bced9 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndidome.dmm
@@ -53,7 +53,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/syndibiodome)
"al" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -142,7 +142,7 @@
/turf/open/floor/plating,
/area/ruin/syndibiodome)
"bC" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/glass/plastitanium,
@@ -210,7 +210,7 @@
/turf/open/floor/iron/dark/herringbone,
/area/ruin/syndibiodome)
"cx" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/structure/fluff/fake_scrubber{
@@ -310,7 +310,7 @@
/turf/open/floor/iron/cafeteria,
/area/ruin/syndibiodome)
"dJ" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/structure/fluff/fake_scrubber,
@@ -361,7 +361,7 @@
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/glass/plastitanium,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/turf/open/floor/iron/dark/side{
@@ -421,7 +421,7 @@
/area/icemoon/surface/outdoors/noteleport)
"fO" = (
/obj/structure/flora/bush/flowers_pp/style_3,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/effect/turf_decal/weather/dirt{
@@ -600,7 +600,7 @@
/turf/open/floor/iron/dark/herringbone,
/area/ruin/syndibiodome)
"hR" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/obj/effect/decal/cleanable/dirt,
@@ -708,7 +708,7 @@
/obj/effect/turf_decal/trimline/green/line{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/effect/decal/cleanable/dirt,
@@ -763,7 +763,7 @@
/obj/effect/turf_decal/siding/wood/corner{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/turf/open/floor/wood,
@@ -774,7 +774,7 @@
/turf/open/floor/iron/dark,
/area/ruin/syndibiodome)
"jR" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/turf_decal/trimline/dark_red/line,
@@ -879,7 +879,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/wideplating/dark,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/obj/effect/decal/cleanable/dirt,
@@ -1020,7 +1020,7 @@
/turf/open/floor/iron/dark,
/area/ruin/syndibiodome)
"mF" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/ruin/syndibiodome)
@@ -1120,7 +1120,7 @@
/turf/open/floor/catwalk_floor/iron_dark,
/area/ruin/syndibiodome)
"oq" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/effect/decal/cleanable/dirt,
@@ -1128,7 +1128,7 @@
/area/ruin/syndibiodome)
"ox" = (
/obj/effect/decal/cleanable/glass/plastitanium,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/obj/effect/turf_decal/weather/dirt{
@@ -1262,7 +1262,7 @@
/area/ruin/syndibiodome)
"qi" = (
/obj/effect/decal/cleanable/blood,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -1299,7 +1299,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/siding/wideplating/dark,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/turf/open/floor/iron/dark,
@@ -1404,7 +1404,7 @@
dir = 8
},
/obj/effect/turf_decal/siding/wideplating_new/dark,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/obj/effect/turf_decal/tile/dark_red/opposingcorners,
@@ -1494,7 +1494,7 @@
/area/ruin/syndibiodome)
"tK" = (
/obj/effect/turf_decal/trimline/green/corner,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -1515,7 +1515,7 @@
/turf/open/floor/iron/dark,
/area/ruin/syndibiodome)
"ui" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/structure/fluff/fake_scrubber{
@@ -1722,7 +1722,7 @@
/turf/open/floor/iron/dark/herringbone,
/area/ruin/syndibiodome)
"vK" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/obj/structure/fluff/fake_vent,
@@ -1738,7 +1738,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/syndibiodome)
"vO" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
@@ -1882,7 +1882,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/syndibiodome)
"xh" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -1961,7 +1961,7 @@
/turf/open/floor/iron/dark,
/area/ruin/syndibiodome)
"xH" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -2031,7 +2031,7 @@
dir = 5
},
/obj/structure/flora/bush/flowers_br/style_3,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/structure/fluff/fake_camera{
@@ -2082,7 +2082,7 @@
/area/ruin/syndibiodome)
"yH" = (
/obj/effect/decal/cleanable/blood/splatter/over_window,
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/obj/effect/decal/cleanable/glass/plastitanium,
/obj/machinery/door/poddoor/shutters/indestructible{
id = "biosurglockdown";
@@ -2184,7 +2184,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/syndibiodome)
"zI" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -2376,7 +2376,7 @@
/obj/effect/turf_decal/trimline/green/corner{
dir = 1
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 9
},
/obj/effect/decal/cleanable/dirt,
@@ -2513,7 +2513,7 @@
/turf/open/floor/iron/white/small,
/area/ruin/syndibiodome)
"EE" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -2556,7 +2556,7 @@
/obj/effect/turf_decal/siding/wideplating/dark{
dir = 1
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -2565,7 +2565,7 @@
/turf/open/floor/iron/dark/herringbone,
/area/ruin/syndibiodome)
"Fe" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
@@ -2658,7 +2658,7 @@
/turf/open/floor/plating,
/area/ruin/syndibiodome)
"Gh" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -2816,7 +2816,7 @@
/turf/open/floor/iron/white/small,
/area/ruin/syndibiodome)
"Ij" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
@@ -2948,7 +2948,7 @@
/turf/open/floor/stone/icemoon,
/area/icemoon/surface/outdoors/noteleport)
"JZ" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/obj/effect/decal/cleanable/glass/plastitanium,
@@ -2964,7 +2964,7 @@
"Ki" = (
/obj/machinery/door/airlock/public/glass,
/obj/machinery/door/firedoor,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -3217,7 +3217,7 @@
/obj/effect/decal/cleanable/blood/tracks{
dir = 6
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/obj/effect/turf_decal/tile/dark_red/opposingcorners,
@@ -3423,7 +3423,7 @@
/turf/open/floor/plating,
/area/ruin/syndibiodome)
"OH" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/obj/machinery/door/airlock/external/ruin,
@@ -3716,7 +3716,7 @@
"St" = (
/obj/structure/fans/tiny,
/obj/structure/door_assembly/door_assembly_grunge,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/turf/open/floor/iron/dark,
@@ -3788,7 +3788,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/turf/open/floor/iron/dark,
@@ -3841,7 +3841,7 @@
/obj/structure/fluff/fake_scrubber{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/obj/effect/decal/cleanable/glass/plastitanium,
@@ -3875,7 +3875,7 @@
/obj/effect/turf_decal/trimline/blue/corner{
dir = 4
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/turf/open/floor/mineral/plastitanium/red,
@@ -3893,7 +3893,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/wideplating/dark,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 9
},
/obj/effect/decal/cleanable/dirt,
@@ -4078,7 +4078,7 @@
dir = 8
},
/obj/structure/flora/bush/flowers_pp/style_3,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/turf/open/floor/grass,
@@ -4140,13 +4140,13 @@
/turf/open/misc/asteroid/snow/icemoon,
/area/ruin/syndibiodome)
"VJ" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 9
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/turf_decal/siding/wideplating/dark{
@@ -4178,7 +4178,7 @@
"VT" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/poddoor/shutters/preopen,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/obj/structure/fans/tiny,
@@ -4394,7 +4394,7 @@
"YZ" = (
/obj/effect/turf_decal/siding/wideplating/dark,
/obj/structure/fluff/fake_vent,
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
@@ -4419,14 +4419,14 @@
/turf/open/floor/grass,
/area/ruin/syndibiodome)
"Zp" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/ruin/syndibiodome)
"ZD" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm
index 9df4af38f1b..7a02673c4e0 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_syndielab.dmm
@@ -323,7 +323,7 @@
/area/ruin/syndielab)
"tb" = (
/obj/machinery/light/warm/directional/north,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden,
/obj/structure/cable/layer1,
/turf/open/floor/iron/dark/textured,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
index 6cf75767578..8b4dd1bc5d0 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
@@ -246,7 +246,7 @@
/turf/open/floor/plating,
/area/ruin/powered/clownplanet)
"bE" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/disposalpipe/segment{
dir = 10
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
index f5e69e12989..bbf0c14f8f3 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
@@ -437,7 +437,7 @@
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
"Sj" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
"Ub" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
index bd900021094..f61188c3a46 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
@@ -38,7 +38,7 @@
/turf/closed/mineral/strong/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"bh" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/chair/office/light,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
@@ -83,7 +83,7 @@
/turf/closed/wall,
/area/ruin/unpowered/elephant_graveyard)
"bS" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/machinery/rnd/destructive_analyzer,
/turf/open/floor/mineral/titanium/white,
/area/ruin/powered/graveyard_shuttle)
@@ -328,7 +328,7 @@
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"yG" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/decal/cleanable/glass,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
diff --git a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm
index 51fea0a9517..8eddb65ddf5 100644
--- a/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm
+++ b/_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm
@@ -56,7 +56,7 @@
/turf/open/floor/plating/airless,
/area/ruin/space/abandoned_tele)
"n" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/floor/plating/airless,
/area/ruin/space/abandoned_tele)
"o" = (
@@ -89,7 +89,7 @@
/turf/open/floor/plating/airless,
/area/ruin/space/abandoned_tele)
"v" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating/airless,
/area/ruin/space/abandoned_tele)
"w" = (
diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm
index b2bdd4cac3b..171775eca42 100644
--- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm
+++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm
@@ -134,7 +134,7 @@
/turf/open/floor/wood,
/area/misc/anomaly_research)
"eW" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/purple/opposingcorners,
/turf/open/floor/iron/white,
@@ -1115,7 +1115,7 @@
/area/misc/anomaly_research)
"Ff" = (
/obj/effect/turf_decal/trimline/purple/line,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/purple/opposingcorners,
/turf/open/floor/iron/white,
@@ -1474,7 +1474,7 @@
/turf/open/floor/iron/white,
/area/misc/anomaly_research)
"Oa" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/tile/purple/opposingcorners,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1509,7 +1509,7 @@
/area/misc/anomaly_research)
"Ov" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/tile/purple/opposingcorners,
/turf/open/floor/iron/white,
/area/misc/anomaly_research)
diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
index 5e219273e13..03a29e782d1 100644
--- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
+++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
@@ -664,7 +664,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/derelictoutpost/cargobay)
"cV" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/turf/open/floor/iron,
/area/ruin/space/has_grav/derelictoutpost/cargobay)
"cW" = (
@@ -769,7 +769,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/derelictoutpost)
"dq" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/obj/structure/alien/weeds/creature,
/turf/open/floor/iron,
/area/ruin/space/has_grav/derelictoutpost/cargobay)
diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm
index b821bf32195..d951c536f52 100644
--- a/_maps/RandomRuins/SpaceRuins/bus.dmm
+++ b/_maps/RandomRuins/SpaceRuins/bus.dmm
@@ -221,7 +221,7 @@
/area/ruin/space)
"jH" = (
/obj/item/storage/toolbox/mechanical,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"kn" = (
@@ -260,7 +260,7 @@
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"Bw" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"CO" = (
@@ -331,7 +331,7 @@
/obj/structure/fluff/bus/dense{
icon_state = "frontwallbottom"
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"KK" = (
@@ -366,7 +366,7 @@
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"Wn" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/misc/asteroid/airless,
/area/ruin/space)
"WQ" = (
diff --git a/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm
index 4fa47033077..43c2ff96326 100644
--- a/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm
+++ b/_maps/RandomRuins/SpaceRuins/commsbuoy_nt.dmm
@@ -163,7 +163,7 @@
/turf/open/floor/mineral/titanium/yellow,
/area/ruin/space/nt_commsbuoy)
"lB" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/blood/footprints{
@@ -479,7 +479,7 @@
/turf/open/floor/mineral/titanium/yellow,
/area/ruin/space/nt_commsbuoy)
"Qd" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/obj/item/paper/fluff/ruins/nt_commsbuoy/torn_page,
diff --git a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm
index f72cdd8ecad..d0a89db3bc8 100644
--- a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm
+++ b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm
@@ -11,8 +11,8 @@
/turf/open/misc/asteroid/airless,
/area/space)
"e" = (
-/obj/effect/decal/cleanable/oil/streak,
-/obj/effect/decal/cleanable/oil{
+/obj/effect/decal/cleanable/blood/splatter/oil,
+/obj/effect/decal/cleanable/blood/oil{
pixel_x = 8;
pixel_y = 15
},
@@ -20,7 +20,7 @@
/area/space)
"f" = (
/obj/structure/spacevine,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/airless,
/area/space)
"g" = (
@@ -38,7 +38,7 @@
/area/space)
"k" = (
/obj/structure/spacevine,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/misc/asteroid/airless,
/area/space)
"m" = (
@@ -46,7 +46,7 @@
/turf/open/misc/asteroid/airless,
/area/space)
"n" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/turf/open/misc/asteroid/airless,
/area/space)
"o" = (
@@ -67,11 +67,11 @@
/area/space)
"u" = (
/obj/structure/spacevine,
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/misc/asteroid/airless,
/area/space)
"v" = (
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/turf/open/misc/asteroid/airless,
/area/space)
"w" = (
@@ -103,7 +103,7 @@
/turf/open/misc/asteroid/airless,
/area/space)
"G" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/misc/asteroid/airless,
/area/space)
"H" = (
@@ -130,7 +130,7 @@
/turf/open/misc/asteroid/airless,
/area/space)
"N" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/airless,
/area/space)
"O" = (
@@ -144,7 +144,7 @@
/turf/open/misc/asteroid/airless,
/area/space)
"R" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/misc/asteroid/airless,
/area/space)
"S" = (
@@ -172,7 +172,7 @@
/area/space)
"Y" = (
/mob/living/basic/hivebot/range,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/misc/asteroid/airless,
/area/space)
"Z" = (
diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm
index f8c87d30eb2..9a172cb8565 100644
--- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm
+++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm
@@ -152,7 +152,7 @@
"ci" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/wallframe/camera,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
@@ -2665,7 +2665,7 @@
},
/obj/item/wallframe/camera,
/obj/item/stack/cable_coil,
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/turf/open/floor/iron/white,
/area/ruin/space/has_grav/dangerous_research/medical)
"IZ" = (
@@ -3209,7 +3209,7 @@
/area/ruin/space/has_grav/dangerous_research/dorms)
"PZ" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 4
},
@@ -3765,7 +3765,7 @@
/obj/machinery/power/apc/auto_name/directional/north,
/obj/effect/mapping_helpers/apc/away_general_access,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
dir = 4
},
diff --git a/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm b/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm
index a8c3607258d..9da222e89c0 100644
--- a/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm
+++ b/_maps/RandomRuins/SpaceRuins/derelict_construction.dmm
@@ -390,7 +390,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictconstruction)
"Vh" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/trash/caution_sign,
/turf/open/floor/plating,
diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
index 92d886ad9ea..ba3512e7a96 100644
--- a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
+++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
@@ -42,7 +42,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"cl" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth,
/area/ruin/space/has_grav/derelictsulaco)
"cu" = (
@@ -92,7 +92,7 @@
/area/ruin/space)
"dD" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/limb,
+/obj/effect/decal/cleanable/blood/gibs/xeno/limb,
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictsulaco)
"dJ" = (
@@ -124,7 +124,7 @@
/turf/open/floor/iron/smooth_edge,
/area/ruin/space/has_grav/derelictsulaco)
"eF" = (
-/obj/effect/decal/cleanable/blood/xtracks,
+/obj/effect/decal/cleanable/blood/tracks/xeno,
/turf/open/floor/plating/airless,
/area/ruin/space)
"eU" = (
@@ -157,7 +157,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"fI" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -312,7 +312,7 @@
},
/area/ruin/space/has_grav/derelictsulaco)
"kH" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/structure/alien/weeds,
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictsulaco)
@@ -421,14 +421,14 @@
/area/template_noop)
"mS" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva,
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva,
/obj/item/stack/sheet/mineral/sandbags{
amount = 2
},
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictsulaco)
"mU" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/obj/effect/turf_decal/tile/red/half,
/turf/open/floor/iron/smooth_edge,
/area/ruin/space/has_grav/derelictsulaco)
@@ -478,7 +478,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictsulaco)
"qx" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/pod/light,
/area/ruin/space/has_grav/derelictsulaco)
@@ -670,7 +670,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"vl" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -699,7 +699,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"wR" = (
/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -925,7 +925,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"FA" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/up,
+/obj/effect/decal/cleanable/blood/gibs/xeno/up,
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictsulaco)
"FK" = (
@@ -1015,7 +1015,7 @@
/area/ruin/space)
"Ie" = (
/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1191,7 +1191,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"MG" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/plating,
/area/ruin/space/has_grav/derelictsulaco)
"Ne" = (
@@ -1253,7 +1253,7 @@
network = list()
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood/xgibs/down,
+/obj/effect/decal/cleanable/blood/gibs/xeno/down,
/obj/machinery/computer/monitor{
dir = 1
},
@@ -1329,7 +1329,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"QR" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 5
},
/obj/item/trash/flare,
@@ -1354,7 +1354,7 @@
"RH" = (
/obj/structure/alien/weeds,
/obj/effect/decal/remains/xeno,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating/airless,
/area/ruin/space)
"RP" = (
@@ -1364,7 +1364,7 @@
/turf/template_noop,
/area/template_noop)
"RZ" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/turf/open/floor/iron/smooth,
/area/ruin/space/has_grav/derelictsulaco)
"Sj" = (
@@ -1424,7 +1424,7 @@
"Ti" = (
/obj/machinery/light/floor,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/iron/smooth,
/area/ruin/space/has_grav/derelictsulaco)
@@ -1438,7 +1438,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"TL" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1647,7 +1647,7 @@
/area/ruin/space/has_grav/derelictsulaco)
"ZA" = (
/obj/effect/mapping_helpers/broken_floor,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
diff --git a/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm b/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
index 17e9d92a2f4..b9bf82f7241 100644
--- a/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
+++ b/_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
@@ -82,7 +82,7 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"fc" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 8
},
/turf/open/misc/asteroid/basalt/airless,
@@ -353,7 +353,7 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"we" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/turf/open/misc/asteroid/basalt/airless,
@@ -536,7 +536,7 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"Jj" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/mob/living/basic/mining/ice_whelp/ash,
@@ -547,7 +547,7 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"JY" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/open/misc/asteroid/basalt/airless,
@@ -559,7 +559,7 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"Ky" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 6
},
/turf/open/misc/asteroid/basalt/airless,
@@ -719,19 +719,19 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"Qa" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 1
},
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"Qg" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 9
},
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"QQ" = (
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"QY" = (
@@ -821,7 +821,7 @@
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/unpowered/no_grav)
"Va" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/turf/open/misc/asteroid/basalt/airless,
diff --git a/_maps/RandomRuins/SpaceRuins/fasttravel.dmm b/_maps/RandomRuins/SpaceRuins/fasttravel.dmm
index 2a8a8a2226a..ca51f7525f5 100644
--- a/_maps/RandomRuins/SpaceRuins/fasttravel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/fasttravel.dmm
@@ -214,7 +214,7 @@
},
/area/ruin/space/massdriverhub)
"Fw" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/machinery/conveyor{
dir = 4;
id = "zaza"
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm
index 05da4138d0f..4f36c39e6ad 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm
@@ -411,7 +411,7 @@
desc = "It's just a wooden stick with some compressed ash on the end. At least it can write.";
name = "charcoal stick"
},
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/structure/closet/crate/trashcart,
/obj/item/food/grown/ash_flora/shavings,
/turf/open/floor/plating/dumpsterair,
@@ -912,7 +912,7 @@
pixel_y = -2
},
/obj/effect/decal/cleanable/plastic,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/decal/cleanable/glass,
/obj/effect/spawner/random/engineering/material_cheap,
/obj/item/crowbar/hammer{
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
index ae7fe201988..78410dcdb31 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
@@ -163,7 +163,7 @@
/obj/effect/decal/cleanable/fuel_pool,
/obj/item/rack_parts,
/obj/item/storage/pill_bottle/mannitol,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"qC" = (
@@ -275,7 +275,7 @@
/obj/item/food/badrecipe/moldy,
/obj/item/food/badrecipe/moldy,
/obj/structure/closet/mini_fridge/grimy,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/reagent_containers/cup/bottle/morphine,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
@@ -424,7 +424,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"IM" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/closet/crate/freezer,
/obj/item/organ/liver/roach,
/obj/item/organ/stomach,
@@ -550,7 +550,7 @@
/turf/template_noop,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"Pe" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/obj/structure/frame/computer,
/obj/item/stack/sheet/glass{
amount = 2
@@ -571,7 +571,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
"QK" = (
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/obj/item/circular_saw,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/medicalwaste)
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm
index 1bc775220c2..fc94b80d68b 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm
@@ -503,7 +503,7 @@
/area/ruin/space/has_grav/garbagetruck/squat)
"zz" = (
/obj/item/cigbutt/cigarbutt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/fuel_pool,
/obj/structure/closet/crate/trashcart,
/obj/item/storage/bag/trash,
@@ -648,7 +648,7 @@
"Hn" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/fuel_pool,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/item/pen,
/obj/item/stock_parts/subspace/analyzer,
/turf/open/floor/plating/dumpsterair,
@@ -707,7 +707,7 @@
/area/ruin/space/has_grav/garbagetruck/squat)
"JR" = (
/obj/effect/decal/cleanable/ash,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/mob/living/basic/trooper/russian,
/turf/open/floor/plating/dumpsterair,
/area/ruin/space/has_grav/garbagetruck/squat)
@@ -783,7 +783,7 @@
"Ol" = (
/obj/item/plate_shard,
/obj/effect/decal/cleanable/fuel_pool,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating/dumpsterair,
/area/ruin/space/has_grav/garbagetruck/squat)
"Pz" = (
diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm
index 35b18eff47f..00f49ef1cf1 100644
--- a/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm
+++ b/_maps/RandomRuins/SpaceRuins/garbagetruck4.dmm
@@ -201,7 +201,7 @@
/turf/closed/wall/r_wall,
/area/ruin/space/has_grav/garbagetruck/toystore)
"rc" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/flashlight/flare/torch,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/toystore)
@@ -383,7 +383,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/toystore)
"wK" = (
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/obj/item/clothing/under/costume/skeleton,
/obj/item/clothing/mask/gas/prop,
/turf/open/floor/plating,
@@ -394,15 +394,15 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/toystore)
"xd" = (
-/obj/effect/decal/cleanable/robot_debris/up,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/melee/skateboard,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/toystore)
"xf" = (
/obj/structure/door_assembly/door_assembly_wood,
/obj/effect/decal/cleanable/plastic,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating,
/area/ruin/space/has_grav/garbagetruck/toystore)
"xC" = (
@@ -844,7 +844,7 @@
/area/ruin/space/has_grav/garbagetruck/toystore)
"XL" = (
/obj/item/scooter_frame,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/decal/cleanable/garbage,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating,
diff --git a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm
index ac76b2c8ea3..b7c9cf52c7b 100644
--- a/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm
+++ b/_maps/RandomRuins/SpaceRuins/hauntedtradingpost.dmm
@@ -49,7 +49,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/hauntedtradingpost/public/corridor)
"aD" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/obj/item/assembly/igniter{
pixel_x = -7;
pixel_y = -11
@@ -160,7 +160,7 @@
/area/ruin/space/has_grav/hauntedtradingpost/office)
"bt" = (
/obj/structure/cable/layer1,
-/obj/effect/decal/cleanable/oil/streak{
+/obj/effect/decal/cleanable/blood/splatter/oil{
pixel_y = -7
},
/obj/effect/mapping_helpers/airalarm/syndicate_access,
@@ -247,7 +247,7 @@
/area/ruin/space/has_grav/hauntedtradingpost/public)
"ca" = (
/obj/structure/cable/layer1,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/machinery/camera/xray/directional/west,
/turf/open/floor/carpet/donk,
/area/ruin/space/has_grav/hauntedtradingpost/employees/breakroom)
@@ -297,7 +297,7 @@
"ct" = (
/obj/structure/table/wood,
/obj/machinery/microwave,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/structure/cable/layer1,
/obj/effect/overloader_trap{
trigger_delay = 10
@@ -675,7 +675,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/hauntedtradingpost/maint/toystorage)
"fZ" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/structure/cable/layer1,
/turf/open/floor/catwalk_floor/iron_dark,
/area/ruin/space/has_grav/hauntedtradingpost/aicore)
@@ -1265,7 +1265,7 @@
/area/ruin/space/has_grav/hauntedtradingpost/maint)
"kE" = (
/obj/structure/cable/layer1,
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/structure/sign/departments/cargo/directional/east,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4,
/obj/structure/reagent_dispensers/water_cooler,
@@ -1556,7 +1556,7 @@
/turf/open/floor/catwalk_floor/iron_dark,
/area/ruin/space/has_grav/hauntedtradingpost/employees/corridor)
"nk" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/machinery/duct,
/obj/machinery/firealarm/directional/south,
/obj/item/food/deadmouse,
@@ -1896,7 +1896,7 @@
/area/ruin/space/has_grav/hauntedtradingpost/maint/toystorage)
"qF" = (
/obj/structure/cable/layer1,
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/obj/item/ammo_casing/foam_dart{
pixel_x = 2
},
@@ -2909,7 +2909,7 @@
/area/ruin/space/has_grav/hauntedtradingpost/maint/toolstorage)
"zg" = (
/obj/structure/cable/layer1,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/catwalk_floor/iron_dark,
/area/ruin/space/has_grav/hauntedtradingpost/aicore)
"zi" = (
@@ -4029,9 +4029,9 @@
/area/ruin/space/has_grav/hauntedtradingpost/public/corridor)
"IQ" = (
/obj/structure/cable/layer1,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/mob/living/basic/mouse/rat,
-/obj/effect/decal/cleanable/oil/streak{
+/obj/effect/decal/cleanable/blood/splatter/oil{
pixel_y = -7
},
/turf/open/floor/catwalk_floor/iron_dark,
@@ -4040,7 +4040,7 @@
/obj/structure/closet/cardboard{
desc = "A typical example of the ubiquitous cardboard box. Handy if you want to store things. This box is labelled 'OUTLET 6013' and has the Donk Co. logo stamped on it."
},
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/item/trash/popcorn/salty,
/obj/item/ammo_casing/shotgun/flechette/donk{
pixel_x = 8;
@@ -4357,7 +4357,7 @@
/turf/open/floor/carpet/orange,
/area/ruin/space/has_grav/hauntedtradingpost/office/meetingroom)
"LM" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/duct,
/turf/open/floor/carpet/donk,
@@ -5402,7 +5402,7 @@
pixel_y = 8;
pixel_x = 14
},
-/obj/effect/decal/cleanable/oil/slippery{
+/obj/effect/decal/cleanable/blood/oil/slippery{
pixel_y = 6;
pixel_x = 6
},
@@ -5513,7 +5513,7 @@
/turf/open/floor/carpet/donk,
/area/ruin/space/has_grav/hauntedtradingpost/employees/workstation)
"VA" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/carpet/donk,
/area/ruin/space/has_grav/hauntedtradingpost/employees)
"VJ" = (
diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm
index da3fb83e79f..fd5196e4547 100644
--- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm
+++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm
@@ -963,11 +963,11 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/hellfactory)
"Sz" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/ruin/space/has_grav/hellfactory)
"UK" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/iron,
/area/ruin/space/has_grav/hellfactory)
"UN" = (
diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm
index 8dabc82080e..cc336e6c3fc 100644
--- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm
+++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm
@@ -1061,7 +1061,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/wood,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"zM" = (
@@ -1520,7 +1520,7 @@
dir = 8
},
/obj/structure/railing/corner,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/glass,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"IY" = (
@@ -2019,7 +2019,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/wood,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/wood,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"To" = (
diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm
index 18694d3b4a0..9565fa689c3 100644
--- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm
+++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm
@@ -203,10 +203,10 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/infested_frigate)
"cX" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/up{
+/obj/effect/decal/cleanable/blood/gibs/xeno/up{
icon_state = "xgibbl4"
},
-/obj/effect/decal/cleanable/xenoblood/xgibs/up{
+/obj/effect/decal/cleanable/blood/gibs/xeno/up{
icon_state = "xgibleg";
dir = 4
},
@@ -615,7 +615,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/infested_frigate)
"iS" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/up{
+/obj/effect/decal/cleanable/blood/gibs/xeno/up{
icon_state = "xgib1"
},
/turf/open/floor/mineral/plastitanium,
@@ -655,7 +655,7 @@
/obj/effect/turf_decal{
dir = 8
},
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/structure/fluff/broken_canister_frame,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
@@ -872,7 +872,7 @@
icon_state = "arrows_red";
dir = 4
},
-/obj/effect/decal/cleanable/oil/slippery{
+/obj/effect/decal/cleanable/blood/oil/slippery{
icon_state = "floor7"
},
/obj/effect/turf_decal{
@@ -891,7 +891,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/infested_frigate)
"oV" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/up{
+/obj/effect/decal/cleanable/blood/gibs/xeno/up{
icon_state = "xltrails_2";
dir = 8
},
@@ -1284,7 +1284,7 @@
"vM" = (
/obj/item/ammo_casing/spent,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood{
+/obj/effect/decal/cleanable/blood/xeno{
icon_state = "xltrails_1";
dir = 8
},
@@ -1353,7 +1353,7 @@
icon_state = "caution_red";
dir = 1
},
-/obj/effect/decal/cleanable/xenoblood/xgibs{
+/obj/effect/decal/cleanable/blood/gibs/xeno{
icon_state = "xltrails_1";
dir = 4
},
@@ -1576,7 +1576,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/infested_frigate)
"yG" = (
-/obj/effect/decal/cleanable/robot_debris{
+/obj/effect/decal/cleanable/blood/gibs/robot_debris{
icon_state = "gib4"
},
/obj/effect/decal/cleanable/blood/tracks{
@@ -1737,7 +1737,7 @@
dir = 8
},
/obj/item/ammo_casing/spent,
-/obj/effect/decal/cleanable/xenoblood/xgibs{
+/obj/effect/decal/cleanable/blood/gibs/xeno{
icon_state = "tracks";
dir = 1
},
@@ -1746,7 +1746,7 @@
"Bw" = (
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
-/obj/effect/decal/cleanable/xenoblood/xgibs/up{
+/obj/effect/decal/cleanable/blood/gibs/xeno/up{
icon_state = "xgibtorso";
dir = 4
},
@@ -2074,7 +2074,7 @@
/area/ruin/space/has_grav/infested_frigate)
"HA" = (
/obj/item/ammo_casing/spent,
-/obj/effect/decal/cleanable/xenoblood/xgibs/up{
+/obj/effect/decal/cleanable/blood/gibs/xeno/up{
icon_state = "xgibhead";
dir = 4
},
@@ -2145,7 +2145,7 @@
/obj/effect/turf_decal{
icon_state = "bot_red"
},
-/obj/effect/decal/cleanable/xenoblood/xgibs{
+/obj/effect/decal/cleanable/blood/gibs/xeno{
icon_state = "xgibup1"
},
/turf/open/floor/mineral/plastitanium,
@@ -2340,7 +2340,7 @@
/obj/effect/turf_decal{
dir = 8
},
-/obj/effect/decal/cleanable/xenoblood/xgibs{
+/obj/effect/decal/cleanable/blood/gibs/xeno{
icon_state = "xgibmid1"
},
/obj/effect/mapping_helpers/broken_floor,
@@ -2378,7 +2378,7 @@
/obj/effect/turf_decal{
icon_state = "bot_right_red"
},
-/obj/effect/decal/cleanable/xenoblood/xgibs{
+/obj/effect/decal/cleanable/blood/gibs/xeno{
icon_state = "xgibtorso"
},
/turf/open/floor/mineral/plastitanium,
@@ -3015,7 +3015,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/infested_frigate)
"Xm" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs{
+/obj/effect/decal/cleanable/blood/gibs/xeno{
icon_state = "xgibbl3"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
@@ -3157,7 +3157,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/infested_frigate)
"ZN" = (
-/obj/effect/decal/cleanable/robot_debris{
+/obj/effect/decal/cleanable/blood/gibs/robot_debris{
icon_state = "gibup"
},
/obj/effect/decal/cleanable/blood/gibs{
diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm
index b115c323a35..a6657902c13 100644
--- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm
+++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm
@@ -310,7 +310,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/interdyne)
"mx" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/interdyne)
"mD" = (
@@ -512,7 +512,7 @@
/area/ruin/space/has_grav/interdyne)
"vA" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/interdyne)
"vK" = (
@@ -1036,7 +1036,7 @@
/turf/open/floor/iron/smooth,
/area/ruin/space/has_grav/interdyne)
"Qw" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/interdyne)
"QC" = (
@@ -1165,7 +1165,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/interdyne)
"Un" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/interdyne)
"UN" = (
diff --git a/_maps/RandomRuins/SpaceRuins/meateor.dmm b/_maps/RandomRuins/SpaceRuins/meateor.dmm
index b9a731a08cb..b64e93ed1a2 100644
--- a/_maps/RandomRuins/SpaceRuins/meateor.dmm
+++ b/_maps/RandomRuins/SpaceRuins/meateor.dmm
@@ -36,7 +36,7 @@
/area/ruin/space/meateor)
"q" = (
/obj/effect/mob_spawn/corpse/headcrab,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/material/meat/airless,
/area/ruin/space/meateor)
"r" = (
@@ -47,7 +47,7 @@
/area/ruin/space/meateor)
"s" = (
/obj/effect/mob_spawn/corpse/headcrab,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/material/meat/airless,
/area/ruin/space/meateor)
"v" = (
diff --git a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
index 6c96a3a0a75..2591d4991e5 100644
--- a/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
+++ b/_maps/RandomRuins/SpaceRuins/mechtransport.dmm
@@ -18,7 +18,7 @@
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"dW" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
@@ -51,7 +51,7 @@
/turf/open/floor/mineral/titanium/blue/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"jI" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"jZ" = (
@@ -112,7 +112,7 @@
/turf/open/floor/mineral/titanium/blue/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"lP" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"mU" = (
@@ -215,7 +215,7 @@
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"CT" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/catwalk_floor/iron_smooth/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"DD" = (
@@ -274,7 +274,7 @@
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"Mn" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
@@ -289,7 +289,7 @@
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"Ov" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/catwalk_floor/iron_smooth/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"OJ" = (
@@ -311,7 +311,7 @@
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"Te" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
/obj/effect/turf_decal/stripes/full,
@@ -334,7 +334,7 @@
/turf/open/floor/iron/smooth_large/airless,
/area/ruin/space/has_grav/powered/mechtransport)
"WN" = (
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/obj/effect/turf_decal/stripes/full,
/obj/effect/turf_decal/stripes/red/line{
dir = 4
diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm
index fbdc62bae7a..20c84d90c1c 100644
--- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm
@@ -475,7 +475,7 @@
/turf/open/floor/plating,
/area/ruin/space/tcommsat_oldaisat)
"bT" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating/airless,
/area/ruin/space/tcommsat_oldaisat)
"bU" = (
diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm
index 494e6467666..af6bfe66965 100644
--- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm
+++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm
@@ -142,7 +142,7 @@
/turf/open/floor/circuit/red/airless,
/area/ruin/space/unpowered)
"jt" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/spawner/random/maintenance,
/turf/open/floor/mineral/plastitanium/red/airless,
/area/ruin/space/unpowered)
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 16be6f10c41..d347eef5695 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -82,7 +82,7 @@
/turf/open/floor/plating,
/area/ruin/space/ancientstation/charlie/hall)
"aF" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/alien/weeds,
/obj/structure/alien/egg/burst,
/turf/open/floor/iron/dark,
@@ -132,7 +132,7 @@
/area/ruin/space/ancientstation/charlie/bridge)
"aM" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/up,
+/obj/effect/decal/cleanable/blood/gibs/xeno/up,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
"aN" = (
@@ -250,7 +250,7 @@
/area/ruin/space/ancientstation/delta/ai)
"bp" = (
/obj/machinery/door/window/brigdoor/left/directional/west,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/alien/weeds/node,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
@@ -670,7 +670,7 @@
/turf/open/floor/iron,
/area/ruin/space/ancientstation/delta/hall)
"cY" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/alien/weeds,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
@@ -706,7 +706,7 @@
/area/ruin/space/ancientstation/charlie/bridge)
"dd" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body,
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
"de" = (
@@ -1588,7 +1588,7 @@
/area/ruin/space/ancientstation/charlie/engie)
"hh" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood/xgibs/core,
+/obj/effect/decal/cleanable/blood/gibs/xeno/core,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
},
@@ -2104,7 +2104,7 @@
/turf/open/floor/plating,
/area/ruin/space/ancientstation/charlie/storage)
"jk" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
},
@@ -2316,7 +2316,7 @@
/obj/machinery/door/airlock/highsecurity,
/obj/structure/alien/weeds,
/obj/structure/cable,
-/obj/effect/decal/cleanable/blood/xtracks,
+/obj/effect/decal/cleanable/blood/tracks/xeno,
/obj/effect/decal/cleanable/blood/tracks,
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "oldstation-aisat"
@@ -2614,7 +2614,7 @@
"lo" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small/directional/west,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 8
@@ -3220,7 +3220,7 @@
"nX" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 8
@@ -3288,13 +3288,13 @@
"oq" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body,
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body,
/turf/open/floor/iron,
/area/ruin/space/ancientstation/delta/hall)
"ou" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood/xgibs/up,
+/obj/effect/decal/cleanable/blood/gibs/xeno/up,
/turf/open/floor/iron,
/area/ruin/space/ancientstation/delta/hall)
"oy" = (
@@ -3329,7 +3329,7 @@
/turf/open/floor/iron/airless,
/area/ruin/space/ancientstation/beta/medbay)
"oD" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/core,
+/obj/effect/decal/cleanable/blood/gibs/xeno/core,
/turf/open/floor/iron/white,
/area/ruin/space/ancientstation/delta/rnd)
"oE" = (
@@ -3352,7 +3352,7 @@
/area/ruin/space/ancientstation/beta/medbay)
"oH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood/xgibs/core,
+/obj/effect/decal/cleanable/blood/gibs/xeno/core,
/turf/open/floor/iron/white,
/area/ruin/space/ancientstation/delta/rnd)
"oL" = (
@@ -3409,7 +3409,7 @@
"oU" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
-/obj/effect/decal/cleanable/xenoblood/xgibs/up,
+/obj/effect/decal/cleanable/blood/gibs/xeno/up,
/turf/open/floor/iron,
/area/ruin/space/ancientstation/delta/hall)
"oV" = (
@@ -3546,7 +3546,7 @@
},
/area/ruin/space/ancientstation/delta/rnd)
"pW" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/alien/weeds,
/obj/machinery/light/small/broken/directional/west,
/turf/open/floor/iron/dark,
@@ -3725,7 +3725,7 @@
/turf/open/floor/engine/n2,
/area/ruin/space/ancientstation/beta/atmos)
"rC" = (
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 8
},
/obj/effect/decal/cleanable/glass,
@@ -4073,7 +4073,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/item/shard,
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 6
},
/obj/effect/turf_decal/tile/purple/half/contrasted,
@@ -6226,7 +6226,7 @@
/turf/open/floor/iron,
/area/ruin/space/ancientstation/delta/hall)
"Js" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/alien/weeds,
/obj/structure/closet/crate,
/obj/item/stack/sheet/glass/fifty{
@@ -6909,7 +6909,7 @@
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/hall)
"Np" = (
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 10
},
/turf/open/floor/engine,
@@ -7002,7 +7002,7 @@
/area/ruin/space/ancientstation/beta/medbay)
"NQ" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/iron/white,
/area/ruin/space/ancientstation/delta/rnd)
"NS" = (
@@ -7103,7 +7103,7 @@
/turf/open/floor/iron,
/area/ruin/space/ancientstation/charlie/hydro)
"Om" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/ruin/space/ancientstation/charlie/hall)
@@ -7655,7 +7655,7 @@
/area/ruin/space/ancientstation/charlie/bridge)
"Sz" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body,
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -8140,7 +8140,7 @@
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/charlie/engie)
"Wd" = (
-/obj/effect/decal/cleanable/blood/xtracks{
+/obj/effect/decal/cleanable/blood/tracks/xeno{
dir = 5
},
/turf/open/floor/engine,
diff --git a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm
index ee2eb851cfd..a580fa0da1c 100644
--- a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm
+++ b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm
@@ -144,7 +144,7 @@
/area/ruin/space/prison_shuttle)
"O" = (
/obj/effect/turf_decal/tile/brown/fourcorners,
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/turf/open/floor/iron/dark/airless,
/area/ruin/space/prison_shuttle)
"P" = (
diff --git a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm
index fa97cdd8966..ad0c7241594 100644
--- a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm
+++ b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm
@@ -115,7 +115,7 @@
/turf/open/floor/iron/showroomfloor/airless,
/area/ruin/space/space_ghost_restaurant)
"vs" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/iron/showroomfloor/airless,
/area/ruin/space/space_ghost_restaurant)
"wF" = (
@@ -150,7 +150,7 @@
/turf/template_noop,
/area/template_noop)
"BA" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/decal/cleanable/glass,
/turf/open/floor/iron/cafeteria/airless,
/area/ruin/space/space_ghost_restaurant)
@@ -290,7 +290,7 @@
/turf/open/floor/iron/cafeteria/airless,
/area/ruin/space/space_ghost_restaurant)
"Xc" = (
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/turf/open/floor/iron/cafeteria/airless,
/area/ruin/space/space_ghost_restaurant)
"Xn" = (
diff --git a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm
index a358d59956e..48844fb46b2 100644
--- a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm
+++ b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm
@@ -120,7 +120,7 @@
/area/ruin/space)
"cZ" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/dark/airless,
/area/ruin/space)
"de" = (
@@ -138,7 +138,7 @@
/area/ruin/space)
"dt" = (
/obj/effect/mapping_helpers/broken_floor,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/dark/airless,
/area/ruin/space)
"eg" = (
@@ -209,7 +209,7 @@
/area/ruin/space)
"gh" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/misc/asteroid/basalt/airless,
/area/ruin/space)
"gq" = (
@@ -246,7 +246,7 @@
/turf/open/floor/mineral/plastitanium/airless,
/area/ruin/space)
"hA" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/stripes/red/full,
/turf/open/floor/iron/dark/smooth_large/airless,
/area/ruin/space)
@@ -493,7 +493,7 @@
/obj/effect/mapping_helpers/burnt_floor,
/obj/effect/mob_spawn/corpse/human/pirate/melee/space,
/obj/effect/decal/cleanable/blood,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/spawner/random/structure/chair_flipped{
dir = 1
},
@@ -706,7 +706,7 @@
/turf/open/floor/iron/dark/airless,
/area/ruin/space)
"CT" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/dark/airless,
/area/ruin/space)
"CY" = (
@@ -790,7 +790,7 @@
pixel_x = 5;
pixel_y = 2
},
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/dark/airless,
/area/ruin/space)
"FV" = (
diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
index 922715ca8d7..88502eb5933 100644
--- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
+++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm
@@ -233,7 +233,7 @@
icon_state = "dirt-0"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/oil{
+/obj/effect/decal/cleanable/blood/oil{
icon_state = "floor4"
},
/turf/open/floor/iron,
@@ -869,7 +869,7 @@
/obj/effect/decal/cleanable/dirt{
icon_state = "dirt-137"
},
-/obj/effect/decal/cleanable/oil{
+/obj/effect/decal/cleanable/blood/oil{
icon_state = "floor7"
},
/obj/machinery/light/dim/directional/south,
@@ -976,7 +976,7 @@
icon_state = "dirt-0"
},
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/ruin/space/has_grav/the_outlet/employeesection)
"ya" = (
diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm
index bbc1f67457e..73fc2b0391e 100644
--- a/_maps/RandomZLevels/SnowCabin.dmm
+++ b/_maps/RandomZLevels/SnowCabin.dmm
@@ -1281,7 +1281,7 @@
/area/awaymission/cabin/snowforest)
"gL" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/cabin)
"gM" = (
@@ -1439,7 +1439,7 @@
/area/awaymission/cabin)
"hr" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/generic,
/obj/structure/cable,
/turf/open/floor/plating,
@@ -3201,7 +3201,7 @@
/turf/open/floor/plating/snowed/snow_cabin,
/area/awaymission/cabin/snowforest/sovietsurface)
"uz" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/snow/snow_cabin,
/area/awaymission/cabin/caves)
"uF" = (
@@ -5327,7 +5327,7 @@
desc = "It looks like fancy glitter to me.";
name = "icy wind"
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/asteroid/snow/snow_cabin,
/area/awaymission/cabin/caves)
"WF" = (
diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm
index df0347e5729..4bbb319a9f7 100644
--- a/_maps/RandomZLevels/TheBeach.dmm
+++ b/_maps/RandomZLevels/TheBeach.dmm
@@ -829,7 +829,7 @@
/turf/open/floor/wood/large,
/area/awaymission/beach)
"kp" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/button/door/directional/south{
id = "BeachGarage"
},
@@ -1683,7 +1683,7 @@
/obj/vehicle/ridden/atv{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/herringbone,
/area/awaymission/beach)
"vq" = (
@@ -2175,7 +2175,7 @@
pixel_y = 4
},
/obj/item/storage/toolbox/emergency,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/herringbone,
/area/awaymission/beach)
"Cf" = (
@@ -3123,7 +3123,7 @@
/obj/item/clothing/head/soft/black,
/obj/item/clothing/head/soft/black,
/obj/item/clothing/head/soft/black,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/clothing/glasses/sunglasses,
/obj/item/clothing/glasses/heat,
/turf/open/floor/iron/dark/herringbone,
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm
index ea63bf1b7fe..f507c0be120 100644
--- a/_maps/RandomZLevels/caves.dmm
+++ b/_maps/RandomZLevels/caves.dmm
@@ -472,7 +472,7 @@
/area/awaymission/caves/bmp_asteroid/level_two)
"cN" = (
/obj/machinery/door/window/left/directional/east,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/plating,
/area/awaymission/caves/research)
"cP" = (
@@ -488,7 +488,7 @@
/turf/open/floor/plating,
/area/awaymission/caves/research)
"cV" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/plating,
/area/awaymission/caves/research)
"cX" = (
@@ -724,7 +724,7 @@
},
/area/awaymission/caves/northblock)
"eg" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/floor/iron,
/area/awaymission/caves/listeningpost)
"eh" = (
@@ -845,7 +845,7 @@
/turf/open/floor/iron,
/area/awaymission/caves/listeningpost)
"eN" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/awaymission/caves/listeningpost)
"eO" = (
@@ -1749,7 +1749,7 @@
/area/awaymission/caves/bmp_asteroid/level_three)
"JP" = (
/obj/structure/window/reinforced/spawner/directional/east,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating,
/area/awaymission/caves/research)
"Kq" = (
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 5b0bbb0c733..67b5f85ea8f 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -419,7 +419,7 @@
/area/awaymission/moonoutpost19/mines)
"cT" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/effect/turf_decal/siding/thinplating_new/light,
/turf/open/floor/iron,
/area/awaymission/moonoutpost19/arrivals)
@@ -1067,7 +1067,7 @@
},
/area/awaymission/moonoutpost19/mines)
"hm" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
@@ -1664,7 +1664,7 @@
},
/area/awaymission/moonoutpost19/main)
"lp" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
@@ -2161,7 +2161,7 @@
/turf/open/floor/plating,
/area/awaymission/moonoutpost19/arrivals)
"od" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body,
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body,
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
@@ -4724,8 +4724,8 @@
},
/area/awaymission/moonoutpost19/arrivals)
"Ft" = (
-/obj/effect/decal/cleanable/robot_debris,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/storage/medkit/regular{
empty = 1;
name = "First-Aid (empty)"
@@ -5633,7 +5633,7 @@
/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
"LW" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/effect/decal/remains/xeno{
desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated."
},
@@ -5782,7 +5782,7 @@
/turf/open/floor/iron,
/area/awaymission/moonoutpost19/research)
"Nm" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/moonoutpost19/arrivals)
"No" = (
@@ -5841,7 +5841,7 @@
desc = "Remains of the historical mech that first touched down on Moon Outpost 19. Completely irreparable, but perhaps something can be salvaged.";
name = "\improper Historical Ripley MK-II wreckage"
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/food/grown/moonflower{
pixel_x = 7;
pixel_y = -18
@@ -6214,7 +6214,7 @@
},
/area/awaymission/moonoutpost19/main)
"Pu" = (
-/obj/effect/decal/cleanable/xenoblood{
+/obj/effect/decal/cleanable/blood/xeno{
desc = "It's green and acidic. Nothing good could come of this..."
},
/obj/structure/fluff/meteor/large,
@@ -7174,7 +7174,7 @@
},
/area/awaymission/moonoutpost19/main)
"VW" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/duct,
/turf/open/floor/plating,
/area/awaymission/moonoutpost19/arrivals)
@@ -7381,7 +7381,7 @@
/turf/open/floor/iron/white,
/area/awaymission/moonoutpost19/research)
"Xr" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/turf/open/floor/plating,
/area/awaymission/moonoutpost19/research)
@@ -7433,7 +7433,7 @@
},
/area/awaymission/moonoutpost19/arrivals)
"XN" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/limb,
+/obj/effect/decal/cleanable/blood/gibs/xeno/limb,
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
diff --git a/_maps/RandomZLevels/museum.dmm b/_maps/RandomZLevels/museum.dmm
index 113fe2b6987..482652c6734 100644
--- a/_maps/RandomZLevels/museum.dmm
+++ b/_maps/RandomZLevels/museum.dmm
@@ -3910,7 +3910,7 @@
"Fw" = (
/obj/effect/decal/cleanable/blood/tracks{
name = "replica blood";
- should_dry = 0
+ can_dry = 0
},
/obj/effect/mapping_helpers/burnt_floor,
/obj/effect/decal/cleanable/dirt/dust,
@@ -5541,7 +5541,7 @@
"UH" = (
/obj/structure/mirror/broken/directional/east,
/obj/structure/sink/directional/west,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/white/small,
/area/awaymission/museum)
"UI" = (
diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm
index d9fe59325e4..9ef900b3e01 100644
--- a/_maps/RandomZLevels/snowdin.dmm
+++ b/_maps/RandomZLevels/snowdin.dmm
@@ -2819,7 +2819,7 @@
/turf/open/floor/iron,
/area/awaymission/snowdin/post/garage)
"kl" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/garage)
"km" = (
@@ -3029,7 +3029,7 @@
/area/awaymission/snowdin/post/garage)
"lc" = (
/obj/vehicle/ridden/atv,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/garage)
"ld" = (
@@ -6616,7 +6616,7 @@
/turf/open/floor/plating,
/area/awaymission/snowdin/post/mining_dock)
"zy" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/minipost)
"zz" = (
@@ -8254,7 +8254,7 @@
/turf/open/floor/iron,
/area/awaymission/snowdin/post/mining_main/mechbay)
"Hd" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/awaymission/snowdin/post/mining_main/mechbay)
"He" = (
@@ -8332,7 +8332,7 @@
/turf/open/floor/iron,
/area/awaymission/snowdin/post/mining_main/mechbay)
"HA" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/mining_main/mechbay)
"HB" = (
@@ -8397,7 +8397,7 @@
/area/awaymission/snowdin/post/mining_main/mechbay)
"HP" = (
/obj/effect/turf_decal/stripes/line,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/awaymission/snowdin/post/mining_main/mechbay)
"HQ" = (
@@ -8519,7 +8519,7 @@
/obj/vehicle/ridden/atv{
dir = 1
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/mining_main)
"Iy" = (
@@ -8579,7 +8579,7 @@
/turf/open/floor/plating,
/area/awaymission/snowdin/post/mining_main)
"II" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/awaymission/snowdin/post/mining_main)
diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm
index bb612f1c84b..b9623993cef 100644
--- a/_maps/map_files/Birdshot/birdshot.dmm
+++ b/_maps/map_files/Birdshot/birdshot.dmm
@@ -17529,7 +17529,7 @@
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
"ggn" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/byteforge,
/obj/effect/turf_decal/box,
/turf/open/floor/iron/dark/smooth_large,
@@ -29104,7 +29104,7 @@
/turf/open/floor/iron/cafeteria,
/area/station/science/circuits)
"jJW" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/item/stack/sheet/cardboard,
/turf/open/floor/iron,
/area/station/maintenance/department/engine/atmos)
@@ -36361,7 +36361,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/structure/broken_flooring/singular/directional/south,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/item/crowbar,
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
index f83d88f8bdb..1f626e54208 100644
--- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
+++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
@@ -2787,7 +2787,7 @@
/area/station/maintenance/disposal/incinerator)
"aUC" = (
/obj/effect/decal/cleanable/glitter,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/spawner/random/maintenance/two,
/obj/structure/rack,
/turf/open/floor/plating,
@@ -5057,7 +5057,7 @@
/turf/open/floor/carpet,
/area/station/service/janitor)
"bCl" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
"bCv" = (
@@ -15336,7 +15336,7 @@
/area/space/nearstation)
"eCz" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"eCD" = (
@@ -16356,7 +16356,7 @@
/turf/open/floor/iron/dark/textured,
/area/station/science/xenobiology)
"eUg" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/dark/smooth_large,
/area/station/maintenance/port)
"eUh" = (
@@ -17331,7 +17331,7 @@
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"fkv" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/iron/dark,
/area/station/engineering/engine_smes)
"fkw" = (
@@ -31819,7 +31819,7 @@
/turf/open/floor/glass,
/area/station/commons/fitness/recreation)
"jvU" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/service/abandoned_gambling_den)
"jvX" = (
@@ -32273,7 +32273,7 @@
"jAX" = (
/obj/vehicle/sealed/mecha/ripley/paddy/preset,
/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/iron/small,
@@ -33190,7 +33190,7 @@
/area/station/hallway/primary/central)
"jOq" = (
/obj/effect/spawner/random/maintenance,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"jOE" = (
@@ -33344,7 +33344,7 @@
/area/station/security/brig)
"jRj" = (
/obj/structure/sign/poster/random/directional/north,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/obj/machinery/camera/autoname/directional/north,
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
@@ -33629,7 +33629,7 @@
/area/station/science/xenobiology)
"jWc" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/aft)
"jWg" = (
@@ -35071,7 +35071,7 @@
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
"ksx" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/textured_edge{
dir = 8
},
@@ -36782,7 +36782,7 @@
"kVm" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/cigbutt{
pixel_x = 8;
pixel_y = -2
@@ -37448,7 +37448,7 @@
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
"leY" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
@@ -38495,7 +38495,7 @@
/obj/structure/railing{
dir = 1
},
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -41316,7 +41316,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/upper)
"mlG" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
"mlL" = (
@@ -45071,8 +45071,8 @@
/turf/open/floor/wood,
/area/station/ai_monitored/command/storage/eva)
"nuF" = (
-/obj/effect/decal/cleanable/oil,
/obj/structure/closet/crate/trashcart/filled,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/very_dim/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
@@ -49416,7 +49416,7 @@
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/ai_monitored/turret_protected/ai)
"oKc" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
@@ -50284,7 +50284,7 @@
"oVZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/cigbutt{
pixel_x = -12;
pixel_y = 11
@@ -50402,7 +50402,7 @@
/obj/machinery/computer/slot_machine{
pixel_y = 2
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"oYn" = (
@@ -57394,7 +57394,7 @@
/obj/machinery/recycler{
dir = 8
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
"rhx" = (
@@ -59114,7 +59114,7 @@
/area/station/maintenance/starboard/aft)
"rFs" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/construction/storage_wing)
@@ -59360,7 +59360,7 @@
name = "forgotten exosuit fabricator"
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"rIZ" = (
@@ -60938,7 +60938,7 @@
output_dir = 1
},
/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
"shR" = (
@@ -62128,7 +62128,7 @@
},
/area/station/service/library)
"sCg" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
"sCv" = (
@@ -63673,7 +63673,7 @@
"taZ" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"tbf" = (
@@ -64738,7 +64738,7 @@
"tts" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/maintenance,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"ttx" = (
@@ -65998,7 +65998,7 @@
pixel_y = -2
},
/obj/item/stack/cable_coil,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark/smooth_large,
/area/station/ai_monitored/turret_protected/ai_upload)
@@ -75613,7 +75613,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron/small,
/area/station/security/mechbay)
@@ -78332,7 +78332,7 @@
name = "Mr Johnson"
},
/obj/structure/spider/stickyweb,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
"xtC" = (
@@ -80603,7 +80603,7 @@
/turf/open/floor/iron,
/area/station/command/heads_quarters/qm)
"ycp" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/dark/smooth_large,
/area/station/ai_monitored/turret_protected/ai_upload)
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index fa4d824418f..92e91471017 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -1179,7 +1179,7 @@
/obj/item/exodrone,
/obj/machinery/exodrone_launcher,
/obj/effect/turf_decal/box,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/plating,
/area/station/cargo/drone_bay)
@@ -1247,7 +1247,7 @@
/area/station/security/checkpoint/supply)
"ape" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -1372,7 +1372,7 @@
/area/station/service/chapel)
"aqE" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/spawner/random/structure/crate,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
@@ -2288,7 +2288,7 @@
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
"aBy" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/turf/open/floor/iron,
/area/station/maintenance/department/security)
@@ -2580,7 +2580,7 @@
/area/station/command/teleporter)
"aFH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/bot,
/obj/machinery/light/small/directional/south,
/turf/open/floor/iron,
@@ -4134,7 +4134,7 @@
},
/area/station/service/chapel)
"aYR" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/cargo/office)
@@ -9482,7 +9482,7 @@
/obj/machinery/light/small/directional/north,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -10195,7 +10195,7 @@
/area/station/engineering/supermatter/room)
"cwt" = (
/obj/structure/disposalpipe/segment,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/cargo/storage)
@@ -10964,7 +10964,7 @@
/area/station/maintenance/department/engine/atmos)
"cFs" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/brown/half/contrasted{
dir = 1
},
@@ -12412,7 +12412,7 @@
/turf/open/floor/iron/dark,
/area/station/service/chapel/storage)
"cYT" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/maintenance/port)
@@ -13353,8 +13353,8 @@
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"dlo" = (
-/obj/effect/decal/cleanable/robot_debris/down,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/department/science)
"dlp" = (
@@ -15228,7 +15228,7 @@
/turf/open/floor/iron,
/area/station/maintenance/starboard/aft)
"dKx" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/maintenance/department/crew_quarters/bar)
"dKC" = (
@@ -27822,7 +27822,7 @@
/area/station/hallway/secondary/exit/departure_lounge)
"gQh" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/engineering/storage)
@@ -28061,7 +28061,7 @@
/turf/open/floor/engine/vacuum,
/area/station/science/ordnance/burnchamber)
"gTq" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/obj/effect/spawner/random/engineering/tank,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -28211,7 +28211,7 @@
/area/station/science/circuits)
"gUE" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/science/robotics/mechbay)
@@ -32853,7 +32853,7 @@
/turf/open/floor/iron/white,
/area/station/medical/virology)
"iga" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
@@ -37522,7 +37522,7 @@
/area/station/engineering/atmos/pumproom)
"joa" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/science/research/abandoned)
@@ -39467,7 +39467,7 @@
/turf/open/floor/iron,
/area/station/commons/storage/primary)
"jMM" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
"jMQ" = (
@@ -40995,7 +40995,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/engineering/atmos/hfr_room)
"kfQ" = (
@@ -41714,7 +41714,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
@@ -43335,7 +43335,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/checker,
/area/station/engineering/supermatter/room)
@@ -43876,7 +43876,7 @@
/turf/closed/wall/r_wall,
/area/station/engineering/gravity_generator)
"kUg" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -44022,7 +44022,7 @@
/turf/closed/wall,
/area/station/hallway/secondary/service)
"kVT" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/port)
"kVZ" = (
@@ -47540,7 +47540,7 @@
"lNc" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
"lNd" = (
@@ -48137,7 +48137,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/science/research/abandoned)
@@ -49968,7 +49968,7 @@
/area/station/medical/pharmacy)
"mwA" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/science/xenobiology)
"mwK" = (
@@ -51758,7 +51758,7 @@
/turf/open/floor/iron/dark,
/area/station/service/abandoned_gambling_den)
"mSY" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/structure/table,
/obj/item/storage/toolbox/mechanical{
pixel_y = 7
@@ -53208,7 +53208,7 @@
/turf/open/floor/iron/white,
/area/station/security/prison/toilet)
"nnZ" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -55269,7 +55269,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
"nPa" = (
@@ -59087,7 +59087,7 @@
"oQw" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
"oQJ" = (
@@ -59421,7 +59421,7 @@
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/broken_floor,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/structure/curtain/bounty{
pixel_y = 32
},
@@ -59830,7 +59830,7 @@
/area/station/hallway/primary/fore)
"pbn" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
@@ -60822,7 +60822,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/airalarm/directional/north,
@@ -61657,7 +61657,7 @@
/turf/open/floor/plating,
/area/station/maintenance/fore)
"pyd" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
@@ -64347,7 +64347,7 @@
/turf/open/floor/iron/white,
/area/station/science/research)
"qbj" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
@@ -64890,7 +64890,7 @@
"qje" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
},
@@ -67283,7 +67283,7 @@
/turf/closed/wall,
/area/station/commons/fitness/recreation)
"qOr" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/science)
@@ -67889,7 +67889,7 @@
/area/station/science/lab)
"qYn" = (
/obj/effect/turf_decal/stripes/line,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/science/research/abandoned)
"qYo" = (
@@ -69641,7 +69641,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
"rvu" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/engineering/tracking_beacon,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -71195,7 +71195,7 @@
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
"rOU" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/reflector/single,
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/burnt_floor,
@@ -71879,7 +71879,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/cargo/sorting)
"rWo" = (
@@ -72644,7 +72644,7 @@
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
"sfE" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/engine/xenobio,
/area/station/science/xenobiology)
"sfH" = (
@@ -74234,7 +74234,7 @@
/area/station/service/barber)
"sAi" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/structure/sign/warning/xeno_mining/directional/north,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/iron/smooth,
@@ -76359,7 +76359,7 @@
"tcd" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/bot,
/obj/machinery/mineral/stacking_unit_console{
pixel_x = 32
@@ -80893,7 +80893,7 @@
/turf/open/floor/iron,
/area/station/security/checkpoint/escape)
"ujT" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -80998,7 +80998,7 @@
/turf/open/floor/plating,
/area/station/engineering/transit_tube)
"ulE" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/event_spawn,
/turf/open/floor/engine,
@@ -84046,7 +84046,7 @@
/area/station/command/bridge)
"uWm" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/structure/sign/warning/xeno_mining/directional/south,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/science/xenobiology)
@@ -85839,7 +85839,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/camera/directional/north{
c_tag = "Engineering - Freezers";
name = "engineering camera";
@@ -87988,7 +87988,7 @@
/area/station/maintenance/department/medical/morgue)
"vWQ" = (
/obj/machinery/netpod,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/sign/poster/contraband/random/directional/south,
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/cargo/bitrunning/den)
@@ -88536,7 +88536,7 @@
/turf/open/floor/iron/white,
/area/station/science/research)
"weM" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/broken/directional/north,
/obj/effect/turf_decal/tile/neutral/half{
dir = 1
@@ -89835,7 +89835,7 @@
/area/station/ai_monitored/security/armory)
"wtH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"wtS" = (
@@ -91840,7 +91840,7 @@
dir = 8
},
/obj/item/radio/intercom/directional/south,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
},
@@ -94958,7 +94958,7 @@
},
/obj/item/radio/intercom/directional/south,
/obj/machinery/power/apc/auto_name/directional/east,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/engineering/atmos/hfr_room)
"xHx" = (
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 305b12ac07b..3b888765e12 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -6159,7 +6159,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
"bGm" = (
@@ -6443,7 +6443,7 @@
/area/station/service/library)
"bJX" = (
/obj/effect/decal/cleanable/generic,
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/turf/open/floor/iron/checker,
/area/station/maintenance/port/fore)
"bKp" = (
@@ -17372,7 +17372,7 @@
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/north,
/obj/machinery/quantum_server,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/iron/dark/smooth_corner{
dir = 4
},
@@ -18183,7 +18183,7 @@
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
"fcI" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
@@ -25509,7 +25509,7 @@
/area/station/commons/dorms/laundry)
"hkQ" = (
/obj/structure/table/optable,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
"hkS" = (
@@ -31772,7 +31772,7 @@
/area/station/security/prison)
"jaX" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
@@ -33153,7 +33153,7 @@
/obj/effect/turf_decal/tile/brown{
dir = 1
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark,
/area/station/maintenance/disposal)
"jwF" = (
@@ -36428,7 +36428,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/fore)
"ksb" = (
@@ -39901,7 +39901,7 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
"lqL" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
"lqM" = (
@@ -58567,7 +58567,7 @@
/turf/open/floor/iron/cafeteria,
/area/mine/laborcamp)
"qDF" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/chapel)
"qDG" = (
@@ -60630,7 +60630,7 @@
dir = 8
},
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/wrench,
/obj/effect/turf_decal/tile/dark{
dir = 8
@@ -61652,7 +61652,7 @@
/area/station/maintenance/department/chapel)
"rtq" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/checker,
/area/station/maintenance/port/fore)
@@ -62195,7 +62195,7 @@
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
"rCB" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -65003,7 +65003,7 @@
/obj/machinery/airalarm/directional/west,
/obj/effect/landmark/start/bitrunner,
/obj/machinery/light/small/directional/south,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/iron/dark/textured_large,
/area/station/cargo/bitrunning/den)
"srP" = (
@@ -65301,7 +65301,7 @@
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
"svy" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/stack/ore/glass,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -68594,7 +68594,7 @@
/area/station/hallway/secondary/exit/departure_lounge)
"tsR" = (
/obj/structure/chair/stool/directional/south,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating,
/area/station/maintenance/department/electrical)
"ttb" = (
@@ -78617,7 +78617,7 @@
dir = 1
},
/obj/machinery/holopad,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/textured_large,
/area/station/cargo/bitrunning/den)
"wuA" = (
@@ -80529,7 +80529,7 @@
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
"wWc" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/structure/tank_holder,
/turf/open/floor/plating,
@@ -82343,7 +82343,7 @@
"xwq" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
"xwr" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 6a8dc34839d..6601f98e0db 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -11788,7 +11788,7 @@
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"eks" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light_switch/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
@@ -14434,7 +14434,7 @@
/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/blood/gibs/down,
/mob/living/simple_animal/bot/mulebot{
name = "Leaping Rabbit"
@@ -16607,7 +16607,7 @@
/area/station/security/prison)
"fXZ" = (
/obj/effect/turf_decal/delivery,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/turf_decal/trimline/brown/filled/arrow_cw,
/turf/open/floor/iron,
/area/station/cargo/storage)
@@ -18763,7 +18763,7 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"gLm" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/spawner/random/engineering/tank,
/obj/machinery/light/small/dim/directional/west,
/turf/open/floor/plating,
@@ -21154,7 +21154,7 @@
/turf/open/floor/iron,
/area/station/hallway/primary/port)
"hCK" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/siding/purple{
dir = 1
},
@@ -23528,7 +23528,7 @@
/turf/open/floor/iron/cafeteria,
/area/station/service/kitchen)
"itn" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/engine,
/area/station/science/explab)
"itp" = (
@@ -45468,7 +45468,7 @@
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai)
"qeZ" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/command/corporate_showroom)
@@ -46149,7 +46149,7 @@
/turf/open/floor/carpet,
/area/station/command/heads_quarters/captain/private)
"qrL" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/dark/smooth_large,
@@ -52840,7 +52840,7 @@
/area/station/engineering/main)
"sHX" = (
/obj/effect/turf_decal/tile/brown/opposingcorners,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/sorting)
@@ -53552,7 +53552,7 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"sTU" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/maintenance,
/obj/effect/turf_decal/bot_white,
@@ -59269,7 +59269,7 @@
"uSh" = (
/obj/item/stack/sheet/iron/five,
/obj/item/stack/cable_coil/five,
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/obj/effect/turf_decal/box,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
@@ -59919,7 +59919,7 @@
"vdg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/netpod,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/cable,
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/cargo/bitrunning/den)
@@ -61704,7 +61704,7 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"vHa" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
"vHs" = (
@@ -64109,7 +64109,7 @@
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/item/chair/wood,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"wwW" = (
@@ -67925,7 +67925,7 @@
/area/station/engineering/atmos/pumproom)
"xSc" = (
/obj/structure/frame/machine/secured,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/turf_decal/box,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
@@ -68259,7 +68259,7 @@
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/captain/private)
"xXR" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/railing/corner/end{
dir = 8
},
diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm
index 1b1de275d48..c91976bafe3 100644
--- a/_maps/map_files/NebulaStation/NebulaStation.dmm
+++ b/_maps/map_files/NebulaStation/NebulaStation.dmm
@@ -28277,7 +28277,7 @@
pixel_x = -8;
pixel_y = 5
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
@@ -28378,7 +28378,7 @@
/turf/open/space/openspace,
/area/space/nearstation)
"ejI" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -51023,7 +51023,7 @@
/turf/open/floor/iron/dark/textured,
/area/station/command)
"hCg" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/cigbutt/cigarbutt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/effect/turf_decal/trimline/dark,
@@ -65688,7 +65688,7 @@
/turf/open/floor/iron/dark/textured_half,
/area/station/science/ordnance)
"jLi" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/mapping_helpers/broken_floor,
/obj/structure/sign/warning/electric_shock/directional/east,
/turf/open/floor/iron,
@@ -72897,7 +72897,7 @@
/area/station/security/brig)
"kJJ" = (
/obj/structure/rack,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/bot_white,
/obj/item/clothing/suit/hazardvest,
/obj/item/clothing/suit/hazardvest,
@@ -110516,7 +110516,7 @@
},
/area/station/command)
"qqh" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -113776,7 +113776,7 @@
/turf/open/floor/wood/tile,
/area/station/service/barber)
"qOD" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth,
/area/station/maintenance/port/central)
"qOE" = (
@@ -114606,7 +114606,7 @@
/turf/open/floor/iron,
/area/station/cargo/storage)
"qWH" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/carpet/red,
/area/station/maintenance/starboard/central)
"qWR" = (
@@ -121075,7 +121075,7 @@
/turf/open/floor/iron/white,
/area/station/science/lower)
"rUO" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/engine/hull/reinforced,
/area/space/nearstation)
"rUT" = (
@@ -129712,7 +129712,7 @@
/turf/open/floor/carpet/royalblue,
/area/station/command/corporate_suite)
"tmg" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/cigbutt/cigarbutt,
/turf/open/floor/engine/hull/reinforced,
/area/space/nearstation)
@@ -137031,7 +137031,7 @@
/turf/open/floor/iron/white,
/area/station/medical/lower)
"urz" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/port/central)
"urH" = (
@@ -149936,7 +149936,7 @@
"wmi" = (
/obj/structure/rack,
/obj/item/storage/toolbox/emergency,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/screwdriver,
/obj/effect/turf_decal/bot_white,
/turf/open/floor/iron/dark/textured_large,
@@ -153604,7 +153604,7 @@
dir = 1
},
/obj/structure/sign/departments/science/directional/south,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/textured_large,
/area/station/maintenance/fore/lesser)
"wQd" = (
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 9408693271c..af1ff676467 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -4945,7 +4945,7 @@
dir = 6
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/smooth_large,
/area/centcom/central_command_areas/evacuation/ship)
@@ -5564,7 +5564,7 @@
dir = 1
},
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/smooth_large,
/area/centcom/central_command_areas/evacuation/ship)
"zb" = (
@@ -6103,7 +6103,7 @@
"Bm" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/item/weldingtool/experimental,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
diff --git a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm
index 670386ca829..cdcf962c3c2 100644
--- a/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/atmoscilower_attachment_a_3.dmm
@@ -105,7 +105,7 @@
"y" = (
/obj/effect/decal/cleanable/dirt,
/obj/vehicle/sealed/mecha/ripley,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
"A" = (
@@ -176,7 +176,7 @@
/area/station/maintenance/starboard/lesser)
"Q" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/stock_parts/power_store/cell/empty,
/obj/item/screwdriver{
pixel_y = -10;
diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm
index 4e78a2717af..30be136452c 100644
--- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_1.dmm
@@ -104,7 +104,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
/area/station/maintenance/starboard/central)
@@ -282,7 +282,7 @@
/area/station/maintenance/starboard/central)
"uB" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/mineral/titanium/blue,
/area/station/maintenance/starboard/central)
"vk" = (
@@ -399,7 +399,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/station/maintenance/starboard/central)
"JD" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm
index 53d727123ce..18e7138664c 100644
--- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_3.dmm
@@ -56,7 +56,7 @@
/turf/open/floor/iron,
/area/station/maintenance/starboard/central)
"fv" = (
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/loading_area{
dir = 8
@@ -374,7 +374,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/starboard/central)
@@ -449,7 +449,7 @@
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 1
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_1.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_1.dmm
index f58d6cd2a20..23efbb97bf1 100644
--- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_1.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_a_1.dmm
@@ -4,7 +4,7 @@
/area/template_noop)
"e" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/item/wrench,
/turf/open/floor/plating,
/area/station/maintenance/department/science)
@@ -17,7 +17,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/structure/mecha_wreckage/ripley/mk2,
/obj/effect/turf_decal/bot,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/station/maintenance/department/science)
"l" = (
diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm
index 0dbec6e9baf..6c18e97d137 100644
--- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_1.dmm
@@ -302,7 +302,7 @@
"Pa" = (
/obj/effect/turf_decal/sand/plating,
/obj/effect/spawner/random{
- loot = list(/obj/effect/decal/cleanable/oil/slippery=10,/obj/effect/decal/cleanable/oil=90);
+ loot = list(/obj/effect/decal/cleanable/blood/oil/slippery=10,/obj/effect/decal/cleanable/blood/oil=90);
name = "funny slipper :)"
},
/turf/open/floor/plating,
diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm
index 11e0cd730ca..6b0093caccd 100644
--- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_2.dmm
@@ -335,7 +335,7 @@
},
/obj/effect/turf_decal/trimline/yellow/warning,
/obj/effect/spawner/random{
- loot = list(/obj/effect/decal/cleanable/oil/slippery=10,/obj/effect/decal/cleanable/oil=90);
+ loot = list(/obj/effect/decal/cleanable/blood/oil/slippery=10,/obj/effect/decal/cleanable/blood/oil=90);
name = "funny slipper :)"
},
/turf/open/floor/iron/smooth,
diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm
index a4fa633f0f9..9291070132b 100644
--- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm
+++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_3.dmm
@@ -456,7 +456,7 @@
"Vn" = (
/obj/effect/turf_decal/sand/plating,
/obj/effect/spawner/random{
- loot = list(/obj/effect/decal/cleanable/oil/slippery=10,/obj/effect/decal/cleanable/oil=90);
+ loot = list(/obj/effect/decal/cleanable/blood/oil/slippery=10,/obj/effect/decal/cleanable/blood/oil=90);
name = "funny slipper :)"
},
/turf/open/floor/plating,
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 950d173846c..170b721a26b 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -3046,7 +3046,7 @@
/obj/effect/turf_decal/trimline/yellow/warning{
dir = 8
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/clothing/glasses/welding,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -11143,7 +11143,7 @@
name = "inactive propulsion engine";
desc = "A standard reliable bluespace engine used by many forms of shuttles. This one has the bluespace core removed."
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
},
@@ -26251,7 +26251,7 @@
/area/station/asteroid)
"itH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/smooth,
/area/station/security/mechbay)
@@ -35048,7 +35048,7 @@
/obj/effect/turf_decal/tile/neutral/tram,
/obj/effect/spawner/random{
name = "funny slipper :)";
- loot = list(/obj/effect/decal/cleanable/oil/slippery=10, /obj/effect/decal/cleanable/oil=90)
+ loot = list(/obj/effect/decal/cleanable/blood/oil/slippery=10, /obj/effect/decal/cleanable/blood/oil=90)
},
/turf/open/floor/tram/plate,
/area/station/hallway/primary/tram/left)
@@ -36684,7 +36684,7 @@
dir = 1
},
/obj/structure/extinguisher_cabinet/directional/west,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/landmark/start/bitrunner,
/obj/machinery/camera/autoname/directional/west,
/turf/open/floor/iron/dark/textured_large,
@@ -37534,7 +37534,7 @@
/area/station/science/lobby)
"mez" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/iron/smooth,
/area/station/security/mechbay)
@@ -41598,7 +41598,7 @@
/area/station/hallway/secondary/service)
"nDY" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/smooth,
/area/station/maintenance/port/central)
"nEc" = (
@@ -45282,7 +45282,7 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"pbw" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/structure/sign/poster/random/directional/north,
/obj/machinery/power/apc/auto_name/directional/west,
/obj/structure/cable,
@@ -59698,7 +59698,7 @@
/obj/effect/turf_decal/tile/neutral/tram,
/obj/effect/spawner/random{
name = "funny slipper :)";
- loot = list(/obj/effect/decal/cleanable/oil/slippery=10, /obj/effect/decal/cleanable/oil=90)
+ loot = list(/obj/effect/decal/cleanable/blood/oil/slippery=10, /obj/effect/decal/cleanable/blood/oil=90)
},
/turf/open/floor/tram/plate,
/area/station/hallway/primary/tram/right)
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index 541ad5d0958..310e6a5f28b 100644
--- a/_maps/map_files/wawastation/wawastation.dmm
+++ b/_maps/map_files/wawastation/wawastation.dmm
@@ -4089,7 +4089,7 @@
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"bvJ" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/spawner/random/entertainment/arcade{
@@ -11431,7 +11431,7 @@
name = "AI Antechamber turret control";
pixel_y = -27
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/dark,
@@ -17217,7 +17217,7 @@
/area/station/medical/virology)
"gcD" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/item/flashlight/lamp,
/turf/open/floor/iron,
/area/station/cargo/warehouse/upper)
@@ -22950,7 +22950,7 @@
/area/station/medical/virology)
"hZO" = (
/obj/structure/table,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/clothing/head/costume/cardborg,
@@ -34429,7 +34429,7 @@
/area/station/engineering/atmospherics_engine)
"lXJ" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/aisat/uppernorth)
@@ -35593,7 +35593,7 @@
/area/station/security/brig)
"msE" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/camera/autoname/directional/south,
/turf/open/floor/iron,
/area/station/cargo/warehouse/upper)
@@ -48182,7 +48182,7 @@
/turf/open/floor/wood,
/area/station/service/library)
"qNU" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/small/directional/west,
/turf/open/floor/plating,
/area/station/maintenance/port/lesser)
@@ -58256,7 +58256,7 @@
/area/station/cargo/storage)
"udf" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
@@ -60292,7 +60292,7 @@
/turf/open/floor/iron,
/area/station/commons/storage/primary)
"uNK" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/tracks,
/turf/open/floor/plating,
@@ -61918,7 +61918,7 @@
/turf/open/floor/wood/parquet,
/area/station/medical/psychology)
"vvn" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/small/directional/west,
/obj/structure/disposalpipe/segment{
dir = 9
@@ -63602,7 +63602,7 @@
/turf/open/floor/iron/white,
/area/station/medical/chemistry/minisat)
"vZj" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
/obj/item/reagent_containers/spray/cleaner,
diff --git a/_maps/minigame/CTF/downtown.dmm b/_maps/minigame/CTF/downtown.dmm
index fd11025e943..94377fd404c 100644
--- a/_maps/minigame/CTF/downtown.dmm
+++ b/_maps/minigame/CTF/downtown.dmm
@@ -73,7 +73,7 @@
/turf/open/floor/wood,
/area/centcom/ctf)
"bA" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
dir = 4;
mouse_opacity = 0;
@@ -220,7 +220,7 @@
/area/centcom/ctf)
"ff" = (
/obj/effect/turf_decal/siding/white,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/barricade/sandbags{
resistance_flags = 64
},
@@ -354,7 +354,7 @@
/area/centcom/ctf)
"hF" = (
/obj/effect/turf_decal/siding/yellow,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark,
/area/centcom/ctf)
"hK" = (
@@ -1016,7 +1016,7 @@
/turf/open/floor/wood,
/area/centcom/ctf)
"xD" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/barricade/security/ctf,
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
dir = 4;
@@ -1038,7 +1038,7 @@
/area/centcom/ctf)
"yp" = (
/obj/effect/turf_decal/siding/yellow,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/barricade/security/ctf,
/turf/open/floor/iron/dark,
/area/centcom/ctf)
@@ -1687,7 +1687,7 @@
/area/centcom/ctf)
"KV" = (
/obj/effect/turf_decal/siding/white,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark,
/area/centcom/ctf)
"Ll" = (
@@ -1812,7 +1812,7 @@
/turf/open/floor/iron,
/area/centcom/ctf)
"Oc" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/centcom/ctf)
"Oe" = (
@@ -1911,7 +1911,7 @@
/turf/open/floor/iron,
/area/centcom/ctf)
"Qw" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark,
/area/centcom/ctf)
"QC" = (
diff --git a/_maps/minigame/basketball/greytide_worldwide.dmm b/_maps/minigame/basketball/greytide_worldwide.dmm
index 6711c66743d..3c9ce6ad692 100644
--- a/_maps/minigame/basketball/greytide_worldwide.dmm
+++ b/_maps/minigame/basketball/greytide_worldwide.dmm
@@ -177,7 +177,7 @@
/area/centcom/basketball)
"ku" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/spawner/random/structure/chair_maintenance{
dir = 1
},
@@ -419,7 +419,7 @@
/turf/closed/indestructible/fakeglass,
/area/centcom/basketball)
"CD" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/centcom/basketball)
"De" = (
@@ -482,7 +482,7 @@
/area/centcom/basketball)
"HH" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/centcom/basketball)
"Ic" = (
diff --git a/_maps/minigame/basketball/lusty_xenomorphs.dmm b/_maps/minigame/basketball/lusty_xenomorphs.dmm
index f3550c0c15f..498de4c8e86 100644
--- a/_maps/minigame/basketball/lusty_xenomorphs.dmm
+++ b/_maps/minigame/basketball/lusty_xenomorphs.dmm
@@ -6,7 +6,7 @@
/area/centcom/basketball)
"aw" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/iron/white,
/area/centcom/basketball)
"be" = (
@@ -70,7 +70,7 @@
/area/centcom/basketball)
"eU" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs,
+/obj/effect/decal/cleanable/blood/gibs/xeno,
/turf/open/floor/iron/white,
/area/centcom/basketball)
"fi" = (
@@ -223,7 +223,7 @@
"qU" = (
/obj/structure/sign/xenobio_guide/directional/west,
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/down,
+/obj/effect/decal/cleanable/blood/gibs/xeno/down,
/turf/open/floor/iron/white,
/area/centcom/basketball)
"rT" = (
@@ -254,7 +254,7 @@
/area/centcom/basketball)
"tU" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/limb,
+/obj/effect/decal/cleanable/blood/gibs/xeno/limb,
/turf/open/floor/iron/white,
/area/centcom/basketball)
"tX" = (
@@ -279,7 +279,7 @@
/turf/open/floor/iron/white,
/area/centcom/basketball)
"wZ" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva,
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva,
/turf/open/floor/engine,
/area/centcom/basketball)
"zy" = (
@@ -344,7 +344,7 @@
/area/centcom/basketball)
"CD" = (
/obj/structure/alien/weeds,
-/obj/effect/decal/cleanable/xenoblood/xgibs/core,
+/obj/effect/decal/cleanable/blood/gibs/xeno/core,
/turf/open/floor/iron/white,
/area/centcom/basketball)
"CV" = (
@@ -398,7 +398,7 @@
/turf/open/floor/iron/white,
/area/centcom/basketball)
"IA" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/engine,
/area/centcom/basketball)
"Jc" = (
@@ -541,7 +541,7 @@
/turf/open/floor/iron/white,
/area/centcom/basketball)
"Uv" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/torso,
+/obj/effect/decal/cleanable/blood/gibs/xeno/torso,
/turf/open/floor/engine,
/area/centcom/basketball)
"Uy" = (
diff --git a/_maps/minigame/basketball/soviet_bear.dmm b/_maps/minigame/basketball/soviet_bear.dmm
index 36f47288a03..a612daa3653 100644
--- a/_maps/minigame/basketball/soviet_bear.dmm
+++ b/_maps/minigame/basketball/soviet_bear.dmm
@@ -29,7 +29,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/lead_pipe,
/turf/open/floor/plating,
/area/centcom/basketball)
@@ -121,7 +121,7 @@
/turf/open/floor/iron/dark/small,
/area/centcom/basketball)
"hB" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating,
/area/centcom/basketball)
"jj" = (
@@ -191,7 +191,7 @@
/turf/open/floor/plating,
/area/centcom/basketball)
"mV" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/centcom/basketball)
@@ -257,7 +257,7 @@
/turf/open/floor/plating,
/area/centcom/basketball)
"tU" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/plating,
/area/centcom/basketball)
"tX" = (
@@ -283,7 +283,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/decal/cleanable/dirt,
/obj/item/shard,
/turf/open/floor/plating,
diff --git a/_maps/minigame/deathmatch/maint_mania.dmm b/_maps/minigame/deathmatch/maint_mania.dmm
index 914006c3cb8..b742b695c14 100644
--- a/_maps/minigame/deathmatch/maint_mania.dmm
+++ b/_maps/minigame/deathmatch/maint_mania.dmm
@@ -259,7 +259,7 @@
/turf/open/indestructible,
/area/deathmatch)
"FH" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/indestructible,
/area/deathmatch)
"FL" = (
diff --git a/_maps/minigame/deathmatch/meta_brig.dmm b/_maps/minigame/deathmatch/meta_brig.dmm
index a17b4ded433..81d88229a11 100644
--- a/_maps/minigame/deathmatch/meta_brig.dmm
+++ b/_maps/minigame/deathmatch/meta_brig.dmm
@@ -62,7 +62,7 @@
/turf/open/floor/carpet,
/area/deathmatch)
"aI" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron/grimy,
/area/deathmatch)
"aR" = (
@@ -275,7 +275,7 @@
/area/deathmatch)
"dN" = (
/obj/effect/turf_decal/trimline/red/filled/corner,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/indestructible/dark,
/area/deathmatch)
"ew" = (
@@ -1152,7 +1152,7 @@
/obj/structure/disposalpipe/segment{
dir = 1
},
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/indestructible,
/area/deathmatch)
"sb" = (
@@ -3290,7 +3290,7 @@
/turf/open/floor/plating,
/area/deathmatch)
"Wp" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/indestructible,
/area/deathmatch)
"Wv" = (
@@ -3407,7 +3407,7 @@
/area/deathmatch)
"XL" = (
/obj/structure/cable,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/indestructible,
/area/deathmatch)
"XS" = (
@@ -3619,7 +3619,7 @@
/turf/open/indestructible,
/area/deathmatch)
"ZO" = (
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/turf/open/floor/plating,
/area/deathmatch)
diff --git a/_maps/minigame/deathmatch/ragnarok.dmm b/_maps/minigame/deathmatch/ragnarok.dmm
index 89273eb45ad..a7e8652ddcf 100644
--- a/_maps/minigame/deathmatch/ragnarok.dmm
+++ b/_maps/minigame/deathmatch/ragnarok.dmm
@@ -418,7 +418,7 @@
"rh" = (
/obj/structure/fluff/clockwork/alloy_shards/medium,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/misc/asteroid/moon,
/area/deathmatch)
"rm" = (
diff --git a/_maps/minigame/deathmatch/species_warfare.dmm b/_maps/minigame/deathmatch/species_warfare.dmm
index 66e7e9b2275..d452a28d41d 100644
--- a/_maps/minigame/deathmatch/species_warfare.dmm
+++ b/_maps/minigame/deathmatch/species_warfare.dmm
@@ -194,7 +194,7 @@
/area/deathmatch)
"hG" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/item/mecha_parts/mecha_equipment/ripleyupgrade,
/turf/open/floor/iron/dark,
/area/deathmatch)
@@ -743,7 +743,7 @@
"Ag" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/tile/purple/half/contrasted,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/indestructible/white,
/area/deathmatch)
"AE" = (
diff --git a/_maps/modular_generic/beach_l_ribs.dmm b/_maps/modular_generic/beach_l_ribs.dmm
index 69992c2ed76..d857c840a20 100644
--- a/_maps/modular_generic/beach_l_ribs.dmm
+++ b/_maps/modular_generic/beach_l_ribs.dmm
@@ -37,7 +37,7 @@
"fi" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/decal/cleanable/fuel_pool,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/beach/sand,
/area/template_noop)
"fw" = (
@@ -372,7 +372,7 @@
/obj/structure/statue/bone/rib{
dir = 1
},
-/obj/effect/decal/cleanable/xenoblood{
+/obj/effect/decal/cleanable/blood/xeno{
icon_state = "floor4"
},
/turf/open/misc/asteroid{
@@ -522,7 +522,7 @@
/area/template_noop)
"OJ" = (
/obj/structure/statue/bone/rib,
-/obj/effect/decal/cleanable/xenoblood{
+/obj/effect/decal/cleanable/blood/xeno{
icon_state = "floor5"
},
/turf/open/misc/asteroid{
@@ -540,7 +540,7 @@
/area/template_noop)
"PS" = (
/obj/structure/statue/bone/rib,
-/obj/effect/decal/cleanable/xenoblood{
+/obj/effect/decal/cleanable/blood/xeno{
icon_state = "floor7"
},
/obj/effect/turf_decal/trimline/dark/warning{
@@ -669,7 +669,7 @@
/obj/effect/turf_decal/weather/sand{
dir = 4
},
-/obj/effect/decal/cleanable/xenoblood{
+/obj/effect/decal/cleanable/blood/xeno{
icon_state = "floor5"
},
/obj/effect/turf_decal/trimline/dark/warning{
diff --git a/_maps/modular_generic/ice_s_freezer.dmm b/_maps/modular_generic/ice_s_freezer.dmm
index b150be62220..ec8aef221d9 100644
--- a/_maps/modular_generic/ice_s_freezer.dmm
+++ b/_maps/modular_generic/ice_s_freezer.dmm
@@ -89,7 +89,7 @@
/turf/template_noop,
/area/template_noop)
"M" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/item/food/meat/slab/meatproduct{
pixel_y = 6;
pixel_x = 6
diff --git a/_maps/modular_generic/jungle_m_armory.dmm b/_maps/modular_generic/jungle_m_armory.dmm
index a99a173cc8a..39090181945 100644
--- a/_maps/modular_generic/jungle_m_armory.dmm
+++ b/_maps/modular_generic/jungle_m_armory.dmm
@@ -135,7 +135,7 @@
/obj/effect/turf_decal/weather/dirt{
dir = 6
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/effect/decal/remains/xeno,
/obj/structure/flora/bush/large/style_random{
pixel_y = -3
diff --git a/_maps/modular_generic/station_m_shipping.dmm b/_maps/modular_generic/station_m_shipping.dmm
index 0fbfc3f7ddd..f2fdb43ab0f 100644
--- a/_maps/modular_generic/station_m_shipping.dmm
+++ b/_maps/modular_generic/station_m_shipping.dmm
@@ -4,7 +4,7 @@
dir = 8;
name = "Cargo Hold"
},
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/iron/smooth,
/area/template_noop)
"b" = (
@@ -135,7 +135,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
-/obj/effect/decal/cleanable/oil/streak{
+/obj/effect/decal/cleanable/blood/splatter/oil{
pixel_x = 1
},
/turf/open/floor/iron/smooth,
@@ -167,7 +167,7 @@
/obj/effect/turf_decal/stripes{
dir = 8
},
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/iron/smooth,
/area/template_noop)
"L" = (
diff --git a/_maps/modular_generic/station_s_chasm.dmm b/_maps/modular_generic/station_s_chasm.dmm
index 2865aca985b..655e90077e6 100644
--- a/_maps/modular_generic/station_s_chasm.dmm
+++ b/_maps/modular_generic/station_s_chasm.dmm
@@ -61,7 +61,7 @@
/area/template_noop)
"E" = (
/obj/effect/mapping_helpers/burnt_floor,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/iron,
/area/template_noop)
"N" = (
diff --git a/_maps/safehouses/dig.dmm b/_maps/safehouses/dig.dmm
index aa26f980d60..1a417a5bcf6 100644
--- a/_maps/safehouses/dig.dmm
+++ b/_maps/safehouses/dig.dmm
@@ -58,7 +58,7 @@
dir = 8
},
/obj/effect/turf_decal/siding/yellow,
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/misc/asteroid,
/area/virtual_domain/safehouse)
"x" = (
diff --git a/_maps/shuttles/cargo_delta.dmm b/_maps/shuttles/cargo_delta.dmm
index c12c7c17878..71477acd357 100644
--- a/_maps/shuttles/cargo_delta.dmm
+++ b/_maps/shuttles/cargo_delta.dmm
@@ -63,7 +63,7 @@
/turf/open/floor/plating,
/area/shuttle/supply)
"l" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/shuttle/supply)
diff --git a/_maps/shuttles/cargo_pubby.dmm b/_maps/shuttles/cargo_pubby.dmm
index 4ff003c70b3..45d764e9e1f 100644
--- a/_maps/shuttles/cargo_pubby.dmm
+++ b/_maps/shuttles/cargo_pubby.dmm
@@ -52,7 +52,7 @@
/area/shuttle/supply)
"s" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/chapel{
dir = 1
},
diff --git a/_maps/shuttles/emergency_bballhooper.dmm b/_maps/shuttles/emergency_bballhooper.dmm
index cb593436971..49972dccae1 100644
--- a/_maps/shuttles/emergency_bballhooper.dmm
+++ b/_maps/shuttles/emergency_bballhooper.dmm
@@ -503,7 +503,7 @@
name = "TIMEOUT BOX"
},
/obj/effect/mapping_helpers/airlock/access/all/security/general,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/mineral/plastitanium/red,
/area/shuttle/escape/brig)
"Cf" = (
diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm
index 47e5de8ac3a..798dfc02225 100644
--- a/_maps/shuttles/emergency_birdshot.dmm
+++ b/_maps/shuttles/emergency_birdshot.dmm
@@ -42,7 +42,7 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"cr" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/glass/reinforced,
/area/shuttle/escape)
"cX" = (
@@ -198,7 +198,7 @@
dir = 1
},
/obj/effect/spawner/random/structure/crate,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/escape)
"iU" = (
@@ -309,7 +309,7 @@
/obj/structure/chair/comfy/shuttle{
dir = 1
},
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/structure/window/reinforced/survival_pod/spawner/directional/south,
/turf/open/floor/glass/reinforced,
/area/shuttle/escape)
@@ -890,7 +890,7 @@
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/glass/reinforced,
/area/shuttle/escape)
"UG" = (
diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm
index 2558bc9c5bb..b6d635deea2 100644
--- a/_maps/shuttles/emergency_cruise.dmm
+++ b/_maps/shuttles/emergency_cruise.dmm
@@ -3199,7 +3199,7 @@
"Ra" = (
/obj/structure/extinguisher_cabinet/directional/north,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil{
+/obj/effect/decal/cleanable/blood/oil{
icon_state = "floor5"
},
/turf/open/floor/iron,
diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm
index 2f62bc945bd..d39e66077bb 100644
--- a/_maps/shuttles/emergency_lance.dmm
+++ b/_maps/shuttles/emergency_lance.dmm
@@ -1539,7 +1539,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/shuttle/escape/brig)
"WO" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 1
},
diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm
index 2eb0e949737..1e57d5f2ce5 100644
--- a/_maps/shuttles/emergency_luxury.dmm
+++ b/_maps/shuttles/emergency_luxury.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"bg" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/shuttle/escape)
"bJ" = (
@@ -347,9 +347,9 @@
"qc" = (
/obj/effect/spawner/random/maintenance/eight,
/obj/structure/closet/crate/engineering/electrical,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/turf_decal/delivery,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/shuttle/escape)
@@ -425,7 +425,7 @@
dir = 1
},
/obj/structure/window/spawner/directional/south,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/light/small/directional/east,
/turf/open/floor/iron,
/area/shuttle/escape)
@@ -488,7 +488,7 @@
"uC" = (
/obj/effect/spawner/random/maintenance/eight,
/obj/structure/closet/crate/engineering/electrical,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/turf_decal/delivery,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
@@ -725,7 +725,7 @@
/area/shuttle/escape/luxury)
"DP" = (
/obj/effect/decal/cleanable/glass,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/iron,
/area/shuttle/escape)
"DQ" = (
@@ -782,9 +782,9 @@
"EZ" = (
/obj/effect/spawner/random/maintenance/eight,
/obj/structure/closet/crate/preopen,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/turf_decal/delivery,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/shuttle/escape)
@@ -855,7 +855,7 @@
"IT" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/generic,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/iron,
/area/shuttle/escape)
"Jd" = (
@@ -946,7 +946,7 @@
/turf/open/floor/mineral/titanium/white,
/area/shuttle/escape/luxury)
"Mb" = (
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/obj/structure/door_assembly,
/obj/item/stack/tile/iron/base,
/obj/effect/decal/cleanable/dirt,
@@ -1191,7 +1191,7 @@
/turf/open/floor/plating,
/area/shuttle/escape/luxury)
"XY" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/escape)
"Yb" = (
diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm
index 16e1b107212..88df39d90b4 100644
--- a/_maps/shuttles/emergency_nature.dmm
+++ b/_maps/shuttles/emergency_nature.dmm
@@ -277,7 +277,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"iV" = (
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
@@ -901,7 +901,7 @@
},
/area/shuttle/escape)
"IB" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm
index a00f6804bbc..029a3c5c0fa 100644
--- a/_maps/shuttles/emergency_russiafightpit.dmm
+++ b/_maps/shuttles/emergency_russiafightpit.dmm
@@ -187,7 +187,7 @@
/turf/open/floor/engine,
/area/shuttle/escape)
"aM" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/obj/machinery/door/poddoor{
id = "bearsbearsbears"
},
@@ -212,7 +212,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/shuttle/escape/brig)
"aQ" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/floor/engine,
/area/shuttle/escape)
"aR" = (
diff --git a/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm b/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm
index 20a9fac8161..4eca7aeb766 100644
--- a/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm
+++ b/_maps/shuttles/emergency_scrapheap/classic_aft3.dmm
@@ -14,7 +14,7 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"g" = (
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/obj/effect/decal/cleanable/blood/drip,
/obj/structure/falsewall/titanium,
/obj/effect/mapping_helpers/burnt_floor,
@@ -22,7 +22,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"h" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/turf/open/floor/plating,
@@ -105,7 +105,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"D" = (
-/obj/effect/decal/cleanable/blood/trails,
+/obj/effect/decal/cleanable/blood/trail_holder,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
@@ -114,13 +114,13 @@
/turf/open/floor/iron/freezer,
/area/shuttle/escape)
"E" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/turf/template_noop,
/area/template_noop)
"F" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/effect/decal/cleanable/blood/drip,
@@ -173,7 +173,7 @@
/turf/open/floor/iron/freezer,
/area/shuttle/escape)
"M" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 10
},
/obj/structure/extinguisher_cabinet/directional/south,
@@ -196,7 +196,7 @@
/turf/template_noop,
/area/shuttle/escape)
"T" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 5
},
/obj/item/stack/tile/iron,
@@ -238,7 +238,7 @@
/turf/open/floor/iron,
/area/shuttle/escape)
"Z" = (
-/obj/effect/decal/cleanable/blood/trails{
+/obj/effect/decal/cleanable/blood/trail_holder{
dir = 4
},
/obj/effect/decal/cleanable/blood/drip,
diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter_psyker.dmm
index 980bb552122..476e58ce6f8 100644
--- a/_maps/shuttles/hunter_psyker.dmm
+++ b/_maps/shuttles/hunter_psyker.dmm
@@ -215,7 +215,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/hunter)
"jB" = (
@@ -226,7 +226,7 @@
/area/shuttle/hunter)
"ke" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/turf/open/floor/plating,
/area/shuttle/hunter)
@@ -898,7 +898,7 @@
/obj/machinery/airalarm/directional/west,
/obj/effect/mapping_helpers/airalarm/all_access,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/robot_debris/up,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up,
/turf/open/floor/plating,
/area/shuttle/hunter)
"RK" = (
diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm
index 1800d638fc5..44742ef5b5b 100644
--- a/_maps/shuttles/infiltrator_advanced.dmm
+++ b/_maps/shuttles/infiltrator_advanced.dmm
@@ -358,7 +358,7 @@
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/plastitanium,
/area/shuttle/syndicate/eva)
@@ -1592,7 +1592,7 @@
/obj/structure/reagent_dispensers/fueltank,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm
index 182f51ad3b6..432e3e93129 100644
--- a/_maps/shuttles/pirate_default.dmm
+++ b/_maps/shuttles/pirate_default.dmm
@@ -398,7 +398,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/pirate)
"bf" = (
diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm
index b330503ceaf..a83cd9c28b6 100644
--- a/_maps/shuttles/whiteship_delta.dmm
+++ b/_maps/shuttles/whiteship_delta.dmm
@@ -510,7 +510,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/spider/stickyweb,
/turf/open/floor/plating,
/area/shuttle/abandoned/engine)
@@ -1157,7 +1157,7 @@
/area/shuttle/abandoned/engine)
"cC" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/obj/structure/cable,
/turf/open/floor/plating,
diff --git a/_maps/shuttles/whiteship_donut.dmm b/_maps/shuttles/whiteship_donut.dmm
index 1c28cd34818..65402aba73c 100644
--- a/_maps/shuttles/whiteship_donut.dmm
+++ b/_maps/shuttles/whiteship_donut.dmm
@@ -101,7 +101,7 @@
/area/shuttle/abandoned)
"hP" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/stack/cable_coil,
/turf/open/floor/iron/airless,
/area/shuttle/abandoned)
@@ -178,7 +178,7 @@
/area/shuttle/abandoned)
"qy" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil/slippery,
+/obj/effect/decal/cleanable/blood/oil/slippery,
/turf/open/floor/plating/airless,
/area/shuttle/abandoned)
"rq" = (
@@ -195,7 +195,7 @@
"sg" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/generic,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/airless,
/area/shuttle/abandoned)
"sw" = (
diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm
index 350c5cb8f71..590c18e7868 100644
--- a/_maps/shuttles/whiteship_kilo.dmm
+++ b/_maps/shuttles/whiteship_kilo.dmm
@@ -118,7 +118,7 @@
},
/obj/machinery/light/cold/no_nightlight/directional/south,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/robot_debris/down,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down,
/obj/item/bot_assembly/cleanbot,
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -395,7 +395,7 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/plating,
/area/shuttle/abandoned/cargo)
"ry" = (
@@ -435,7 +435,7 @@
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/obj/effect/turf_decal/stripes/corner,
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/plating,
@@ -984,8 +984,8 @@
/area/shuttle/abandoned/crew)
"RI" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/oil,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/turf/open/floor/plating,
/area/shuttle/abandoned/cargo)
"RN" = (
diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm
index cbc057ff246..91e83d3e272 100644
--- a/_maps/shuttles/whiteship_meta.dmm
+++ b/_maps/shuttles/whiteship_meta.dmm
@@ -259,7 +259,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/blood,
/obj/effect/decal/remains/human,
/turf/open/floor/plating,
@@ -1111,7 +1111,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark,
/area/shuttle/abandoned/cargo)
"dr" = (
@@ -1413,12 +1413,12 @@
/area/shuttle/abandoned/bar)
"el" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/abandoned/engine)
"em" = (
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark,
/area/shuttle/abandoned/cargo)
"eD" = (
diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm
index beb88d5c9d3..2486da85094 100644
--- a/_maps/shuttles/whiteship_pubby.dmm
+++ b/_maps/shuttles/whiteship_pubby.dmm
@@ -305,7 +305,7 @@
"na" = (
/obj/machinery/light/small/built/directional/east,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/turf/open/floor/plating,
/area/shuttle/abandoned)
diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm
index 7a28474079a..df92775842b 100644
--- a/_maps/templates/battlecruiser_starfury.dmm
+++ b/_maps/templates/battlecruiser_starfury.dmm
@@ -1167,7 +1167,7 @@
/area/shuttle/sbc_starfury)
"eA" = (
/obj/effect/turf_decal/stripes/line,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/pod/dark,
/area/shuttle/sbc_starfury)
"eB" = (
@@ -1340,7 +1340,7 @@
/turf/open/floor/plating,
/area/shuttle/sbc_starfury)
"eY" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
@@ -1497,7 +1497,7 @@
dir = 8
},
/obj/structure/disposalpipe/segment,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/textured_large,
/area/shuttle/sbc_starfury)
"fu" = (
@@ -3441,7 +3441,7 @@
/turf/open/floor/iron,
/area/shuttle/sbc_starfury)
"lN" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/sbc_starfury)
"lO" = (
@@ -3562,7 +3562,7 @@
/area/shuttle/sbc_starfury)
"mI" = (
/obj/effect/turf_decal/stripes/line,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/shuttle/sbc_starfury)
"mJ" = (
@@ -5355,7 +5355,7 @@
/turf/open/floor/iron/dark,
/area/shuttle/sbc_starfury)
"Sh" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
diff --git a/_maps/templates/lazy_templates/heretic_sacrifice.dmm b/_maps/templates/lazy_templates/heretic_sacrifice.dmm
index 44300c13735..7a752a33e73 100644
--- a/_maps/templates/lazy_templates/heretic_sacrifice.dmm
+++ b/_maps/templates/lazy_templates/heretic_sacrifice.dmm
@@ -23,7 +23,7 @@
/turf/open/misc/asteroid,
/area/centcom/heretic_sacrifice/void)
"dX" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/ashplanet/wateryrock{
initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
planetary_atmos = 0;
@@ -160,7 +160,7 @@
/obj/effect/turf_decal/weather/dirt{
dir = 9
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/misc/ashplanet/wateryrock{
initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
planetary_atmos = 0;
diff --git a/_maps/virtual_domains/abductor_ship.dmm b/_maps/virtual_domains/abductor_ship.dmm
index b74435a9ab1..092f8d31400 100644
--- a/_maps/virtual_domains/abductor_ship.dmm
+++ b/_maps/virtual_domains/abductor_ship.dmm
@@ -214,7 +214,7 @@
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"yt" = (
-/obj/effect/decal/cleanable/blood/xtracks,
+/obj/effect/decal/cleanable/blood/tracks/xeno,
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"zX" = (
@@ -386,7 +386,7 @@
pixel_x = 9;
pixel_y = -5
},
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"We" = (
@@ -410,11 +410,11 @@
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"XU" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/body,
+/obj/effect/decal/cleanable/blood/gibs/xeno/body,
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"Yq" = (
-/obj/effect/decal/cleanable/xenoblood/xsplatter,
+/obj/effect/decal/cleanable/blood/splatter/xeno,
/turf/open/floor/plating/abductor,
/area/virtual_domain)
"YV" = (
diff --git a/_maps/virtual_domains/clown_planet.dmm b/_maps/virtual_domains/clown_planet.dmm
index 37e00bd45fc..76408477f7e 100644
--- a/_maps/virtual_domains/clown_planet.dmm
+++ b/_maps/virtual_domains/clown_planet.dmm
@@ -701,7 +701,7 @@
/turf/open/floor/carpet,
/area/lavaland/surface/outdoors/virtual_domain)
"UL" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/structure/disposalpipe/segment{
dir = 10
},
diff --git a/_maps/virtual_domains/fredingtonfastingbear.dmm b/_maps/virtual_domains/fredingtonfastingbear.dmm
index 422395c72bc..67b3965ba96 100644
--- a/_maps/virtual_domains/fredingtonfastingbear.dmm
+++ b/_maps/virtual_domains/fredingtonfastingbear.dmm
@@ -65,7 +65,7 @@
"dN" = (
/obj/effect/turf_decal/tile/blue/opposingcorners,
/obj/effect/turf_decal/tile/blue/opposingcorners,
-/obj/effect/decal/cleanable/blood/xtracks,
+/obj/effect/decal/cleanable/blood/tracks/xeno,
/turf/open/floor/iron/kitchen,
/area/virtual_domain)
"dV" = (
diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm
index f9bbc496950..9032dae1ac7 100644
--- a/_maps/virtual_domains/island_brawl.dmm
+++ b/_maps/virtual_domains/island_brawl.dmm
@@ -306,7 +306,7 @@
pixel_y = 4
},
/obj/item/storage/toolbox/emergency,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/herringbone,
/area/virtual_domain)
"dA" = (
@@ -648,7 +648,7 @@
/turf/open/misc/beach/sand,
/area/virtual_domain/fullbright)
"hD" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/machinery/button/door/directional/south{
id = "BeachGarage"
},
@@ -2185,7 +2185,7 @@
/obj/item/clothing/head/soft/black,
/obj/item/clothing/head/soft/black,
/obj/item/clothing/head/soft/black,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/obj/item/clothing/glasses/sunglasses,
/obj/item/clothing/glasses/heat,
/turf/open/floor/iron/dark/herringbone,
@@ -3887,7 +3887,7 @@
/obj/vehicle/ridden/atv{
dir = 4
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron/dark/herringbone,
/area/virtual_domain)
"UO" = (
diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm
index 5fc9b465c7a..823d9b25184 100644
--- a/_maps/virtual_domains/meta_central.dmm
+++ b/_maps/virtual_domains/meta_central.dmm
@@ -122,7 +122,7 @@
"aZ" = (
/obj/machinery/airalarm/directional/south,
/obj/effect/turf_decal/tile/neutral,
-/obj/effect/decal/cleanable/robot_debris/limb,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb,
/obj/machinery/exoscanner,
/obj/effect/turf_decal/bot_red,
/turf/open/floor/iron,
@@ -1082,7 +1082,7 @@
/turf/open/floor/iron,
/area/virtual_domain)
"jh" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/wood,
/area/virtual_domain)
"jk" = (
@@ -1687,7 +1687,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/decal/cleanable/oil{
+/obj/effect/decal/cleanable/blood/oil{
icon_state = "floor6"
},
/obj/structure/railing{
@@ -1852,7 +1852,7 @@
/turf/open/floor/iron,
/area/virtual_domain)
"pI" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/up,
+/obj/effect/decal/cleanable/blood/gibs/xeno/up,
/obj/structure/alien/weeds,
/turf/open/floor/plating,
/area/virtual_domain)
@@ -1877,7 +1877,7 @@
/turf/open/indestructible/meat,
/area/virtual_domain)
"pO" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/fluff/paper/stack{
dir = 4
@@ -1936,7 +1936,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/decal/cleanable/oil{
+/obj/effect/decal/cleanable/blood/oil{
icon_state = "floor5"
},
/turf/open/floor/iron,
@@ -2337,7 +2337,7 @@
/turf/open/floor/plating,
/area/virtual_domain)
"tn" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/core,
+/obj/effect/decal/cleanable/blood/gibs/xeno/core,
/obj/structure/alien/weeds,
/turf/open/floor/plating,
/area/virtual_domain)
@@ -3485,7 +3485,7 @@
/turf/open/floor/iron,
/area/virtual_domain)
"CQ" = (
-/obj/effect/decal/cleanable/xenoblood,
+/obj/effect/decal/cleanable/blood/xeno,
/obj/structure/alien/weeds,
/turf/open/floor/plating,
/area/virtual_domain)
@@ -3758,7 +3758,7 @@
/turf/open/floor/carpet,
/area/virtual_domain)
"Fr" = (
-/obj/effect/decal/cleanable/xenoblood/xgibs/down,
+/obj/effect/decal/cleanable/blood/gibs/xeno/down,
/obj/structure/alien/weeds,
/turf/open/floor/plating,
/area/virtual_domain)
@@ -4236,7 +4236,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/decal/cleanable/robot_debris,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris,
/turf/open/floor/iron,
/area/virtual_domain)
"JP" = (
@@ -5691,7 +5691,7 @@
"VZ" = (
/obj/structure/extinguisher_cabinet/directional/south,
/obj/effect/turf_decal/tile/neutral,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/virtual_domain)
"Wf" = (
diff --git a/_maps/virtual_domains/pipedream.dmm b/_maps/virtual_domains/pipedream.dmm
index a455ee49aa5..3fd631ca178 100644
--- a/_maps/virtual_domains/pipedream.dmm
+++ b/_maps/virtual_domains/pipedream.dmm
@@ -587,7 +587,7 @@
/area/virtual_domain)
"rJ" = (
/obj/structure/railing,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/virtual_domain)
"rM" = (
@@ -615,7 +615,7 @@
/turf/open/floor/iron,
/area/virtual_domain)
"sW" = (
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/obj/effect/turf_decal/trimline/yellow/corner{
dir = 1
},
@@ -966,7 +966,7 @@
/turf/open/floor/iron,
/area/virtual_domain)
"BX" = (
-/obj/effect/decal/cleanable/robot_debris/old,
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old,
/turf/open/floor/iron,
/area/virtual_domain)
"Ci" = (
@@ -1049,7 +1049,7 @@
/obj/effect/turf_decal/stripes{
dir = 8
},
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/iron,
/area/virtual_domain)
"EJ" = (
@@ -1867,7 +1867,7 @@
/turf/open/floor/iron,
/area/virtual_domain)
"Zb" = (
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/plating,
/area/virtual_domain)
"Zg" = (
diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm
index 6d429572c7b..12e17b3c68a 100644
--- a/_maps/virtual_domains/pirates.dmm
+++ b/_maps/virtual_domains/pirates.dmm
@@ -217,7 +217,7 @@
/obj/effect/turf_decal/weather/sand{
dir = 1
},
-/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/blood/splatter/oil,
/turf/open/floor/wood,
/area/virtual_domain/fullbright)
"mp" = (
@@ -412,7 +412,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/oil,
+/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/wood,
/area/virtual_domain/fullbright)
"wu" = (
diff --git a/code/__DEFINES/blood.dm b/code/__DEFINES/blood.dm
index 2c8576a2eda..92753667574 100644
--- a/code/__DEFINES/blood.dm
+++ b/code/__DEFINES/blood.dm
@@ -9,16 +9,8 @@
#define BLOOD_POOL_MAX 300
/// How much blood a footprint need to at least contain
#define BLOOD_FOOTPRINTS_MIN 5
-
-//Bloody shoe blood states
-/// Red blood
-#define BLOOD_STATE_HUMAN "blood"
-/// Green xeno blood
-#define BLOOD_STATE_XENO "xeno"
-/// Black robot oil
-#define BLOOD_STATE_OIL "oil"
-/// No blood is present
-#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
+/// Bloodiness -> reagent units multiplier
+#define BLOOD_TO_UNITS_MULTIPLIER 0.1
// Bitflags for mob dismemberment and gibbing
/// Mobs will drop a brain
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 6f664ff848a..a70515e1653 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -217,11 +217,12 @@
#define COLOR_SAMPLE_GRAY "#5e5856"
///Colors for blood greyscale sprites
-#define BLOOD_COLOR_RED "#FF291E" // This is lighter than the blood reagent itself because for the greyscale to look the same as before it needs to be the lightest parts of the sprite.
-#define BLOOD_COLOR_LIZARD "#047200"
-#define BLOOD_COLOR_XENO "#D5FF2C"
-#define BLOOD_COLOR_OIL "#262626"
-#define BLOOD_COLOR_BLACK "#2C0903"
+#define BLOOD_COLOR_RED "#AA1010"
+#define BLOOD_COLOR_LIZARD "#035A00"
+#define BLOOD_COLOR_XENO "#96BB00"
+#define BLOOD_COLOR_OIL "#2C2C2C"
+#define BLOOD_COLOR_BLACK "#1F1A00"
+#define BLOOD_COLOR_DRIED "#370404" // Not to be used normally, only exists for mapper convinience
///Main colors for UI themes
#define COLOR_THEME_MIDNIGHT "#6086A0"
diff --git a/code/__DEFINES/dcs/signals/signals_gib.dm b/code/__DEFINES/dcs/signals/signals_gib.dm
index aefc908bf1f..a5c54e38de4 100644
--- a/code/__DEFINES/dcs/signals/signals_gib.dm
+++ b/code/__DEFINES/dcs/signals/signals_gib.dm
@@ -1,5 +1,5 @@
//Gibs
///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
#define COMSIG_GIBS_STREAK "gibs_streak"
-/// Called on mobs when they step in blood. (blood_amount, blood_state, list/blood_DNA)
+/// Called on mobs when they step in blood. (obj/effect/decal/cleanable/blood/blood)
#define COMSIG_STEP_ON_BLOOD "step_on_blood"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
index 1aa28be695a..ba3cfe7396c 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
@@ -174,3 +174,6 @@
/// Called at the very end of human character setup
/// At this point all quirks are assigned and the mob has a mind / client
#define COMSIG_HUMAN_CHARACTER_SETUP_FINISHED "human_character_setup_finished"
+
+/// From /mob/living/carbon/proc/set_blood_type : (mob/living/carbon/user, datum/blood_type, update_cached_blood_dna_info)
+#define COMSIG_CARBON_CHANGED_BLOOD_TYPE "carbon_set_blood_type"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
index 5a6e982d32a..a6ffc9afc5a 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
@@ -326,6 +326,3 @@
/// From /obj/item/book/bible/attack() : (mob/living/user, obj/item/book/bible/bible, bless_result)
#define COMSIG_LIVING_BLESSED "living_blessed"
-
-/// From /mob/living/set_blood_type : (mob/living/user, datum/blood_type, update_cached_blood_dna_info)
-#define COMSIG_LIVING_CHANGED_BLOOD_TYPE "living_set_blood_type"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
index 3106afa7975..e7408caa02a 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -11,10 +11,10 @@
#define COMSIG_MOB_MIND_INITIALIZED "mob_mind_inited"
///from base of mob/set_stat(): (new_stat, old_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
-///from base of mob/reagent_check(): (datum/reagent/chem, seconds_per_tick, times_fired)
-#define COMSIG_MOB_REAGENT_CHECK "mob_reagent_check"
+///from base of mob/reagent_tick(): (datum/reagent/chem, seconds_per_tick, times_fired)
+#define COMSIG_MOB_REAGENT_TICK "mob_reagent_tick"
///stops the reagent check call
- #define COMSIG_MOB_STOP_REAGENT_CHECK (1<<0)
+ #define COMSIG_MOB_STOP_REAGENT_TICK (1<<0)
///from base of mob/clickon(): (atom/A, list/modifiers)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm
index 8d91c1b2e6b..7e2954e7d22 100644
--- a/code/__DEFINES/dcs/signals/signals_reagent.dm
+++ b/code/__DEFINES/dcs/signals/signals_reagent.dm
@@ -18,6 +18,10 @@
#define COMSIG_REAGENT_EXPOSE_MOB "reagent_expose_mob"
///from base of [/datum/reagent/proc/expose_atom]: (/turf, reac_volume)
#define COMSIG_REAGENT_EXPOSE_TURF "reagent_expose_turf"
+///from base of [/datum/reagent/proc/on_merge(data, amount)]: (list/data, amount)
+#define COMSIG_REAGENT_ON_MERGE "reagent_on_merge"
+///from base of [/datum/reagent/proc/on_transfer_creation(reagent, target_holder, new_reagent)]: (datum/reagents/target_holder, datum/reagent/new_reagent)
+#define COMSIG_REAGENT_ON_TRANSFER "reagent_on_transfer"
///from base of [/datum/materials_controller/proc/InitializeMaterial]: (/datum/material)
#define COMSIG_MATERIALS_INIT_MAT "SSmaterials_init_mat"
diff --git a/code/__DEFINES/dcs/signals/signals_species.dm b/code/__DEFINES/dcs/signals/signals_species.dm
index 5c9998a1f80..ba5cde804f7 100644
--- a/code/__DEFINES/dcs/signals/signals_species.dm
+++ b/code/__DEFINES/dcs/signals/signals_species.dm
@@ -3,6 +3,3 @@
#define COMSIG_SPECIES_GAIN "species_gain"
///from datum/species/on_species_loss(): (datum/species/lost_species)
#define COMSIG_SPECIES_LOSS "species_loss"
-///from datum/species/handle_chemical(): (datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired)
-#define COMSIG_SPECIES_HANDLE_CHEMICAL "species_handle_chemicals"
- // same return values as COMSIG_MOB_STOP_REAGENT_CHECK
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index b6554bb7beb..9dd06dae572 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -54,6 +54,29 @@
#define BLOOD_TYPE_H2O "H2O"
#define BLOOD_TYPE_SNAIL "S"
+// Blood exposure behavior flag defines
+/// Add our DNA to turfs/mobs/items, does not correlate with adding decals/overlays
+/// mob/turf/item flags will add DNA when triggered even if this flag is false
+#define BLOOD_ADD_DNA (1<<0)
+/// Cover the entire mob in *visible* blood
+#define BLOOD_COVER_MOBS (1<<1)
+/// Create blood splashes and trails on floors, does not affect gibs creation
+#define BLOOD_COVER_TURFS (1<<2)
+/// Cover items in ourselves
+#define BLOOD_COVER_ITEMS (1<<3)
+/// Usually you want all COVER flags together or none at all
+#define BLOOD_COVER_ALL (BLOOD_COVER_MOBS | BLOOD_COVER_TURFS | BLOOD_COVER_ITEMS)
+/// Transfer blood immunities and viruses to exposed mobs
+#define BLOOD_TRANSFER_VIRAL_DATA (1<<4)
+
+// Bleed check results
+/// We cannot bleed (here, or in general) at all
+#define BLEED_NONE 0
+/// We cannot make a splatter, but we can add our DNA
+#define BLEED_ADD_DNA 1
+/// We can bleed just fine
+#define BLEED_SPLATTER 2
+
//Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0
#define MOB_SIZE_SMALL 1
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 1f4d5497c5f..98d143fd1fe 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -134,6 +134,7 @@
#define FIRE_PRIORITY_RESEARCH 10
#define FIRE_PRIORITY_VIS 10
#define FIRE_PRIORITY_AMBIENCE 10
+#define FIRE_PRIORITY_BLOOD_DRYING 10
#define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_DATABASE 16
#define FIRE_PRIORITY_WET_FLOORS 20
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 184d9e6d8c4..d788081055b 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -1499,6 +1499,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Demolition modifier when hitting this object is inverted (ie, 1 / demolition)
#define TRAIT_INVERTED_DEMOLITION "demolition_inverted"
+/// Makes the mob immune to carpotoxin
+#define TRAIT_CARPOTOXIN_IMMUNE "carpotoxin_immune"
+
/// Trait given when we escape into our shell
#define TRAIT_SHELL_RETREATED "shell_retreated"
diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm
index d1ff5a4f63c..dfe731eddfe 100644
--- a/code/__HELPERS/atoms.dm
+++ b/code/__HELPERS/atoms.dm
@@ -381,4 +381,4 @@ rough example of the "cone" made by the 3 dirs checked
)
/// Helper for easily adding blood from INSIDE a mob to an atom (NOT blood ON the mob)
-#define add_mob_blood(from_who) add_blood_DNA(from_who.get_blood_dna_list())
+#define add_mob_blood(from_who) add_blood_DNA(from_who.get_blood_dna_list(), from_who.get_static_viruses())
diff --git a/code/__HELPERS/forensics.dm b/code/__HELPERS/forensics.dm
index 2d43a1ad61b..77b3bd357a6 100644
--- a/code/__HELPERS/forensics.dm
+++ b/code/__HELPERS/forensics.dm
@@ -4,7 +4,11 @@
#define GET_ATOM_HIDDENPRINTS(atom) atom.forensics?.hiddenprints
/// Returns the blood dna on this atom
#define GET_ATOM_BLOOD_DNA(atom) atom.forensics?.blood_DNA
+/// Returns visible blood dna on this atom
+#define GET_ATOM_BLOOD_DECALS(atom) atom.forensics?.get_visible_blood()
/// Returns the fibers on this atom
#define GET_ATOM_FIBRES(atom) atom.forensics?.fibers
/// Returns the number of unique blood dna sources on this atom
#define GET_ATOM_BLOOD_DNA_LENGTH(atom) (isnull(atom.forensics) ? 0 : length(atom.forensics.blood_DNA))
+/// Returns the number of *visible* blood dna on this atom
+#define GET_ATOM_BLOOD_DECAL_LENGTH(atom) (isnull(atom.forensics) ? 0 : length(atom.forensics.get_visible_blood()))
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index bd1caf851c5..20b798ff123 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -8,6 +8,7 @@
/// Returns one of the human blood types at random, weighted by their rarity
/proc/random_human_blood_type()
+ RETURN_TYPE(/datum/blood_type)
return get_blood_type(pick_weight(
list(
BLOOD_TYPE_O_MINUS = 4,
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index 158e8ace8f0..4948fac4ba7 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(narcd_underages)
GLOBAL_LIST_INIT_TYPED(language_datum_instances, /datum/language, init_language_prototypes())
/// List if all language typepaths learnable, IE, those with keys
GLOBAL_LIST_INIT(all_languages, init_all_languages())
-// /List of language prototypes to reference, assoc "name" = typepath
+/// /List of language prototypes to reference, assoc "name" = typepath
GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name())
/proc/init_language_prototypes()
@@ -114,7 +114,7 @@ GLOBAL_LIST_INIT(language_types_by_name, init_language_types_by_name())
lang_list[initial(lang_type.name)] = lang_type
return lang_list
-// A list of all the possible blood types, keyed by id (which is just the name in most cases)
+/// A list of all the possible blood types, keyed by id (which is just the name in most cases)
GLOBAL_LIST_INIT(blood_types, init_blood_types())
/// Initializes the list of blood type singletons
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 1dcaa809043..1d24deae3ff 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -624,6 +624,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PREVENT_BLINKING" = TRAIT_PREVENT_BLINKING,
"TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS,
"TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS,
+ "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE,
"TRAIT_CRUSHER_MARK_IMMUNE" = TRAIT_CRUSHER_MARK_IMMUNE, // BUBBER EDIT ADDITION
),
/mob/dead/observer = list(
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index ff061b6d930..6b76d1f9280 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -343,6 +343,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_IGNORE_FIRE_PROTECTION" = TRAIT_IGNORE_FIRE_PROTECTION,
"TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR,
"TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR,
+ "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE,
),
/obj/item = list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index bfe605247bc..0a92ea7091a 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -372,28 +372,31 @@
* Return TRUE if an effect was done, FALSE otherwise.
*/
/mob/living/proc/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker)
- if(damage_done > 0 && attacking_item.damtype == BRUTE && prob(25 + damage_done * 2))
- attacking_item.add_mob_blood(src)
- add_splatter_floor(get_turf(src))
- if(get_dist(attacker, src) <= 1)
- if(ishuman(attacker))
- var/bloodied_things = ITEM_SLOT_GLOVES
- if(damage_done >= 20 || (damage_done >= 15 && prob(25)))
- bloodied_things |= ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING
- if(prob(33) && damage_done >= 10)
- bloodied_things |= ITEM_SLOT_FEET
- if(prob(33) && damage_done >= 24) // fireaxe damage, because heeeeere's johnny
- bloodied_things |= ITEM_SLOT_MASK
- if(prob(33) && damage_done >= 30) // esword damage
- bloodied_things |= ITEM_SLOT_HEAD
+ if(damage_done <= 0 || attacking_item.damtype != BRUTE || !prob(25 + damage_done * 2))
+ return FALSE
- var/mob/living/carbon/human/human_attacker = attacker
- human_attacker.add_blood_DNA_to_items(get_blood_dna_list(), bloodied_things)
- else
- attacker.add_mob_blood(src)
+ attacking_item.add_mob_blood(src)
+ add_splatter_floor(get_turf(src))
+ if(get_dist(attacker, src) > 1)
return TRUE
- return FALSE
+ if(ishuman(attacker))
+ attacker.add_mob_blood(src)
+ return TRUE
+
+ var/bloodied_things = ITEM_SLOT_GLOVES
+ if(damage_done >= 20 || (damage_done >= 15 && prob(25)))
+ bloodied_things |= ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING
+ if(prob(33) && damage_done >= 10)
+ bloodied_things |= ITEM_SLOT_FEET
+ if(prob(33) && damage_done >= 24) // fireaxe damage, because heeeeere's johnny
+ bloodied_things |= ITEM_SLOT_MASK
+ if(prob(33) && damage_done >= 30) // esword damage
+ bloodied_things |= ITEM_SLOT_HEAD
+
+ var/mob/living/carbon/human/human_attacker = attacker
+ human_attacker.add_blood_DNA_to_items(get_blood_dna_list(), bloodied_things)
+ return TRUE
/mob/living/carbon/attack_effects(damage_done, hit_zone, armor_block, obj/item/attacking_item, mob/living/attacker)
var/obj/item/bodypart/hit_bodypart = get_bodypart(hit_zone) || bodyparts[1]
diff --git a/code/controllers/subsystem/blood_drying.dm b/code/controllers/subsystem/blood_drying.dm
new file mode 100644
index 00000000000..79202cb8d8c
--- /dev/null
+++ b/code/controllers/subsystem/blood_drying.dm
@@ -0,0 +1,11 @@
+/**
+ * Blood Drying SS
+ * Used as a low priority background system to handling the drying of blood on the ground
+ * (basically just handles reducing their bloodiness value over time)
+ */
+PROCESSING_SUBSYSTEM_DEF(blood_drying)
+ name = "Blood Drying"
+ flags = SS_NO_INIT | SS_BACKGROUND
+ priority = FIRE_PRIORITY_BLOOD_DRYING
+ runlevels = RUNLEVEL_GAME
+ wait = 4 SECONDS
diff --git a/code/datums/components/blood_walk.dm b/code/datums/components/blood_walk.dm
index f6d8a07e289..299b031fb50 100644
--- a/code/datums/components/blood_walk.dm
+++ b/code/datums/components/blood_walk.dm
@@ -17,6 +17,8 @@
var/target_dir_change
///Should we transfer the parent's blood DNA to created blood decal
var/transfer_blood_dna
+ ///List of additional blood DNA we're adding to the decal
+ var/list/blood_dna_info
/datum/component/blood_walk/Initialize(
blood_type = /obj/effect/decal/cleanable/blood,
@@ -26,7 +28,7 @@
target_dir_change = FALSE,
transfer_blood_dna = FALSE,
max_blood = INFINITY,
- blood_dna_info = list("meaty DNA" = get_blood_type(BLOOD_TYPE_MEAT))
+ list/blood_dna_info = list("meaty DNA" = get_blood_type(BLOOD_TYPE_MEAT))
)
if(!ismovable(parent))
@@ -38,6 +40,7 @@
src.blood_spawn_chance = blood_spawn_chance
src.target_dir_change = target_dir_change
src.transfer_blood_dna = transfer_blood_dna
+ src.blood_dna_info = blood_dna_info.Copy()
blood_remaining = max_blood
@@ -70,26 +73,34 @@
blood_remaining += max_blood
///Spawns blood (if possible) under the source, and plays a sound effect (if any)
-/datum/component/blood_walk/proc/spread_blood(datum/source)
+/datum/component/blood_walk/proc/spread_blood(atom/movable/source)
SIGNAL_HANDLER
- var/atom/movable/movable_source = source
- var/turf/current_turf = movable_source.loc
+ var/turf/current_turf = source.loc
if(!isturf(current_turf) || isclosedturf(current_turf) || isgroundlessturf(current_turf))
return
+
if(!prob(blood_spawn_chance))
return
- var/obj/effect/decal/cleanable/blood/blood = new blood_type(current_turf)
+ var/list/blood_DNA = blood_dna_info.Copy()
+ if(transfer_blood_dna && GET_ATOM_BLOOD_DNA_LENGTH(source))
+ blood_DNA = GET_ATOM_BLOOD_DNA(source) | blood_DNA
+
+ if(!has_blood_flag(blood_DNA, BLOOD_COVER_TURFS))
+ if (has_blood_flag(blood_DNA, BLOOD_ADD_DNA))
+ current_turf.add_blood_DNA(blood_DNA)
+ return
+
+ var/obj/effect/decal/cleanable/blood/blood = new blood_type(current_turf, null, blood_DNA)
+
if(QDELETED(blood)) // Our blood was placed on somewhere it shouldn't be and qdeleted in init.
return
if(target_dir_change)
- blood.setDir(movable_source.dir)
- if(transfer_blood_dna)
- blood.add_blood_DNA(GET_ATOM_BLOOD_DNA(movable_source))
+ blood.setDir(source.dir)
if(!isnull(sound_played))
- playsound(movable_source, sound_played, sound_volume, TRUE, 2, TRUE)
+ playsound(source, sound_played, sound_volume, TRUE, 2, TRUE)
blood_remaining = max(blood_remaining - 1, 0)
if(blood_remaining <= 0)
diff --git a/code/datums/components/bloody_spreader.dm b/code/datums/components/bloody_spreader.dm
index ff9702f7133..073dfe07dd6 100644
--- a/code/datums/components/bloody_spreader.dm
+++ b/code/datums/components/bloody_spreader.dm
@@ -7,21 +7,32 @@
// Blood splashed around everywhere will carry these diseases. Oh no...
var/list/diseases
-/datum/component/bloody_spreader/Initialize(blood_left = INFINITY, list/blood_dna, list/diseases)
+/datum/component/bloody_spreader/Initialize(blood_left = INFINITY, list/blood_dna = list(get_blood_type(BLOOD_TYPE_MEAT).dna_string = get_blood_type(BLOOD_TYPE_MEAT)), list/diseases = null)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
- var/list/signals_to_add = list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACKBY)
- if(ismovable(parent))
- signals_to_add += list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT)
- if(isitem(parent))
- signals_to_add += list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)
- var/atom/atom_parent = parent
- if(atom_parent.atom_storage)
- signals_to_add += list(COMSIG_ATOM_STORED_ITEM)
- else if(isstructure(parent))
- signals_to_add += list(COMSIG_ATOM_ATTACK_HAND)
- RegisterSignals(parent, signals_to_add, PROC_REF(spread_yucky_blood))
+ var/static/list/hand_signals = list(
+ COMSIG_ATOM_HULK_ATTACK,
+ COMSIG_ITEM_ATTACK_SELF,
+ COMSIG_ITEM_ATTACK_SELF_SECONDARY,
+ COMSIG_ITEM_DROPPED,
+ )
+ RegisterSignals(parent, hand_signals, PROC_REF(spread_to_hands))
+
+ if (isstructure(parent))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(spread_to_hands))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(spread_to_hands))
+
+ RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(spread_to_atom))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK_ATOM, PROC_REF(spread_to_atom))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(spread_to_atom))
+ RegisterSignal(parent, COMSIG_ITEM_HIT_REACT, PROC_REF(spread_to_atom))
+ RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(spread_to_atom))
+ RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(spread_to_atom))
+ RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(spread_to_atom))
+
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(spread_on_equip))
+ RegisterSignal(parent, COMSIG_ATOM_STORED_ITEM, PROC_REF(spread_on_stored))
if(isclothing(parent))
parent.AddComponent(/datum/component/bloodysoles)
@@ -30,24 +41,82 @@
src.blood_dna = blood_dna
src.diseases = diseases
-/datum/component/bloody_spreader/proc/spread_yucky_blood(atom/parent, atom/bloody_fool)
+/datum/component/bloody_spreader/InheritComponent(/datum/component/new_comp, i_am_original, blood_left = 0, list/blood_dna = null, list/diseases = null)
+ src.blood_dna |= blood_dna
+ src.diseases |= diseases
+ if(src.blood_left >= INFINITY)
+ return
+ src.blood_left += blood_left
+
+/// Apply blood to the mob who interacted with us
+/datum/component/bloody_spreader/proc/spread_to_hands(atom/parent, mob/bloody_fool)
SIGNAL_HANDLER
+
if(ishuman(bloody_fool))
- var/mob/living/carbon/human/bloody_fool_human = bloody_fool
- bloody_fool_human.add_blood_DNA_to_items(blood_dna, ITEM_SLOT_GLOVES)
+ var/mob/living/carbon/human/as_human = bloody_fool
+ as_human.add_blood_DNA_to_items(blood_dna, ITEM_SLOT_GLOVES)
blood_left -= 3
else
bloody_fool.add_blood_DNA(blood_dna, diseases)
blood_left -= 1
+
if(blood_left <= 0)
qdel(src)
-/datum/component/bloody_spreader/InheritComponent(/datum/component/new_comp, i_am_original, blood_left = 0)
+/// Apply blood to the atom that interacted with us, ignoring that they may be human
+/datum/component/bloody_spreader/proc/spread_to_atom(atom/parent, atom/bloody_fool)
+ SIGNAL_HANDLER
- if(!i_am_original)
+ bloody_fool.add_blood_DNA(blood_dna, diseases)
+ blood_left -= 1
+
+ if(blood_left <= 0)
+ qdel(src)
+
+/// Apply blood to both the item put into us, and the mob who put it there
+/datum/component/bloody_spreader/proc/spread_on_stored(atom/parent, obj/item/stored, mob/user)
+ SIGNAL_HANDLER
+
+ spread_to_atom(parent, stored)
+ if (blood_left > 0)
+ spread_to_hands(parent, user)
+
+/// Apply blood to the slots that our item covers when equipped
+/datum/component/bloody_spreader/proc/spread_on_equip(obj/item/parent, mob/equipper, slot)
+ SIGNAL_HANDLER
+
+ if (!ishuman(equipper))
+ equipper.add_blood_DNA(blood_dna, diseases)
+ blood_left -= 1
+ if(blood_left <= 0)
+ qdel(src)
return
- if(src.blood_left >= INFINITY)
- return
+ var/mob/living/carbon/human/as_human = equipper
- src.blood_left += blood_left
+ var/blood_slots = ITEM_SLOT_GLOVES
+ var/blood_lost = 3
+ if (slot & (ITEM_SLOT_LPOCKET | ITEM_SLOT_RPOCKET | ITEM_SLOT_ID))
+ blood_slots |= ITEM_SLOT_ICLOTHING
+ blood_lost += 1
+ else if (slot & (ITEM_SLOT_SUITSTORE | ITEM_SLOT_BELT | ITEM_SLOT_BACK | ITEM_SLOT_NECK))
+ blood_slots |= ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING // Will only actually bloody one of these, thus blood_lost is increased by one instead of two
+ blood_lost += 1
+
+ if (!(slot & ITEM_SLOT_HANDS))
+ var/list/equipment = as_human.get_equipped_items()
+ for (var/obj/item/equipped as anything in equipment)
+ var/item_slot = as_human.get_slot_by_item(equipped)
+ if ((item_slot & equipped.slot_flags) && (parent.body_parts_covered & equipped.body_parts_covered))
+ if (!(blood_slots & item_slot))
+ blood_lost += 1
+ blood_slots |= item_slot
+
+ if (blood_slots != ITEM_SLOT_GLOVES)
+ blood_lost -= 1
+
+ as_human.add_blood_DNA_to_items(blood_dna, blood_slots)
+ blood_left -= blood_lost
+
+ if(blood_left <= 0)
+ qdel(src)
diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm
index 4ab1f7354b8..60e38c898f4 100644
--- a/code/datums/components/bloodysoles.dm
+++ b/code/datums/components/bloodysoles.dm
@@ -1,39 +1,34 @@
-/// The percentage of blood we lose on each step
-#define BLOOD_PERCENT_LOSS_ON_STEP 0.33
-
/**
* Component for clothing items that can pick up blood from decals and spread it around everywhere when walking, such as shoes or suits with integrated shoes.
*/
/datum/component/bloodysoles
- /// The type of the last grub pool we stepped in, used to decide the type of footprints to make
- var/last_blood_state = BLOOD_STATE_NOT_BLOODY
-
- /// How much of each grubby type we have on our feet
- var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
-
/// The ITEM_SLOT_* slot the item is equipped on, if it is.
var/equipped_slot
-
- /// The parent item but casted into atom type for easier use.
- var/atom/parent_atom
-
+ /// What percentage of the bloodiness is deposited on the ground per step
+ var/blood_dropped_per_step = 3
+ /// Bloodiness on our clothines
+ VAR_FINAL/total_bloodiness = 0
/// Either the mob carrying the item, or the mob itself for the /feet component subtype
- var/mob/living/carbon/wielder
-
+ VAR_FINAL/mob/living/carbon/wielder
/// The world.time when we last picked up blood
- var/last_pickup
-
- var/footprint_sprite = FOOTPRINT_SPRITE_SHOES
+ VAR_FINAL/last_pickup
+ /// How much blood can we hold maximum
+ var/max_bloodiness = BLOOD_ITEM_MAX
+ /// Multiplier on how much blood taken from pools
+ var/share_mod = 1
/datum/component/bloodysoles/Initialize()
if(!isclothing(parent))
return COMPONENT_INCOMPATIBLE
- parent_atom = parent
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean))
+/datum/component/bloodysoles/Destroy()
+ wielder = null
+ return ..()
+
/**
* Unregisters from the wielder if necessary
*/
@@ -48,7 +43,7 @@
* Returns true if the parent item is obscured by something else that the wielder is wearing
*/
/datum/component/bloodysoles/proc/is_obscured()
- return wielder.check_covered_slots() & equipped_slot || is_under_feet_covered()
+ return (wielder.check_covered_slots() & equipped_slot) || is_under_feet_covered()
/**
* Returns true if the parent item is worn in the ITEM_SLOT_ICLOTHING slot and the
@@ -70,27 +65,15 @@
var/obj/item/parent_item = parent
parent_item.update_slot_icon()
+/// Called whenever the value of bloody_soles changes to update our icon and behavior
+/datum/component/bloodysoles/proc/change_blood_amount(some_amount)
+ total_bloodiness = clamp(round(total_bloodiness + some_amount, 0.1), 0, max_bloodiness)
+ update_icon()
-/datum/component/bloodysoles/proc/reset_bloody_shoes()
- bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
- on_changed_bloody_shoes(BLOOD_STATE_NOT_BLOODY)
-
-///lowers bloody_shoes[index] by adjust_by
-/datum/component/bloodysoles/proc/adjust_bloody_shoes(index, adjust_by)
- bloody_shoes[index] = max(bloody_shoes[index] - adjust_by, 0)
- on_changed_bloody_shoes(index)
-
-/datum/component/bloodysoles/proc/set_bloody_shoes(index, new_value)
- bloody_shoes[index] = new_value
- on_changed_bloody_shoes(index)
-
-///called whenever the value of bloody_soles changes
-/datum/component/bloodysoles/proc/on_changed_bloody_shoes(index)
- if(index && index != last_blood_state)
- last_blood_state = index
if(!wielder)
return
- if(bloody_shoes[index] <= BLOOD_FOOTPRINTS_MIN * 2)//need twice that amount to make footprints
+
+ if(total_bloodiness <= BLOOD_FOOTPRINTS_MIN * 2) // Need twice that amount to make footprints
UnregisterSignal(wielder, COMSIG_MOVABLE_MOVED)
else
RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), override = TRUE)
@@ -98,44 +81,56 @@
/**
* Run to equally share the blood between us and a decal
*/
-/datum/component/bloodysoles/proc/share_blood(obj/effect/decal/cleanable/pool)
+/datum/component/bloodysoles/proc/share_blood(obj/effect/decal/cleanable/blood/pool)
// Share the blood between our boots and the blood pool
- var/total_bloodiness = pool.bloodiness + bloody_shoes[pool.blood_state]
+ var/new_total_bloodiness = min(max_bloodiness, share_mod * (pool.bloodiness + total_bloodiness) / 2)
+ if(new_total_bloodiness == total_bloodiness || new_total_bloodiness == 0)
+ return FALSE
- // We can however be limited by how much blood we can hold
- var/new_our_bloodiness = min(BLOOD_ITEM_MAX, total_bloodiness / 2)
+ var/delta = new_total_bloodiness - total_bloodiness
+ pool.adjust_bloodiness(-1 * delta)
+ change_blood_amount(delta)
- set_bloody_shoes(pool.blood_state, new_our_bloodiness)
- pool.bloodiness = total_bloodiness - new_our_bloodiness // Give the pool the remaining blood incase we were limited
-
- if(HAS_TRAIT(parent_atom, TRAIT_LIGHT_STEP) || (wielder && HAS_TRAIT(wielder, TRAIT_LIGHT_STEP))) //the character is agile enough to don't mess their clothing and hands just from one blood splatter at floor
+ if(!ishuman(parent))
+ var/atom/to_bloody = parent
+ to_bloody.add_blood_DNA(GET_ATOM_BLOOD_DNA(pool))
return TRUE
- if(ishuman(parent))
- var/bloody_slots = ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING|ITEM_SLOT_FEET
- var/mob/living/carbon/human/to_bloody = parent
- if(to_bloody.body_position == LYING_DOWN)
- bloody_slots |= ITEM_SLOT_HEAD|ITEM_SLOT_MASK|ITEM_SLOT_GLOVES
+ var/bloody_slots = ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING|ITEM_SLOT_FEET
+ var/mob/living/carbon/human/to_bloody = parent
+ if(to_bloody.body_position == LYING_DOWN)
+ bloody_slots |= ITEM_SLOT_HEAD|ITEM_SLOT_MASK|ITEM_SLOT_GLOVES
- to_bloody.add_blood_DNA_to_items(GET_ATOM_BLOOD_DNA(pool), bloody_slots)
- return
-
- var/atom/to_bloody = parent
- to_bloody.add_blood_DNA(GET_ATOM_BLOOD_DNA(pool))
+ to_bloody.add_blood_DNA_to_items(GET_ATOM_BLOOD_DNA(pool), bloody_slots)
+ return TRUE
/**
- * Find a blood decal on a turf that matches our last_blood_state
+ * Adds blood to an existing (or new) footprint
*/
-/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null, footprint_sprite)
- for(var/obj/effect/decal/cleanable/blood/pool in turfLoc)
- if(pool.blood_state == last_blood_state && pool.footprint_sprite == footprint_sprite && (!typeFilter || istype(pool, typeFilter)))
- return pool
+/datum/component/bloodysoles/proc/add_blood_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint, bloodiness_to_add, exiting = FALSE, no_dna = FALSE)
+ add_parent_to_footprint(footprint)
+ footprint.adjust_bloodiness(bloodiness_to_add)
+ if (!no_dna)
+ footprint.add_blood_DNA(get_blood_dna())
+ var/new_alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * footprint.bloodiness / (BLOOD_ITEM_MAX * BLOOD_TO_UNITS_MULTIPLIER), 255)
+ if(new_alpha > footprint.alpha)
+ footprint.alpha = new_alpha
+ if(exiting)
+ footprint.exited_dirs |= wielder.dir
+ else
+ footprint.entered_dirs |= wielder.dir
+ footprint.update_appearance()
+
+/// Fetches this component's blood DNA
+/datum/component/bloodysoles/proc/get_blood_dna()
+ var/atom/atom_parent = parent
+ return GET_ATOM_BLOOD_DNA(atom_parent)
/**
* Adds the parent type to the footprint's shoe_types var
*/
-/datum/component/bloodysoles/proc/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
- FP.shoe_types |= parent.type
+/datum/component/bloodysoles/proc/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint)
+ LAZYOR(footprint.shoe_types, parent.type)
/**
* Called when the parent item is equipped by someone
@@ -154,7 +149,7 @@
equipped_slot = slot
wielder = equipper
- if(bloody_shoes[last_blood_state] > BLOOD_FOOTPRINTS_MIN * 2)
+ if(total_bloodiness > BLOOD_FOOTPRINTS_MIN * 2)
RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
RegisterSignal(wielder, COMSIG_STEP_ON_BLOOD, PROC_REF(on_step_blood))
@@ -165,7 +160,6 @@
*/
/datum/component/bloodysoles/proc/on_drop(datum/source, mob/dropper)
SIGNAL_HANDLER
-
unregister()
/**
@@ -173,63 +167,65 @@
*
* Used to make bloody footprints on the ground
*/
-/datum/component/bloodysoles/proc/on_moved(datum/source, OldLoc, Dir, Forced)
+/datum/component/bloodysoles/proc/on_moved(datum/source, atom/old_loc, Dir, Forced)
SIGNAL_HANDLER
- if(bloody_shoes[last_blood_state] == 0)
+ if(total_bloodiness <= 0)
return
if(QDELETED(wielder) || is_obscured())
return
- if(wielder.body_position == LYING_DOWN || !wielder.has_gravity(wielder.loc))
+ if(wielder.body_position == LYING_DOWN || (wielder.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
return
- var/blood_lost = bloody_shoes[last_blood_state] * BLOOD_PERCENT_LOSS_ON_STEP
- var/theoretical_new_blood = bloody_shoes[last_blood_state] - blood_lost
- var/footprint_sprite = wielder.get_footprint_sprite()
+ var/atom/parent_atom = parent
+ var/blood_used = round(total_bloodiness / 3, 0.01)
+ // This is more of a sanity check than an actual concern, but *just* in case
+ var/blood_flags = has_blood_flag(get_blood_dna(), BLOOD_ADD_DNA | BLOOD_COVER_TURFS)
+
// Add footprints in old loc if we have enough cream
- if(theoretical_new_blood >= BLOOD_FOOTPRINTS_MIN)
- var/turf/oldLocTurf = get_turf(OldLoc)
- var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints, footprint_sprite)
- if(oldLocFP)
- // Footprints found in the tile we left, add us to it
- add_parent_to_footprint(oldLocFP)
- if (!(oldLocFP.exited_dirs & wielder.dir))
- oldLocFP.exited_dirs |= wielder.dir
- oldLocFP.update_appearance()
- else if(find_pool_by_blood_state(oldLocTurf, footprint_sprite = footprint_sprite))
+ if(blood_used >= BLOOD_FOOTPRINTS_MIN)
+ var/turf/old_loc_turf = get_turf(old_loc)
+ var/obj/effect/decal/cleanable/blood/footprints/old_loc_prints = locate() in old_loc_turf
+ if(!(blood_flags & BLOOD_COVER_TURFS))
+ if(blood_flags & BLOOD_ADD_DNA)
+ old_loc_prints?.add_blood_DNA(get_blood_dna())
+ else if(old_loc_prints)
+ add_blood_to_footprint(old_loc_prints, 0, TRUE) // Add no actual blood, just update sprite
+ else if(locate(/obj/effect/decal/cleanable/blood) in old_loc_turf)
// No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it
- adjust_bloody_shoes(last_blood_state, blood_lost)
- update_icon()
-
- oldLocFP = new(oldLocTurf, footprint_sprite)
- if(!QDELETED(oldLocFP)) ///prints merged
- oldLocFP.blood_state = last_blood_state
- oldLocFP.exited_dirs |= wielder.dir
- add_parent_to_footprint(oldLocFP)
- oldLocFP.bloodiness = blood_lost
- oldLocFP.add_blood_DNA(GET_ATOM_BLOOD_DNA(parent_atom))
- oldLocFP.update_appearance()
-
- blood_lost = bloody_shoes[last_blood_state] * BLOOD_PERCENT_LOSS_ON_STEP
- theoretical_new_blood = theoretical_new_blood - blood_lost
+ change_blood_amount(-1 * blood_used)
+ old_loc_prints = new(old_loc_turf, null, get_blood_dna())
+ old_loc_prints.alpha = 0
+ if(!QDELETED(old_loc_prints)) // prints merged
+ add_blood_to_footprint(old_loc_prints, blood_used, TRUE, no_dna = TRUE)
+ blood_used = round(total_bloodiness / 3, 0.01)
// If we picked up the blood on this tick in on_step_blood, don't make footprints at the same place
- if(last_pickup && last_pickup == world.time)
+ if(last_pickup == world.time)
+ return
+
+ if(blood_used < BLOOD_FOOTPRINTS_MIN)
return
// Create new footprints
- if(theoretical_new_blood >= BLOOD_FOOTPRINTS_MIN)
- adjust_bloody_shoes(last_blood_state, blood_lost)
+ var/turf/new_loc_turf = get_turf(parent_atom)
+ var/obj/effect/decal/cleanable/blood/footprints/new_loc_prints = locate() in new_loc_turf
+ if(new_loc_prints)
+ if(blood_flags & BLOOD_COVER_TURFS)
+ add_blood_to_footprint(new_loc_prints, 0, FALSE) // Add no actual blood, just update sprite
+ return
+ if(blood_flags & BLOOD_ADD_DNA)
+ new_loc_prints.add_blood_DNA(get_blood_dna())
+ return
- var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom), footprint_sprite)
- if(!QDELETED(FP)) ///prints merged
- FP.blood_state = last_blood_state
- FP.entered_dirs |= wielder.dir
- add_parent_to_footprint(FP)
- FP.bloodiness = blood_lost
- FP.add_blood_DNA(GET_ATOM_BLOOD_DNA(parent_atom))
- FP.update_appearance()
+ if(!(blood_flags & BLOOD_COVER_TURFS))
+ return
+ change_blood_amount(-1 * blood_used)
+ new_loc_prints = new(new_loc_turf, null, get_blood_dna())
+ new_loc_prints.alpha = 0
+ if(!QDELETED(new_loc_prints)) // prints merged
+ add_blood_to_footprint(new_loc_prints, blood_used, FALSE, no_dna = TRUE)
/**
* Called when the wielder steps in a pool of blood
@@ -239,21 +235,18 @@
/datum/component/bloodysoles/proc/on_step_blood(datum/source, obj/effect/decal/cleanable/pool)
SIGNAL_HANDLER
- if(QDELETED(wielder) || is_obscured())
+ if(QDELETED(wielder) || is_obscured() || (wielder.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
return
- if(istype(pool, /obj/effect/decal/cleanable/blood/footprints) && pool.blood_state == last_blood_state)
- // The pool we stepped in was actually footprints with the same type
- var/obj/effect/decal/cleanable/blood/footprints/pool_FP = pool
- add_parent_to_footprint(pool_FP)
- if((bloody_shoes[last_blood_state] - (bloody_shoes[last_blood_state] * BLOOD_PERCENT_LOSS_ON_STEP)) >= BLOOD_FOOTPRINTS_MIN && !(pool_FP.entered_dirs & wielder.dir))
- // If our feet are bloody enough, add an entered dir
- pool_FP.entered_dirs |= wielder.dir
- pool_FP.update_appearance()
+ /// The character is agile enough to not mess their clothing and hands just from one blood splatter at floor
+ if(HAS_TRAIT(wielder, TRAIT_LIGHT_STEP))
+ return
+
+ // Don't share from other feetprints, not super realistic but I think it ruins the effect a bit
+ if(istype(pool, /obj/effect/decal/cleanable/blood/footprints))
return
share_blood(pool)
-
last_pickup = world.time
/**
@@ -262,63 +255,81 @@
/datum/component/bloodysoles/proc/on_clean(datum/source, clean_types)
SIGNAL_HANDLER
- if(!(clean_types & CLEAN_TYPE_BLOOD) || last_blood_state == BLOOD_STATE_NOT_BLOODY)
+ if(!(clean_types & CLEAN_TYPE_BLOOD))
return NONE
- reset_bloody_shoes()
+ total_bloodiness = 0
update_icon()
return COMPONENT_CLEANED
-
/**
* Like its parent but can be applied to carbon mobs instead of clothing items
*/
/datum/component/bloodysoles/feet
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+
+ equipped_slot = ITEM_SLOT_FEET
var/static/mutable_appearance/bloody_feet
-/datum/component/bloodysoles/feet/Initialize()
+ /// List of DNA on mob's feet, so we can handle it separately from blood on mob's hands
+ var/list/blood_DNA = null
+
+/datum/component/bloodysoles/feet/Initialize(list/new_blood)
if(!iscarbon(parent))
return COMPONENT_INCOMPATIBLE
- parent_atom = parent
+
wielder = parent
- if(footprint_sprite)
- src.footprint_sprite = footprint_sprite
+
if(!bloody_feet)
- bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER, appearance_flags = RESET_COLOR)
- bloody_feet.color = BLOOD_COLOR_RED
+ bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER)
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean))
RegisterSignal(parent, COMSIG_STEP_ON_BLOOD, PROC_REF(on_step_blood))
- RegisterSignal(parent, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(unequip_shoecover))
- RegisterSignal(parent, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(equip_shoecover))
+ RegisterSignals(parent, list(COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_UNEQUIPPED_ITEM), PROC_REF(shoecover))
+
+ if(new_blood)
+ blood_DNA = new_blood
+ update_icon()
+
+/datum/component/bloodysoles/feet/InheritComponent(datum/component/bloodysoles/feet/soles, original, list/new_blood)
+ if (!length(new_blood))
+ return
+
+ LAZYOR(blood_DNA, new_blood)
+ update_icon()
+
+/datum/component/bloodysoles/feet/share_blood(obj/effect/decal/cleanable/pool)
+ . = ..()
+ if (!.)
+ return
+ LAZYOR(blood_DNA, GET_ATOM_BLOOD_DNA(pool))
+ update_icon()
/datum/component/bloodysoles/feet/update_icon()
if(!ishuman(wielder) || HAS_TRAIT(wielder, TRAIT_NO_BLOOD_OVERLAY))
return
- if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
- wielder.remove_overlay(SHOES_LAYER)
- wielder.overlays_standing[SHOES_LAYER] = bloody_feet
- wielder.apply_overlay(SHOES_LAYER)
- else
- wielder.update_worn_shoes()
-/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
+ wielder.remove_overlay(SHOES_LAYER)
+ if(!total_bloodiness || is_obscured())
+ wielder.update_worn_shoes()
+ return
+
+ bloody_feet.color = wielder.get_blood_dna_color()
+ wielder.overlays_standing[SHOES_LAYER] = bloody_feet
+ wielder.apply_overlay(SHOES_LAYER)
+
+/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint)
if(!ishuman(wielder))
- FP.species_types |= "unknown"
+ LAZYSET(footprint.species_types, "unknown", TRUE)
return
// Find any leg of our human and add that to the footprint, instead of the default which is to just add the human type
- for(var/X in wielder.bodyparts)
- var/obj/item/bodypart/affecting = X
- if(affecting.body_part == LEG_RIGHT || affecting.body_part == LEG_LEFT)
- if(!affecting.bodypart_disabled)
- FP.species_types |= affecting.limb_id
- break
+ for(var/obj/item/bodypart/leg/affecting in wielder.bodyparts)
+ if(!affecting.bodypart_disabled)
+ LAZYSET(footprint.species_types, affecting.limb_id, TRUE)
-/datum/component/bloodysoles/feet/is_obscured()
- if(wielder.shoes)
- return TRUE
- return wielder.check_covered_slots() & ITEM_SLOT_FEET
+/datum/component/bloodysoles/feet/is_under_feet_covered()
+ return !isnull(wielder.shoes)
/datum/component/bloodysoles/feet/on_moved(datum/source, OldLoc, Dir, Forced)
if(wielder.num_legs >= 2)
@@ -328,22 +339,36 @@
if(wielder.num_legs >= 2)
return ..()
-/datum/component/bloodysoles/feet/share_blood(obj/effect/decal/cleanable/pool)
- . = ..()
- if(.)
- return
-
- bloody_feet.color = get_blood_dna_color(GET_ATOM_BLOOD_DNA(pool))
- update_icon()
-
-/datum/component/bloodysoles/feet/proc/equip_shoecover(datum/source, obj/item/item)
+/datum/component/bloodysoles/feet/proc/shoecover(datum/source, obj/item/item)
SIGNAL_HANDLER
if ((item.body_parts_covered & FEET) || (item.flags_inv & HIDESHOES))
update_icon()
-/datum/component/bloodysoles/feet/proc/unequip_shoecover(datum/source, obj/item/item)
- SIGNAL_HANDLER
- if ((item.body_parts_covered & FEET) || (item.flags_inv & HIDESHOES))
- update_icon()
+/datum/component/bloodysoles/feet/get_blood_dna()
+ return blood_DNA
-#undef BLOOD_PERCENT_LOSS_ON_STEP
+/**
+ * Simplified version of the kind applied to carbons for simple/basic mobs, primarily robots
+ */
+/datum/component/bloodysoles/bot
+ max_bloodiness = 150
+ share_mod = 0.75
+
+/datum/component/bloodysoles/bot/Initialize()
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ wielder = parent
+ RegisterSignal(wielder, COMSIG_STEP_ON_BLOOD, PROC_REF(on_step_blood))
+
+/datum/component/bloodysoles/bot/is_obscured()
+ return FALSE
+
+/datum/component/bloodysoles/bot/is_under_feet_covered()
+ return FALSE
+
+/datum/component/bloodysoles/bot/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/footprint)
+ LAZYSET(footprint.species_types, "bot", TRUE)
+
+/datum/component/bloodysoles/bot/update_icon()
+ // Future idea: Bot blood overlays
+ return
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index f2b54e6ded4..fbee431755f 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
var/unique_enzymes
///Stores the hashed values of traits such as skin tones, hair style, and gender
var/unique_identity
- /// The singleton blood type
+ ///The blood type datum, usually a singleton
var/datum/blood_type/blood_type
///The type of mutant race the player is if applicable (i.e. potato-man)
var/datum/species/species = new /datum/species/human
@@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
var/list/features = list("mcolor" = COLOR_WHITE)
///Stores the hashed values of the person's non-human features
var/unique_features
- ///Stores the real name of the person who originally got this dna datum. Used primarily for changelings,
+ ///Stores the real name of the person who originally got this dna datum. Used primarily for changelings
var/real_name
///All mutations are from now on here
var/list/mutations = list()
@@ -108,11 +108,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
holder = new_holder
/datum/dna/Destroy()
- if(iscarbon(holder))
- var/mob/living/carbon/cholder = holder
+ if (iscarbon(holder))
+ var/mob/living/carbon/as_carbon = holder
remove_all_mutations() // mutations hold a reference to the dna
- if(cholder.dna == src)
- cholder.dna = null
+ if(as_carbon.dna == src)
+ as_carbon.dna = null
holder = null
QDEL_NULL(species)
@@ -159,7 +159,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
//SKYRAT EDIT ADDITION END
//if the new DNA has a holder, transform them immediately, otherwise save it
if(new_dna.holder)
- new_dna.holder.set_blood_type(blood_type)
+ if (iscarbon(new_dna.holder))
+ var/mob/living/carbon/as_carbon = new_dna.holder
+ as_carbon.set_blood_type(blood_type)
new_dna.holder.set_species(species.type, icon_update = 0)
else
new_dna.blood_type = blood_type
diff --git a/code/datums/elements/blood_reagent.dm b/code/datums/elements/blood_reagent.dm
new file mode 100644
index 00000000000..74c2dff9ba8
--- /dev/null
+++ b/code/datums/elements/blood_reagent.dm
@@ -0,0 +1,224 @@
+/// Element that blood reagents use to apply their data (not blood regen!) to mobs
+/// Only added to blood drawn *from* someone, so don't put behavior that should work with any reagent onto this
+/datum/element/blood_reagent
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 3
+ /// Blood type associated with this element
+ var/datum/blood_type/blood_type
+
+/*
+ * Arguments:
+ * * blood_source - mob this blood came from, can be null
+ * * blood_type - blood type datum we grab data and behavior from, cannot be null
+ */
+/datum/element/blood_reagent/Attach(datum/reagent/target, mob/living/blood_source, datum/blood_type/blood_type)
+ . = ..()
+ if (!istype(target) || !istype(blood_type))
+ return ELEMENT_INCOMPATIBLE
+
+ src.blood_type = blood_type
+ RegisterSignal(target, COMSIG_REAGENT_EXPOSE_MOB, PROC_REF(on_mob_expose))
+ RegisterSignal(target, COMSIG_REAGENT_EXPOSE_TURF, PROC_REF(on_turf_expose))
+ RegisterSignal(target, COMSIG_REAGENT_EXPOSE_OBJ, PROC_REF(on_obj_expose))
+ RegisterSignal(target, COMSIG_REAGENT_ON_MERGE, PROC_REF(on_merge))
+ RegisterSignal(target, COMSIG_REAGENT_ON_TRANSFER, PROC_REF(on_transfer))
+
+ if (!target.data)
+ target.data = list()
+
+ target.data["blood_type"] = blood_type
+ if (blood_type.desc)
+ target.description = blood_type.desc
+ target.color = blood_type.get_color()
+
+ if (!blood_source)
+ return
+
+ var/list/blood_data = blood_source.get_blood_data()
+ if(blood_data["viruses"])
+ var/list/to_preserve = list()
+ for (var/datum/disease/disease in blood_data["viruses"])
+ to_preserve += disease.Copy()
+ blood_data["viruses"] = to_preserve
+
+ for (var/key in blood_data)
+ if (!islist(blood_data[key]))
+ target.data[key] = blood_data[key]
+ continue
+
+ var/list/data_list = blood_data[key]
+ var/list/target_data = target.data[key]
+ if (!target_data)
+ target.data[key] = data_list.Copy()
+ else
+ // Concat viruses, resistances, etc
+ target_data |= data_list
+
+// Shouldn't realistically happen but just in case
+/datum/element/blood_reagent/Detach(datum/reagent/target)
+ . = ..()
+ UnregisterSignal(target, list(
+ COMSIG_REAGENT_EXPOSE_MOB,
+ COMSIG_REAGENT_EXPOSE_TURF,
+ COMSIG_REAGENT_EXPOSE_OBJ,
+ COMSIG_REAGENT_ON_MERGE,
+ COMSIG_REAGENT_ON_TRANSFER,
+ ))
+
+/// Cover the mob in blood and transfer our viruses and resistances to them
+/datum/element/blood_reagent/proc/on_mob_expose(
+ datum/reagent/source,
+ mob/living/exposed_mob,
+ methods = TOUCH,
+ reac_volume,
+ show_message = TRUE,
+ touch_protection = 0,
+)
+ SIGNAL_HANDLER
+
+ if ((methods & (TOUCH | VAPOR)) && reac_volume >= 3 && (blood_type.blood_flags & (BLOOD_ADD_DNA | BLOOD_COVER_MOBS)))
+ exposed_mob.add_blood_DNA(list("[source.data?["blood_DNA"] || blood_type.dna_string]" = blood_type))
+
+ // Somehow got a no-data reagent, probably artificially created blood
+ if (!source.data)
+ return
+
+ if (!(blood_type.blood_flags & BLOOD_TRANSFER_VIRAL_DATA))
+ return
+
+ for(var/datum/disease/strain as anything in source.data["viruses"])
+ if ((strain.spread_flags & DISEASE_SPREAD_SPECIAL) || (strain.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
+ continue
+
+ if (methods & INGEST)
+ if (!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_STOMACH))
+ continue
+ exposed_mob.ForceContractDisease(strain)
+
+ else if (methods & (INJECT|PATCH))
+ if (!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_HEART))
+ continue
+ exposed_mob.ForceContractDisease(strain)
+
+ else if ((methods & (VAPOR|INHALE)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
+ if (!strain.has_required_infectious_organ(exposed_mob, ORGAN_SLOT_LUNGS))
+ continue
+ exposed_mob.ContactContractDisease(strain)
+
+ else if ((methods & TOUCH) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS))
+ exposed_mob.ContactContractDisease(strain)
+
+ /// Have to inject, inhale or ingest it. No curefoam/cheap curesprays
+ if (source.data["resistances"] && (methods & (INGEST|INJECT|INHALE)))
+ for(var/datum/disease/infection in exposed_mob.diseases)
+ if (!infection.bypasses_immunity && (infection.GetDiseaseID() in source.data["resistances"]))
+ infection.cure(add_resistance = FALSE)
+
+/// Create or mix in a blood splatter and transfer our diseases to it
+/datum/element/blood_reagent/proc/on_turf_expose(datum/reagent/source, turf/exposed_turf, reac_volume)
+ SIGNAL_HANDLER
+
+ if (reac_volume < 3 || !(blood_type.blood_flags & (BLOOD_ADD_DNA | BLOOD_COVER_TURFS)))
+ return
+
+ var/dna_list = list("[source.data?["blood_DNA"] || blood_type.dna_string]" = blood_type)
+ var/obj/effect/decal/cleanable/blood/splatter = locate() in exposed_turf
+ if (!splatter)
+ if (!(blood_type.blood_flags & BLOOD_COVER_TURFS))
+ return
+ splatter = new(exposed_turf, (blood_type.blood_flags & BLOOD_TRANSFER_VIRAL_DATA) ? source.data?["viruses"] : null, dna_list)
+ splatter.adjust_bloodiness(-splatter.bloodiness + reac_volume / BLOOD_TO_UNITS_MULTIPLIER)
+ return
+
+ splatter.add_blood_DNA(dna_list)
+ if (blood_type.blood_flags & BLOOD_COVER_TURFS)
+ splatter.adjust_bloodiness(reac_volume / BLOOD_TO_UNITS_MULTIPLIER)
+
+ if (!(blood_type.blood_flags & BLOOD_TRANSFER_VIRAL_DATA) || !source.data?["viruses"])
+ return
+
+ var/list/viruses_to_add = list()
+ for(var/datum/disease/virus in source.data["viruses"])
+ if (virus.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)
+ viruses_to_add += virus
+
+ if (length(viruses_to_add))
+ splatter.AddComponent(/datum/component/infective, viruses_to_add)
+
+/datum/element/blood_reagent/proc/on_obj_expose(datum/reagent/source, obj/exposed_obj, reac_volume, methods = TOUCH, show_message = TRUE)
+ SIGNAL_HANDLER
+
+ if (reac_volume < 3 || !(methods & (VAPOR | TOUCH)))
+ return
+
+ if (blood_type.blood_flags & (BLOOD_ADD_DNA | BLOOD_COVER_ITEMS))
+ exposed_obj.add_blood_DNA(list(list("[source.data?["blood_DNA"] || blood_type.dna_string]" = blood_type) = blood_type))
+
+ if (!(blood_type.blood_flags & BLOOD_TRANSFER_VIRAL_DATA) || !source.data?["viruses"])
+ return
+
+ var/list/viruses_to_add = list()
+ for (var/datum/disease/virus in source.data["viruses"])
+ if (virus.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)
+ viruses_to_add += virus
+
+ if (length(viruses_to_add))
+ exposed_obj.AddComponent(/datum/component/infective, viruses_to_add)
+
+/datum/element/blood_reagent/proc/on_merge(datum/reagent/source, list/mix_data, amount)
+ SIGNAL_HANDLER
+
+ // Presumably artificially generated blood
+ if (!source.data || !mix_data)
+ return
+
+ // Mixed blood cannot be used for cloning
+ if (source.data["blood_DNA"] != mix_data["blood_DNA"])
+ source.data["cloneable"] = FALSE
+
+ var/list/source_viruses = source.data["viruses"]
+ var/list/mix_viruses = mix_data["viruses"]
+ if (source_viruses && mix_viruses)
+ var/list/mix_target = list()
+ var/list/to_preserve = list()
+ for (var/datum/disease/disease as anything in source_viruses)
+ if (istype(disease, /datum/disease/advance))
+ mix_target += disease
+ else
+ to_preserve += disease
+
+ for (var/datum/disease/disease as anything in mix_viruses)
+ if (istype(disease, /datum/disease/advance))
+ mix_target += disease
+ else
+ to_preserve += disease
+
+ var/datum/disease/advance/disease = Advance_Mix(mix_target)
+ if (disease)
+ to_preserve += disease
+ source.data["viruses"] = to_preserve
+ else if (mix_viruses)
+ source.data["viruses"] = mix_viruses.Copy()
+
+ if (mix_data["resistances"])
+ if (!source.data["resistances"])
+ source.data["resistances"] = list()
+ source.data["resistances"] |= mix_data["resistances"]
+
+ // Features are randomly recombinated based on amount mixed in
+ var/list/source_features = source.data["features"]
+ var/list/mix_features = mix_data["features"]
+ if (source_features && mix_features)
+ for (var/feature_key in mix_features)
+ if (!source_features[feature_key] || prob(amount / (source.volume + amount) * 100))
+ source_features[feature_key] = mix_features[feature_key]
+
+ if (mix_data["trace_chem"])
+ if (!source.data["trace_chem"])
+ source.data["trace_chem"] = mix_data["trace_chem"]
+ else
+ source.data["trace_chem"] = list2params(params2list(source.data["trace_chem"]) | params2list(mix_data["trace_chem"]))
+
+/datum/element/blood_reagent/proc/on_transfer(datum/reagent/reagent, datum/reagents/target_holder, datum/reagent/new_reagent)
+ SIGNAL_HANDLER
+ new_reagent.AddElement(/datum/element/blood_reagent, null, blood_type)
diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm
index 11f011a2e75..801a0bd7b52 100644
--- a/code/datums/elements/decals/blood.dm
+++ b/code/datums/elements/decals/blood.dm
@@ -1,17 +1,20 @@
/datum/element/decal/blood
/// Whenever the parent atom has a color filter applied to it, and thus needs additional overlay handling
var/uses_filter = FALSE
+ /// Emissive alpha of our parent
+ var/emissive_alpha = null
-/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _plane, _layer, _alpha, _color, _smoothing, _cleanable=CLEAN_TYPE_BLOOD, _description, mutable_appearance/_pic, _uses_filter)
+/datum/element/decal/blood/Attach(datum/target, _icon, _icon_state, _dir, _plane, _layer, _alpha, _color, _smoothing, _cleanable = CLEAN_TYPE_BLOOD, _description, mutable_appearance/_pic, _uses_filter, _emissive)
if (!isitem(target))
return ELEMENT_INCOMPATIBLE
var/obj/item/as_item = target
if (_uses_filter != !isnull(as_item.cached_color_filter))
- as_item.AddElement(type, _icon, _icon_state, _dir, _plane, _layer, _alpha, _color, _smoothing, _cleanable, _description, _pic, !isnull(as_item.cached_color_filter))
+ as_item.AddElement(type, _icon, _icon_state, _dir, _plane, _layer, _alpha, _color, _smoothing, _cleanable, _description, _pic, !isnull(as_item.cached_color_filter), _emissive)
return
uses_filter = _uses_filter
+ emissive_alpha = _emissive
. = ..()
RegisterSignal(as_item, COMSIG_ATOM_GET_EXAMINE_NAME, PROC_REF(get_examine_name), TRUE)
RegisterSignal(as_item, COMSIG_ATOM_COLOR_UPDATED, PROC_REF(on_color_update), TRUE)
@@ -26,25 +29,40 @@
/datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color = BLOOD_COLOR_RED, _alpha, _smoothing, source)
var/obj/item/as_item = source
ADD_KEEP_TOGETHER(as_item, type)
- var/icon/icon_for_size = icon(as_item.icon, as_item.icon_state)
- var/scale_factor_x = icon_for_size.Width()/ICON_SIZE_X
- var/scale_factor_y = icon_for_size.Height()/ICON_SIZE_Y
+ var/scale_factor_x = as_item.get_cached_width() / ICON_SIZE_X
+ var/scale_factor_y = as_item.get_cached_height() / ICON_SIZE_Y
var/mutable_appearance/blood_splatter = mutable_appearance('icons/effects/blood.dmi', "itemblood", appearance_flags = RESET_COLOR) //MA of the blood that we apply
blood_splatter.transform = blood_splatter.transform.Scale(scale_factor_x, scale_factor_y)
blood_splatter.blend_mode = BLEND_INSET_OVERLAY
blood_splatter.color = _color
+ var/mutable_appearance/emissive_splatter = null
+ if (emissive_alpha)
+ emissive_splatter = emissive_appearance('icons/effects/blood.dmi', "itemblood", as_item, alpha = emissive_alpha)
+ emissive_splatter.blend_mode = BLEND_INSET_OVERLAY
if (uses_filter)
blood_splatter.appearance_flags |= KEEP_APART
if (!as_item.render_target)
as_item.render_target = "blood_target_[REF(as_item)]"
blood_splatter.add_filter("blood_cutout", -1, alpha_mask_filter(render_source = as_item.render_target))
+ if (emissive_splatter)
+ emissive_splatter.add_filter("blood_cutout", -1, alpha_mask_filter(render_source = as_item.render_target))
+ if (emissive_splatter)
+ blood_splatter.overlays += emissive_splatter
pic = blood_splatter
return TRUE
/datum/element/decal/blood/proc/get_examine_name(atom/source, mob/user, list/override)
SIGNAL_HANDLER
- override[EXAMINE_POSITION_BEFORE] = "blood-stained"
+ var/list/blood_stains = GET_ATOM_BLOOD_DECALS(source)
+ if (!length(blood_stains))
+ return
+ var/datum/blood_type/blood_type = blood_stains[blood_stains[length(blood_stains)]]
+ var/blood_descriptor = "blood"
+ if(istype(blood_type))
+ blood_descriptor = LOWER_TEXT(blood_type.get_blood_name())
+
+ override[EXAMINE_POSITION_BEFORE] = "[blood_descriptor]-stained"
/datum/element/decal/blood/proc/on_color_update(obj/item/source, color_updated)
SIGNAL_HANDLER
diff --git a/code/datums/elements/easy_ignite.dm b/code/datums/elements/easy_ignite.dm
new file mode 100644
index 00000000000..4304df0890c
--- /dev/null
+++ b/code/datums/elements/easy_ignite.dm
@@ -0,0 +1,108 @@
+/// Creates a hotspot and deletes the owner atom upon being exposed to high temperatures, by Melbert
+/datum/element/easy_ignite
+ element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE // because turfs
+ argument_hash_start_idx = 2
+ /// Temp required for ignition
+ var/required_temp = 480
+
+/datum/element/easy_ignite/Attach(datum/target, required_temp = 480)
+ . = ..()
+ if(!isatom(target) || isarea(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.required_temp = required_temp
+ RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(attackby_react))
+ RegisterSignal(target, COMSIG_ATOM_FIRE_ACT, PROC_REF(flame_react))
+ RegisterSignal(target, COMSIG_ATOM_BULLET_ACT, PROC_REF(projectile_react))
+ RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(welder_react))
+ if(isturf(target))
+ RegisterSignal(target, COMSIG_TURF_EXPOSE, PROC_REF(hotspots_react))
+
+/datum/element/easy_ignite/Detach(datum/source, ...)
+ . = ..()
+ UnregisterSignal(source, COMSIG_ATOM_ITEM_INTERACTION)
+ UnregisterSignal(source, COMSIG_ATOM_FIRE_ACT)
+ UnregisterSignal(source, COMSIG_ATOM_BULLET_ACT)
+ UnregisterSignal(source, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER))
+ if(isturf(source))
+ UnregisterSignal(source, COMSIG_TURF_EXPOSE)
+
+/datum/element/easy_ignite/proc/ignite(atom/igniting, mob/user)
+ var/delete_after = TRUE
+
+ igniting.visible_message(span_warning("[igniting] catch[igniting.p_es()] fire!"), span_warning("You ignite into flames!"))
+ new /obj/effect/hotspot(isturf(igniting) ? igniting : igniting.loc)
+
+ if(isturf(igniting))
+ var/turf/parent_turf = igniting
+ parent_turf.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ delete_after = FALSE
+
+ // Logging-related
+ var/log_message = "ignited [igniting]"
+ if(user)
+ user.log_message(log_message, LOG_ATTACK, log_globally = FALSE)//only individual log
+
+ else
+ log_message = "[key_name(user)] " + log_message + " by fire"
+ log_attack(log_message)
+
+ if(delete_after && !QDELETED(igniting))
+ qdel(igniting)
+
+/datum/element/easy_ignite/proc/flame_react(obj/item/source, exposed_temperature, exposed_volume)
+ SIGNAL_HANDLER
+
+ if(exposed_temperature > required_temp)
+ ignite(source)
+
+/datum/element/easy_ignite/proc/hotspots_react(obj/item/source, air, exposed_temperature)
+ SIGNAL_HANDLER
+
+ if(exposed_temperature > required_temp)
+ ignite(source)
+
+/datum/element/easy_ignite/proc/attackby_react(obj/item/source, mob/user, obj/item/tool, modifiers)
+ SIGNAL_HANDLER
+
+ if(!tool.get_temperature())
+ return NONE
+
+ if (!item_ignition(source, tool, user))
+ return ITEM_INTERACT_BLOCKING
+
+ ignite(source, user)
+ return ITEM_INTERACT_SUCCESS
+
+/datum/element/easy_ignite/proc/projectile_react(obj/item/source, obj/projectile/shot)
+ SIGNAL_HANDLER
+
+ if(shot.damage_type == BURN && shot.damage > 0)
+ ignite(source, shot.firer)
+
+/datum/element/easy_ignite/proc/welder_react(obj/item/source, mob/user, obj/item/tool)
+ SIGNAL_HANDLER
+
+ if(!tool.get_temperature())
+ return NONE
+
+ if (!item_ignition(source, tool, user))
+ return ITEM_INTERACT_BLOCKING
+
+ ignite(source, user)
+ return ITEM_INTERACT_SUCCESS
+
+/datum/element/easy_ignite/proc/item_ignition(obj/item/source, obj/item/tool, mob/user)
+ if(tool.get_temperature() >= required_temp)
+ source.visible_message(
+ span_warning("[user] ignites [source] with [tool]!"),
+ span_warning("You ignite [source] with [tool]!"),
+ )
+ ignite(source, user)
+ return TRUE
+
+ source.visible_message(
+ span_warning("[user] tries to ignite [source] with [tool]!"),
+ span_warning("You try to ignite [source] with [tool], but it's not hot enough!"),
+ )
+ return FALSE
diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm
index 175772d01a7..7eeb88144e5 100644
--- a/code/datums/materials/meat.dm
+++ b/code/datums/materials/meat.dm
@@ -52,8 +52,6 @@
source.AddComponent(
/datum/component/bloody_spreader,\
blood_left = (protein_count + fat_count) * 0.3,\
- blood_dna = list("meaty DNA" = get_blood_type(BLOOD_TYPE_MEAT)),\
- diseases = null,\
)
// Turfs can't handle the meaty goodness of blood walk.
diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm
index 28f6ee82c7b..190dc84f72e 100644
--- a/code/datums/mutations/touch.dm
+++ b/code/datums/mutations/touch.dm
@@ -317,8 +317,11 @@
var/blood_to_hurtguy = min(max_blood_transfer, max_blood_to_hurtguy)
if(!blood_to_hurtguy)
return .
+
// We ignore incompatibility here.
- mendicant.transfer_blood_to(hurtguy, blood_to_hurtguy, forced = TRUE)
+ if(!mendicant.transfer_blood_to(hurtguy, blood_to_hurtguy, forced = TRUE, ignore_incompatibility = TRUE))
+ return
+
to_chat(mendicant, span_notice("Your veins (and brain) feel a bit lighter."))
. = TRUE
// Because we do our own spin on it!
@@ -327,23 +330,28 @@
to_chat(hurtguy, span_notice("Your veins feel thicker, but they itch a bit."))
else
to_chat(hurtguy, span_notice("Your veins feel thicker!"))
+ return
+
+ if(hurtguy.blood_volume < BLOOD_VOLUME_MAXIMUM)
+ return
// Too MUCH blood
- if(hurtguy.blood_volume > BLOOD_VOLUME_MAXIMUM)
- var/max_blood_to_mendicant = BLOOD_VOLUME_EXCESS - hurtguy.blood_volume
- var/blood_to_mendicant = min(max_blood_transfer, max_blood_to_mendicant)
- // mender always gonna have blood
+ var/max_blood_to_mendicant = BLOOD_VOLUME_EXCESS - hurtguy.blood_volume
+ var/blood_to_mendicant = min(max_blood_transfer, max_blood_to_mendicant)
+ // mender always gonna have blood
- // We ignore incompatibility here.
- hurtguy.transfer_blood_to(mendicant, hurtguy.blood_volume - BLOOD_VOLUME_EXCESS, forced = TRUE)
- to_chat(hurtguy, span_notice("Your veins don't feel quite so swollen anymore."))
- . = TRUE
- // Because we do our own spin on it!
- if(mendicant.get_blood_compatibility(hurtguy) == FALSE)
- mendicant.adjustToxLoss((blood_to_mendicant * 0.1) * pain_multiplier) // 1 dmg per 10 blood
- to_chat(mendicant, span_notice("Your veins swell and itch!"))
- else
- to_chat(mendicant, span_notice("Your veins swell!"))
+ // We ignore incompatibility here.
+ if(!hurtguy.transfer_blood_to(mendicant, hurtguy.blood_volume - BLOOD_VOLUME_EXCESS, forced = TRUE, ignore_incompatibility = TRUE))
+ return
+
+ to_chat(hurtguy, span_notice("Your veins don't feel quite so swollen anymore."))
+ . = TRUE
+ // Because we do our own spin on it!
+ if(mendicant.get_blood_compatibility(hurtguy) == FALSE)
+ mendicant.adjustToxLoss((blood_to_mendicant * 0.1) * pain_multiplier) // 1 dmg per 10 blood
+ to_chat(mendicant, span_notice("Your veins swell and itch!"))
+ else
+ to_chat(mendicant, span_notice("Your veins swell!"))
/datum/action/cooldown/spell/touch/lay_on_hands/proc/determine_if_this_hurts_instead(mob/living/carbon/mendicant, mob/living/hurtguy)
diff --git a/code/datums/quirks/negative_quirks/addict.dm b/code/datums/quirks/negative_quirks/addict.dm
index f943ea9bb94..2136e319244 100644
--- a/code/datums/quirks/negative_quirks/addict.dm
+++ b/code/datums/quirks/negative_quirks/addict.dm
@@ -203,7 +203,7 @@
/datum/quirk/item_quirk/addict/alcoholic/post_add()
. = ..()
- RegisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK, PROC_REF(check_brandy))
+ RegisterSignal(quirk_holder, COMSIG_MOB_REAGENT_TICK, PROC_REF(check_brandy))
var/obj/item/reagent_containers/brandy_container = drug_container_type
if(isnull(brandy_container))
stack_trace("Alcoholic quirk added while the GLOB.possible_alcoholic_addictions is (somehow) not initialized!")
@@ -218,7 +218,7 @@
alcohol_liver.healing_factor = alcohol_liver.healing_factor * 0.75
/datum/quirk/item_quirk/addict/alcoholic/remove()
- UnregisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_REAGENT_TICK)
/datum/quirk/item_quirk/addict/alcoholic/proc/check_brandy(mob/source, datum/reagent/booze)
SIGNAL_HANDLER
diff --git a/code/datums/quirks/negative_quirks/blood_deficiency.dm b/code/datums/quirks/negative_quirks/blood_deficiency.dm
index c65208ca9dd..bacdcff80ea 100644
--- a/code/datums/quirks/negative_quirks/blood_deficiency.dm
+++ b/code/datums/quirks/negative_quirks/blood_deficiency.dm
@@ -17,11 +17,11 @@
var/mob/living/carbon/human/human_holder = quirk_holder
if(!istype(human_holder))
return
- update_mail(human_quirk_holder = human_holder, new_blood_type = human_holder.dna.blood_type) // matches the mail goodies blood bag to our blood type
- RegisterSignal(quirk_holder, COMSIG_LIVING_CHANGED_BLOOD_TYPE, PROC_REF(update_mail))
+ update_mail(human_quirk_holder = human_holder, new_blood_type = human_holder.get_bloodtype()) // matches the mail goodies blood bag to our blood type
+ RegisterSignal(quirk_holder, COMSIG_CARBON_CHANGED_BLOOD_TYPE, PROC_REF(update_mail))
/datum/quirk/blooddeficiency/remove()
- UnregisterSignal(quirk_holder, list(COMSIG_HUMAN_ON_HANDLE_BLOOD, COMSIG_LIVING_CHANGED_BLOOD_TYPE))
+ UnregisterSignal(quirk_holder, list(COMSIG_HUMAN_ON_HANDLE_BLOOD, COMSIG_CARBON_CHANGED_BLOOD_TYPE))
/datum/quirk/blooddeficiency/is_species_appropriate(datum/species/mob_species)
var/datum/species_traits = GLOB.species_prototypes[mob_species].inherent_traits
@@ -37,20 +37,17 @@
var/mob/living/carbon/human/human_holder = quirk_holder
if(human_holder.stat == DEAD || human_holder.blood_volume <= min_blood)
return
- // This exotic blood check is solely to snowflake slimepeople into working with this quirk
- if(HAS_TRAIT(quirk_holder, TRAIT_NOBLOOD) && isnull(human_holder.dna.species.exotic_blood))
- return
- human_holder.blood_volume = max(min_blood, human_holder.blood_volume - human_holder.dna.species.blood_deficiency_drain_rate * seconds_per_tick)
+ if(!HAS_TRAIT(quirk_holder, TRAIT_NOBLOOD))
+ human_holder.blood_volume = max(min_blood, human_holder.blood_volume - human_holder.dna.species.blood_deficiency_drain_rate * seconds_per_tick)
/// Try to update the mail goodies to match the quirk holder's blood type. If we fail for whatever reason then it will just default to the initial O- blood pack that we start with.
/datum/quirk/blooddeficiency/proc/update_mail(mob/living/carbon/human/human_quirk_holder, datum/blood_type/new_blood_type, update_cached_blood_dna_info)
SIGNAL_HANDLER
- if(isnull(human_quirk_holder.dna.species.exotic_blood) && isnull(human_quirk_holder.dna.species.exotic_bloodtype))
- if(TRAIT_NOBLOOD in human_quirk_holder.dna.species.inherent_traits) // jellypeople have both exotic_blood and TRAIT_NOBLOOD
- mail_goodies.Cut()
- return
+ if(TRAIT_NOBLOOD in human_quirk_holder.dna.species.inherent_traits)
+ mail_goodies.Cut()
+ return
if(isnull(new_blood_type))
return
diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm
index 9414242fcf6..3e6bc6f0549 100644
--- a/code/datums/records/manifest.dm
+++ b/code/datums/records/manifest.dm
@@ -129,7 +129,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
var/datum/record/locked/lockfile = new(
age = person.age,
chrono_age = person.chrono_age, // SKYRAT EDIT ADDITION - Chronological age
- blood_type = record_dna.blood_type.name,
+ blood_type = person.get_bloodtype()?.name || "UNKNOWN",
character_appearance = character_appearance,
dna_string = record_dna.unique_enzymes,
fingerprint = md5(record_dna.unique_identity),
@@ -151,7 +151,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
new /datum/record/crew(
age = person.age,
chrono_age = person.chrono_age, // SKYRAT EDIT ADDITION - Chronological age
- blood_type = record_dna.blood_type.name,
+ blood_type = person.get_bloodtype()?.name || "UNKNOWN",
character_appearance = character_appearance,
dna_string = record_dna.unique_enzymes,
fingerprint = md5(record_dna.unique_identity),
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index a50ef89b714..30c04976e01 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -164,12 +164,8 @@
bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += (15 * severity * (limb.current_gauze?.splint_factor || 1))
/datum/wound/blunt/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus)
- if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE)
+ if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE || !victim.can_bleed())
return
- if(ishuman(victim))
- var/mob/living/carbon/human/human_victim = victim
- if(HAS_TRAIT(human_victim, TRAIT_NOBLOOD))
- return
if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound
diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm
index f278b29f6b8..0e913d9be6a 100644
--- a/code/game/atom/_atom.dm
+++ b/code/game/atom/_atom.dm
@@ -121,7 +121,11 @@
var/datum/ai_controller/ai_controller
/// forensics datum, contains fingerprints, fibres, blood_dna and hiddenprints on this atom
- var/datum/forensics/forensics
+ var/datum/forensics/forensics = null
+ /// Cached color for all blood on us to avoid doing constant math
+ var/cached_blood_color = null
+ /// Cached emissive alpha for all blood on us to avoid doing constant math
+ var/cached_blood_emissive = null
/// How this atom should react to having its astar blocking checked
var/can_astar_pass = CANASTARPASS_DENSITY
@@ -488,21 +492,21 @@
///returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
/mob/living/proc/get_blood_dna_list()
- if(get_blood_id() != /datum/reagent/blood)
+ var/datum/blood_type/blood_type = get_bloodtype()
+ if (!blood_type)
return
- return list("ANIMAL DNA" = get_blood_type(BLOOD_TYPE_ANIMAL))
+
+ return list(blood_type.dna_string = blood_type)
///Get the mobs dna list
/mob/living/carbon/get_blood_dna_list()
- var/list/blood_dna = list()
- if(dna)
- blood_dna[dna.unique_enzymes] = dna.blood_type
- else
- blood_dna["UNKNOWN DNA"] = get_blood_type(BLOOD_TYPE_XENO)
- return blood_dna
+ var/datum/blood_type/blood_type = get_bloodtype()
+ if (!blood_type)
+ return
-/mob/living/carbon/alien/get_blood_dna_list()
- return list("UNKNOWN DNA" = get_blood_type(BLOOD_TYPE_XENO))
+ if (dna?.unique_enzymes)
+ return list(dna.unique_enzymes = blood_type)
+ return list(blood_type.dna_string = blood_type)
/mob/living/silicon/get_blood_dna_list()
return
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index fe10a55d8bf..17ee25c0c0d 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -1258,7 +1258,7 @@
"UE"=scanner_occupant.dna.unique_enzymes,
"UF"=scanner_occupant.dna.unique_features,
"name"=scanner_occupant.real_name,
- "blood_type"=scanner_occupant.dna.blood_type)
+ "blood_type"=scanner_occupant.get_bloodtype()?.name)
return
diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm
index b0f36acbfe0..0c7498888a6 100644
--- a/code/game/machinery/computer/operating_computer.dm
+++ b/code/game/machinery/computer/operating_computer.dm
@@ -123,7 +123,7 @@
data["patient"]["stat"] = "Dead"
data["patient"]["statstate"] = "bad"
data["patient"]["health"] = patient.health
- data["patient"]["blood_type"] = patient.dna?.blood_type.name
+ data["patient"]["blood_type"] = patient.get_bloodtype()?.name || "UNKNOWN"
data["patient"]["maxHealth"] = patient.maxHealth
data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
data["patient"]["bruteLoss"] = patient.getBruteLoss()
diff --git a/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm b/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm
index 6002ee0476f..681dd8c6ccd 100644
--- a/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm
+++ b/code/game/machinery/experimental_cloner/experimental_cloner_fuckup.dm
@@ -136,7 +136,7 @@
span_boldwarning("[victim]'s flesh slithers off in a disgusting heap!"),\
span_boldwarning("As you emerge from the pod, your skin slithers off onto the ground!"))
victim.set_species(/datum/species/skeleton)
- new /obj/effect/gibspawner/human/bodypartless(victim.drop_location())
+ new /obj/effect/gibspawner/human/bodypartless(victim.drop_location(), victim)
/// Become a psyker, possibly the worst fate on this list
/datum/experimental_cloner_fuckup/psykerize
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index a7603303f8d..2a968b7651c 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -236,8 +236,9 @@
var/bleed_status = "Patient is not currently bleeding."
var/blood_status = " Patient either has no blood, or does not require it to function."
- var/blood_percent = round((patient.blood_volume / BLOOD_VOLUME_NORMAL)*100)
- var/datum/blood_type/blood_type = patient.dna.blood_type
+ var/blood_percent = round((patient.blood_volume / BLOOD_VOLUME_NORMAL) * 100)
+ var/datum/blood_type/blood_type = patient.get_bloodtype()
+ var/blood_name = "error"
var/blood_warning = " "
var/blood_alcohol = patient.get_blood_alcohol_content()
@@ -247,14 +248,30 @@
sickness = "Warning: Patient is harboring some form of viral disease. Seek further medical attention."
sickness_data = "\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]"
- if(!HAS_TRAIT(patient, TRAIT_GENELESS) && !HAS_TRAIT(patient, TRAIT_NOBLOOD)) //Blood levels Information
+ if(patient.can_bleed()) //Blood levels Information
+ blood_name = LOWER_TEXT(blood_type.get_blood_name())
if(patient.is_bleeding())
- bleed_status = "Patient is currently bleeding!"
+ bleed_status = " Patient is currently bleeding!"
+
if(blood_percent <= 80)
- blood_warning = " Patient has low blood levels. Seek a large meal, or iron supplements."
- if(blood_percent <= 60)
- blood_warning = " Patient has DANGEROUSLY low blood levels. Seek a blood transfusion, iron supplements, or saline glucose immedietly. Ignoring treatment may lead to death!"
- blood_status = "Patient blood levels are currently reading [blood_percent]%. Patient has [ blood_type.name] type blood. [blood_warning]"
+ blood_warning = " Patient has [blood_percent <= 60 ? "DANGEROUSLY low" : "low"] [blood_name] levels."
+ var/list/treatments = list()
+ if(blood_percent <= 60)
+ treatments += "[blood_name] transfusion"
+ else if(!HAS_TRAIT(patient, TRAIT_NOHUNGER))
+ treatments += "a large meal"
+ if(blood_type.restoration_chem)
+ treatments += "[LOWER_TEXT(blood_type.restoration_chem::name)] supplements"
+ if(blood_percent <= 60 && blood_type.restoration_chem == /datum/reagent/iron)
+ treatments += "saline-glucose immediately"
+
+ if (length(treatments))
+ blood_warning += " Seek [english_list(treatments, and_text = " or ")]"
+
+ if (blood_percent <= 60)
+ blood_warning += " Ignoring treatment may lead to death!"
+
+ blood_status = "Patient [blood_name] levels are currently reading [blood_percent]%.[blood_type.get_type() ? " Patient has [blood_type.get_type()] type [blood_name]." : ""][blood_warning]"
var/trauma_status = "Patient is free of unique brain trauma."
var/brain_loss = patient.get_organ_loss(ORGAN_SLOT_BRAIN)
@@ -361,6 +378,7 @@
data["patient_illness"] = sickness
data["illness_info"] = sickness_data
data["bleed_status"] = bleed_status
+ data["blood_name"] = capitalize(blood_name)
data["blood_levels"] = blood_percent - (chaos_modifier * (rand(1,35)))
data["blood_status"] = blood_status
data["blood_alcohol"] = blood_alcohol
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index f8986806892..af163f21a80 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -105,15 +105,11 @@
/obj/machinery/recycler/update_overlays()
. = ..()
- if(!bloody)
+ if(!bloody || !GET_ATOM_BLOOD_DECAL_LENGTH(src))
return
var/mutable_appearance/blood_overlay = mutable_appearance(icon, "[icon_state]bld", appearance_flags = RESET_COLOR|KEEP_APART)
- var/blood_dna = GET_ATOM_BLOOD_DNA(src)
- if(blood_dna)
- blood_overlay.color = get_blood_dna_color(blood_dna)
- else
- blood_overlay.color = BLOOD_COLOR_RED
+ blood_overlay.color = get_blood_dna_color()
. += blood_overlay
/obj/machinery/recycler/CanAllowThrough(atom/movable/mover, border_dir)
@@ -263,9 +259,9 @@
if(iscarbon(living_mob))
if(living_mob.stat == CONSCIOUS)
living_mob.say("ARRRRRRRRRRRGH!!!", forced= "recycler grinding")
- add_mob_blood(living_mob)
- if(!bloody && !issilicon(living_mob))
+ if(!issilicon(living_mob))
+ add_mob_blood(living_mob)
bloody = TRUE
// Instantly lie down, also go unconscious from the pain, before you die.
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 5a8b137c701..f9fb183e53e 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -50,7 +50,7 @@
/obj/machinery/blackbox_recorder/Destroy()
if(stored)
stored.forceMove(loc)
- new /obj/effect/decal/cleanable/oil(loc)
+ new /obj/effect/decal/cleanable/blood/oil(loc)
return ..()
/obj/machinery/blackbox_recorder/update_icon_state()
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index c267c0092d7..adcd251402a 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -1,15 +1,12 @@
/obj/effect/decal/cleanable
gender = PLURAL
layer = CLEANABLE_FLOOR_OBJECT_LAYER
+ flags_1 = UNPAINTABLE_1
var/list/random_icon_states = null
- ///I'm sorry but cleanable/blood code is ass, and so is blood_DNA
- var/blood_state = ""
- ///0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
- var/bloodiness = 0
- ///When two of these are on a same tile or do we need to merge them into just one?
+ /// When two of these are on a same tile or do we need to merge them into just one?
var/mergeable_decal = TRUE
var/beauty = 0
- ///The type of cleaning required to clean the decal. See __DEFINES/cleaning.dm for the options
+ /// The type of cleaning required to clean the decal. See __DEFINES/cleaning.dm for the options
var/clean_type = CLEAN_TYPE_LIGHT_DECAL
///The reagent this decal holds. Leave blank for none.
var/datum/reagent/decal_reagent
@@ -19,6 +16,106 @@
/// Set to FALSE for things that hang high on the walls or things which generally shouldn't be mopped up
var/is_mopped = TRUE
+/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ if (LAZYLEN(random_icon_states))
+ icon_state = pick(random_icon_states)
+ base_icon_state = icon_state
+
+ if (isturf(loc))
+ for (var/obj/effect/decal/cleanable/other in loc)
+ if (other != src && other.type == type && !QDELETED(other) && replace_decal(other))
+ handle_merge_decal(other)
+ return INITIALIZE_HINT_QDEL
+
+ if (is_mopped)
+ ADD_TRAIT(src, TRAIT_MOPABLE, INNATE_TRAIT)
+
+ if (LAZYLEN(diseases))
+ add_diseases(diseases)
+
+ AddElement(/datum/element/beauty, beauty)
+
+ var/turf/our_turf = get_turf(src)
+ if (our_turf && is_station_level(our_turf.z))
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
+
+/obj/effect/decal/cleanable/Destroy()
+ var/turf/our_turf = get_turf(src)
+ if (our_turf && is_station_level(our_turf.z))
+ SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
+ return ..()
+
+/obj/effect/decal/cleanable/proc/add_diseases(list/datum/disease/diseases)
+ var/list/datum/disease/diseases_to_add = list()
+ for (var/datum/disease/disease as anything in diseases)
+ if (disease.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)
+ diseases_to_add += disease
+ if (LAZYLEN(diseases_to_add))
+ AddComponent(/datum/component/infective, diseases_to_add)
+
+/// Check if we should give up in favor of the pre-existing decal
+/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/other)
+ if (mergeable_decal)
+ return TRUE
+
+/obj/effect/decal/cleanable/wash(clean_types)
+ . = ..()
+ if (. || (clean_types & clean_type))
+ qdel(src)
+ return TRUE
+
+/obj/effect/decal/cleanable/proc/handle_merge_decal(obj/effect/decal/cleanable/merger)
+ if (!reagents && !decal_reagent)
+ return
+
+ if (!reagents && !merger.reagents && (!merger.decal_reagent || merger.decal_reagent == decal_reagent))
+ merger.decal_reagent = decal_reagent
+ merger.reagent_amount += reagent_amount
+ else if (lazy_init_reagents() && merger.lazy_init_reagents())
+ merger.reagents.maximum_volume += reagents.total_volume
+ reagents.trans_to(merger, reagents.total_volume)
+
+/// Returns reagents datum if it exists, or lazyloads one if it doesn't
+/obj/effect/decal/cleanable/proc/lazy_init_reagents()
+ if (reagents)
+ return reagents
+
+ if (!decal_reagent)
+ return
+
+ create_reagents(reagent_amount)
+ reagents.add_reagent(decal_reagent, reagent_amount)
+
+/obj/effect/decal/cleanable/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ // Why are rags cups???
+ if (!istype(tool, /obj/item/reagent_containers/cup) || istype(tool, /obj/item/rag))
+ return NONE
+
+ if (!lazy_init_reagents())
+ to_chat(user, span_notice("[src] isn't thick enough to scoop up!"))
+ return ITEM_INTERACT_BLOCKING
+
+ if (!reagents.trans_to(tool, reagents.total_volume, transferred_by = user))
+ to_chat(user, span_warning("[tool] is full!"))
+ return ITEM_INTERACT_BLOCKING
+
+ to_chat(user, span_notice("You scoop up [reagents.total_volume > 0 ? "some of " : ""]\the [src] into \the [tool]!"))
+ if (!reagents.total_volume) //scooped up all of it
+ qdel(src)
+ return ITEM_INTERACT_SUCCESS
+
+/// Checks if this decal can be bloodcrawled in
+/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
+ if (decal_reagent == /datum/reagent/blood || reagents?.has_reagent(/datum/reagent/blood))
+ return TRUE
+
+ var/list/blood_DNA = GET_ATOM_BLOOD_DECALS(src)
+ for (var/blood_key in blood_DNA)
+ var/datum/blood_type/blood_type = blood_DNA[blood_key]
+ if (blood_type.reagent_type == /datum/reagent/blood)
+ return TRUE
+
/// Creates a cleanable decal on a turf
/// Use this if your decal is one of one, and thus we should not spawn it if it's there already
/// Returns either the existing cleanable, the one we created, or null if we can't spawn on that turf
@@ -32,129 +129,6 @@
// There is no need to spam unique cleanables, they don't stack and it just chews cpu
var/obj/effect/decal/cleanable/existing = locate(cleanable_type) in checkturf
- if(existing)
+ if (existing)
return existing
return new cleanable_type(checkturf)
-
-/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
- . = ..()
- if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
- icon_state = pick(random_icon_states)
- create_reagents(300)
- if(decal_reagent)
- reagents.add_reagent(decal_reagent, reagent_amount)
- if(loc && isturf(loc))
- for(var/obj/effect/decal/cleanable/C in loc)
- if(C != src && C.type == type && !QDELETED(C))
- if (replace_decal(C))
- handle_merge_decal(C)
- return INITIALIZE_HINT_QDEL
-
- if(is_mopped)
- ADD_TRAIT(src, TRAIT_MOPABLE, INNATE_TRAIT)
-
- if(LAZYLEN(diseases))
- var/list/datum/disease/diseases_to_add = list()
- for(var/datum/disease/D in diseases)
- if(D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)
- diseases_to_add += D
- if(LAZYLEN(diseases_to_add))
- AddComponent(/datum/component/infective, diseases_to_add)
-
- AddElement(/datum/element/beauty, beauty)
-
- var/turf/T = get_turf(src)
- if(T && is_station_level(T.z))
- SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/effect/decal/cleanable/Destroy()
- var/turf/T = get_turf(src)
- if(T && is_station_level(T.z))
- SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
- return ..()
-
-/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
- if(mergeable_decal)
- return TRUE
-
-/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
- if((istype(W, /obj/item/reagent_containers/cup) && !istype(W, /obj/item/rag)) || istype(W, /obj/item/reagent_containers/cup/glass))
- if(src.reagents && W.reagents)
- . = 1 //so the containers don't splash their content on the src while scooping.
- if(!src.reagents.total_volume)
- to_chat(user, span_notice("[src] isn't thick enough to scoop up!"))
- return
- if(W.reagents.total_volume >= W.reagents.maximum_volume)
- to_chat(user, span_notice("[W] is full!"))
- return
- to_chat(user, span_notice("You scoop up [src] into [W]!"))
- reagents.trans_to(W, reagents.total_volume, transferred_by = user)
- if(!reagents.total_volume) //scooped up all of it
- qdel(src)
- return
- if(W.get_temperature()) //todo: make heating a reagent holder proc
- if(istype(W, /obj/item/cigarette))
- return
- else
- var/hotness = W.get_temperature()
- reagents.expose_temperature(hotness)
- to_chat(user, span_notice("You heat [name] with [W]!"))
- else
- return ..()
-
-/obj/effect/decal/cleanable/fire_act(exposed_temperature, exposed_volume)
- if(reagents)
- reagents.expose_temperature(exposed_temperature)
- ..()
-
-
-//Add "bloodiness" of this blood's type, to the human's shoes
-//This is on /cleanable because fuck this ancient mess
-/obj/effect/decal/cleanable/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(iscarbon(AM) && blood_state && bloodiness >= 40)
- SEND_SIGNAL(AM, COMSIG_STEP_ON_BLOOD, src)
- update_appearance()
-
-/obj/effect/decal/cleanable/wash(clean_types)
- . = ..()
- if (. || (clean_types & clean_type))
- qdel(src)
- return TRUE
- return .
-
-/**
- * Checks if this decal is a valid decal that can be blood crawled in.
- */
-/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
- if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
- return bloodiness
-
- return FALSE
-
-/**
- * Gets the color associated with the any blood present on this decal. If there is no blood, returns null.
- */
-/obj/effect/decal/cleanable/proc/get_blood_color()
- switch(blood_state)
- if(BLOOD_STATE_HUMAN)
- return rgb(149, 10, 10)
- if(BLOOD_STATE_XENO)
- return rgb(43, 186, 0)
- if(BLOOD_STATE_OIL)
- return rgb(22, 22, 22)
-
- return null
-
-/obj/effect/decal/cleanable/blood/get_blood_color()
- return color || ..()
-
-/obj/effect/decal/cleanable/proc/handle_merge_decal(obj/effect/decal/cleanable/merger)
- if(!merger)
- return
- if(merger.reagents && reagents)
- reagents.trans_to(merger, reagents.total_volume)
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index 74c38afe755..a489e1e3f02 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -1,127 +1,65 @@
// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
-/obj/effect/decal/cleanable/xenoblood
- name = "xeno blood"
+/obj/effect/decal/cleanable/blood/xeno
+ name = "pool of acid"
+ // This is fetched in /datum/blood_type/xeno/set_up_blood() for all blood decals with default desc
desc = "It's green and acidic. It looks like... blood?"
- icon = 'icons/effects/blood.dmi'
- icon_state = "floor1"
- random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- bloodiness = BLOOD_AMOUNT_PER_DECAL
- blood_state = BLOOD_STATE_XENO
- beauty = -250
- clean_type = CLEAN_TYPE_BLOOD
+ color = /datum/blood_type/xeno::color // For mapper sanity
-/obj/effect/decal/cleanable/xenoblood/add_blood_DNA(list/blood_DNA, no_visuals = FALSE)
- . = ..()
- if(!no_visuals && length(blood_DNA))
- color = get_blood_dna_color(blood_DNA)
+/obj/effect/decal/cleanable/blood/xeno/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_XENO)
-/obj/effect/decal/cleanable/xenoblood/Initialize(mapload)
- . = ..()
- add_blood_DNA(list("UNKNOWN DNA" = get_blood_type(BLOOD_TYPE_XENO)))
+/obj/effect/decal/cleanable/blood/splatter/xeno
+ name = "pool of acid"
+ color = /datum/blood_type/xeno::color // For mapper sanity
-/obj/effect/decal/cleanable/xenoblood/xsplatter
- random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
+/obj/effect/decal/cleanable/blood/splatter/xeno/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_XENO)
-/obj/effect/decal/cleanable/xenoblood/xgibs
+/obj/effect/decal/cleanable/blood/gibs/xeno
name = "xeno gibs"
desc = "Gnarly..."
- icon = 'icons/effects/blood.dmi'
icon_state = "xgib1"
- plane = GAME_PLANE
- layer = GIB_LAYER
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
- mergeable_decal = FALSE
+ color = /datum/blood_type/xeno::color // For mapper sanity
- is_mopped = TRUE // probably shouldn't be, but janitor powercreep
+/obj/effect/decal/cleanable/blood/gibs/xeno/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_XENO)
-/obj/effect/decal/cleanable/xenoblood/xgibs/Initialize(mapload)
- . = ..()
- RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject))
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/update_overlays()
- . = ..()
- var/mutable_appearance/gib_overlay = mutable_appearance(icon, "[icon_state]-overlay", appearance_flags = KEEP_APART|RESET_COLOR)
- if(gib_overlay)
- . += gib_overlay
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions, mapload=FALSE)
- SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions)
- var/direction = pick(directions)
- var/delay = 2
- var/range = pick(0, 200; 1, 150; 2, 50; 3, 17; 50) //the 3% chance of 50 steps is intentional and played for laughs.
- if(!step_to(src, get_step(src, direction), 0))
- return
- if(mapload)
- for (var/i in 1 to range)
- var/turf/my_turf = get_turf(src)
- if(!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf))
- var/obj/effect/decal/cleanable/xenoblood/xsplatter/new_splatter = new /obj/effect/decal/cleanable/xenoblood/xsplatter(my_turf)
- new_splatter.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
- if (!step_to(src, get_step(src, direction), 0))
- break
- return
-
- var/datum/move_loop/loop = GLOB.move_manager.move(src, direction, delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
- RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects))
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/proc/spread_movement_effects(datum/move_loop/has_target/source)
- SIGNAL_HANDLER
- if(NeverShouldHaveComeHere(loc))
- return
- new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc)
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/proc/on_pipe_eject(atom/source, direction)
- SIGNAL_HANDLER
-
- var/list/dirs
- if(direction)
- dirs = list(direction, turn(direction, -45), turn(direction, 45))
- else
- dirs = GLOB.alldirs.Copy()
-
- streak(dirs)
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
- return FALSE
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/up
+/obj/effect/decal/cleanable/blood/gibs/xeno/up
icon_state = "xgibup1"
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
-/obj/effect/decal/cleanable/xenoblood/xgibs/down
+/obj/effect/decal/cleanable/blood/gibs/xeno/down
icon_state = "xgibdown1"
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1")
-/obj/effect/decal/cleanable/xenoblood/xgibs/body
+/obj/effect/decal/cleanable/blood/gibs/xeno/body
icon_state = "xgibtorso"
random_icon_states = list("xgibhead", "xgibtorso")
-/obj/effect/decal/cleanable/xenoblood/xgibs/torso
+/obj/effect/decal/cleanable/blood/gibs/xeno/torso
icon_state = "xgibtorso"
random_icon_states = list("xgibtorso")
-/obj/effect/decal/cleanable/xenoblood/xgibs/limb
+/obj/effect/decal/cleanable/blood/gibs/xeno/limb
icon_state = "xgibleg"
random_icon_states = list("xgibleg", "xgibarm")
-/obj/effect/decal/cleanable/xenoblood/xgibs/core
+/obj/effect/decal/cleanable/blood/gibs/xeno/core
icon_state = "xgibmid1"
random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva
icon_state = "xgiblarva1"
random_icon_states = list("xgiblarva1", "xgiblarva2")
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body
+/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body
icon_state = "xgiblarvatorso"
random_icon_states = list("xgiblarvahead", "xgiblarvatorso")
-/obj/effect/decal/cleanable/blood/xtracks
- icon_state = "tracks"
- random_icon_states = null
+/obj/effect/decal/cleanable/blood/tracks/xeno
+ color = /datum/blood_type/xeno::color // For mapper sanity
-/obj/effect/decal/cleanable/blood/xtracks/Initialize(mapload)
- . = ..()
- add_blood_DNA(list("Unknown DNA" = get_blood_type(BLOOD_TYPE_XENO)))
+/obj/effect/decal/cleanable/blood/tracks/xeno/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_XENO)
diff --git a/code/game/objects/effects/decals/cleanable/blood.dm b/code/game/objects/effects/decals/cleanable/blood.dm
new file mode 100644
index 00000000000..b8bf3ff40f1
--- /dev/null
+++ b/code/game/objects/effects/decals/cleanable/blood.dm
@@ -0,0 +1,895 @@
+/obj/effect/decal/cleanable/blood
+ name = "pool of blood"
+ desc = "It's slippery and gooey. Perhaps it's the chef's cooking?"
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "floor1"
+ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
+ beauty = -100
+ clean_type = CLEAN_TYPE_BLOOD
+ color = BLOOD_COLOR_RED
+
+ /// Amount of blood, in units, in this decal
+ /// Spent when drying or making footprints
+ var/bloodiness = BLOOD_AMOUNT_PER_DECAL
+ /// Can this decal dry out?
+ var/can_dry = TRUE
+ /// Has this decal dried out already?
+ var/dried = FALSE
+ /// If TRUE our bloodiness decreases over time as we dry out
+ var/decay_bloodiness = TRUE
+ /// How long we have until the decal fully dries out
+ var/drying_time = 5 MINUTES
+ /// How much time it took us to dry from the start to the end
+ var/total_dry_time = null
+ /// Emissive value of the blood pool, if any
+ var/emissive_alpha = 0
+
+ /// The "base name" of the blood, IE the "pool of" in "pool of blood"
+ var/base_name = "pool of"
+ /// Suffix added to the name so we can have "blood trail" where "trail" is the suffix
+ var/base_suffix = null
+ /// When dried, this is prefixed to the name
+ var/dry_prefix = "dried"
+ /// When dried, this becomes the desc of the blood
+ var/dry_desc = "Looks like it's been here a while. Eew."
+
+/*
+ * diseases - List of diseases to add to this decal on init
+ * blood_or_dna - Either a blood type which will get added, or a full list of DNA
+ */
+/obj/effect/decal/cleanable/blood/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
+ var/can_hold_viruses = TRUE
+ if(istype(blood_or_dna, /datum/blood_type))
+ var/datum/blood_type/default_type = blood_or_dna
+ can_hold_viruses = default_type.blood_flags & BLOOD_TRANSFER_VIRAL_DATA
+ else if (islist(blood_or_dna))
+ can_hold_viruses = FALSE
+ for (var/blood_key in blood_or_dna)
+ var/datum/blood_type/blood_type = blood_or_dna[blood_key]
+ if (blood_type.blood_flags & BLOOD_TRANSFER_VIRAL_DATA)
+ can_hold_viruses = TRUE
+ break
+ . = ..(diseases = can_hold_viruses ? diseases : null)
+ if(islist(blood_or_dna))
+ add_blood_DNA(blood_or_dna)
+ else if(istype(blood_or_dna, /datum/blood_type))
+ var/datum/blood_type/default_type = blood_or_dna
+ add_blood_DNA(list(default_type.dna_string = default_type))
+
+ if(dried)
+ dry()
+ else if(can_dry)
+ total_dry_time = drying_time
+ START_PROCESSING(SSblood_drying, src)
+
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
+ if (bloodiness || GET_ATOM_BLOOD_DECAL_LENGTH(src))
+ update_appearance()
+
+/obj/effect/decal/cleanable/blood/Destroy()
+ STOP_PROCESSING(SSblood_drying, src)
+ return ..()
+
+/// Returns the default blood type for this decal for maploaded decals
+/obj/effect/decal/cleanable/blood/proc/get_default_blood_type()
+ return random_human_blood_type()
+
+// Add "bloodiness" of this blood's type to the human's shoes
+/obj/effect/decal/cleanable/blood/proc/on_entered(datum/source, atom/movable/AM)
+ SIGNAL_HANDLER
+
+ if(dried)
+ return
+
+ if(isliving(AM) && bloodiness >= 40)
+ SEND_SIGNAL(AM, COMSIG_STEP_ON_BLOOD, src)
+
+/obj/effect/decal/cleanable/blood/update_name(updates)
+ . = ..()
+ name = initial(name)
+ if(base_name)
+ name = "[base_name] [get_blood_string()]"
+ if(base_suffix)
+ name = "[base_name ? name : get_blood_string()] [base_suffix]"
+ if(dried && dry_prefix)
+ name = "[dry_prefix] [name]"
+
+/obj/effect/decal/cleanable/blood/update_desc(updates)
+ . = ..()
+ desc = initial(desc)
+ if(dried && dry_desc)
+ desc = dry_desc
+
+/// Returns a string of all the blood reagents in the blood
+/obj/effect/decal/cleanable/blood/proc/get_blood_string()
+ var/list/blood_DNA = GET_ATOM_BLOOD_DECALS(src)
+ var/list/all_blood_names = list()
+ for(var/dna_sample in blood_DNA)
+ var/datum/blood_type/blood_type = blood_DNA[dna_sample]
+ all_blood_names |= LOWER_TEXT(blood_type.get_blood_name())
+ return english_list(all_blood_names, nothing_text = "blood")
+
+/obj/effect/decal/cleanable/blood/update_overlays()
+ . = ..()
+ if(icon_state && emissive_alpha && emissive_alpha < alpha && !dried)
+ . += blood_emissive(icon, icon_state)
+
+/obj/effect/decal/cleanable/blood/proc/blood_emissive(icon_to_use, icon_state_to_use)
+ return emissive_appearance(icon_to_use, icon_state_to_use, src, layer, 255 * emissive_alpha / alpha)
+
+/obj/effect/decal/cleanable/blood/lazy_init_reagents()
+ if (reagents)
+ return reagents
+
+ var/list/blood_DNA = GET_ATOM_BLOOD_DNA(src)
+ var/list/reagents_to_add = list()
+ for(var/dna_sample in blood_DNA)
+ var/datum/blood_type/blood_type = blood_DNA[dna_sample]
+ reagents_to_add += blood_type.reagent_type
+
+ create_reagents(round(bloodiness * BLOOD_TO_UNITS_MULTIPLIER, CHEMICAL_VOLUME_ROUNDING))
+ var/num_reagents = length(reagents_to_add)
+ for(var/reagent_type in reagents_to_add)
+ reagents.add_reagent(reagent_type, round(bloodiness * BLOOD_TO_UNITS_MULTIPLIER / num_reagents, CHEMICAL_VOLUME_ROUNDING))
+ return reagents
+
+/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/merger)
+ if(merger.dried) // New blood will lie on dry blood
+ return FALSE
+ return ..()
+
+/obj/effect/decal/cleanable/blood/handle_merge_decal(obj/effect/decal/cleanable/blood/merger)
+ . = ..()
+ merger.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ merger.adjust_bloodiness(bloodiness)
+
+/obj/effect/decal/cleanable/blood/process(seconds_per_tick)
+ if(dried || !can_dry)
+ return PROCESS_KILL
+
+ if(decay_bloodiness)
+ adjust_bloodiness(-bloodiness / drying_time * seconds_per_tick * 1 SECONDS, ignore_timer = TRUE)
+
+ drying_time -= seconds_per_tick * 1 SECONDS
+ if(drying_time <= 0)
+ dry()
+
+/// Slows down the drying time by a given amount,
+/// then updates the effect, meaning the animation will slow down
+/obj/effect/decal/cleanable/blood/proc/slow_dry(by_amount)
+ drying_time += by_amount
+ total_dry_time += by_amount
+ update_atom_colour()
+
+/// This is what actually "dries" the blood
+/obj/effect/decal/cleanable/blood/proc/dry()
+ dried = TRUE
+ // Not deleting as doing so would cause reagents to get lazyloaded again
+ reagents?.clear_reagents()
+ update_appearance()
+ update_atom_colour()
+ STOP_PROCESSING(SSblood_drying, src)
+
+/// Increments or decrements the bloodiness value
+/obj/effect/decal/cleanable/blood/proc/adjust_bloodiness(by_amount, ignore_timer = FALSE)
+ if(by_amount == 0)
+ return FALSE
+
+ if(QDELING(src))
+ return FALSE
+
+ bloodiness = clamp((bloodiness + by_amount), 0, BLOOD_POOL_MAX)
+ if (bloodiness == 0)
+ dry()
+ else if (ignore_timer)
+ slow_dry(5 SECONDS * by_amount * BLOOD_TO_UNITS_MULTIPLIER)
+ return TRUE
+
+/obj/effect/decal/cleanable/blood/update_atom_colour()
+ . = ..()
+ update_blood_color()
+
+// When color changes we need to update the drying animation
+/obj/effect/decal/cleanable/blood/proc/update_blood_color()
+ var/base_color = BLOOD_COLOR_RED
+ // Get a default color based on DNA if it ends up unset somehow
+ var/list/blood_DNA = GET_ATOM_BLOOD_DECALS(src)
+ if (!length(blood_DNA)) // In case we're only composed of stuff that doesn't normally have a visual
+ blood_DNA = GET_ATOM_BLOOD_DNA(src)
+ if (length(blood_DNA))
+ base_color = get_color_from_blood_list(blood_DNA)
+
+ if (!color)
+ color = base_color
+
+ // Stop ongoing drying animations
+ animate(src)
+
+ var/dried_color = get_dried_color(base_color)
+ // If it's dried (or about to dry) we can just set color directly
+ if(dried || drying_time <= 0)
+ color = dried_color
+ return TRUE
+
+ if(!total_dry_time)
+ return FALSE
+
+ var/dry_coeff = round(1 - drying_time / total_dry_time, 0.01)
+ // Otherwise set the color to what it should be at the current drying progress, then animate down to the dried color if we can
+ color = BlendRGB(color, dried_color, dry_coeff)
+ if(can_dry)
+ animate(src, time = drying_time, color = dried_color)
+ return TRUE
+
+/// Calculates and returns either an RGB or a matrix color for dried blood, depending on whever our current color is RGB or matrix
+/// Because BYOND does *not* like animating from text to matrix and vice versa
+/obj/effect/decal/cleanable/blood/proc/get_dried_color(base_color)
+ var/list/starting_color = rgb2num(base_color)
+
+ if (!starting_color)
+ starting_color = list(255, 255, 255)
+
+ // We want a fixed offset for a fixed drop in color intensity, plus a scaling offset based on our strongest color
+ // The scaling offset helps keep dark colors from turning black, while also ensurse bright colors don't stay super bright
+ var/max_color = max(starting_color[1], starting_color[2], starting_color[3])
+ var/red_offset = 50 + (75 * (starting_color[1] / max_color))
+ var/green_offset = 50 + (75 * (starting_color[2] / max_color))
+ var/blue_offset = 50 + (75 * (starting_color[3] / max_color))
+
+ // If the color is already decently dark, we should reduce the offsets even further
+ // This is intended to prevent already dark blood (mixed blood in particular) from becoming full black
+ var/strength = starting_color[1] + starting_color[2] + starting_color[3]
+ if(strength <= 192)
+ red_offset *= 0.5
+ green_offset *= 0.5
+ blue_offset *= 0.5
+
+ // Finally, get this show on the road
+ return rgb(
+ clamp(starting_color[1] - red_offset, 0, 255),
+ clamp(starting_color[2] - green_offset, 0, 255),
+ clamp(starting_color[3] - blue_offset, 0, 255),
+ )
+
+/obj/effect/decal/cleanable/blood/old
+ bloodiness = 0
+ dried = TRUE
+ color = BLOOD_COLOR_DRIED // Just for mappers. Overriden in init
+
+/obj/effect/decal/cleanable/blood/splatter
+ icon_state = "gibbl1"
+ random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
+
+/obj/effect/decal/cleanable/blood/splatter/over_window // special layer/plane set to appear on windows
+ layer = ABOVE_WINDOW_LAYER
+ plane = GAME_PLANE
+ vis_flags = VIS_INHERIT_PLANE
+ alpha = 180
+ is_mopped = FALSE
+
+/obj/effect/decal/cleanable/blood/splatter/over_window/NeverShouldHaveComeHere(turf/here_turf)
+ return isgroundlessturf(here_turf)
+
+/obj/effect/decal/cleanable/blood/tracks
+ desc = "They look like tracks left by wheels."
+ icon_state = "tracks"
+ random_icon_states = null
+ beauty = -50
+ base_name = null
+ dry_desc = "Some old bloody tracks left by wheels. Machines are evil, perhaps."
+
+/obj/effect/decal/cleanable/blood/trail_holder
+ name = "trail of blood"
+ desc = "Your instincts say you shouldn't be following these."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "trails_1" // For mappers
+ random_icon_states = null
+ beauty = -50
+ base_name = "trail of"
+ bloodiness = BLOOD_AMOUNT_PER_DECAL * 0.1
+
+ /// All the components of the trail
+ var/list/obj/effect/decal/cleanable/blood/trail/trail_components
+
+/obj/effect/decal/cleanable/blood/trail_holder/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
+ . = ..()
+ icon_state = "nothing"
+ update_appearance() // Cut possible overlays
+ if(mapload)
+ add_dir_to_trail(dir)
+
+/obj/effect/decal/cleanable/blood/trail_holder/Destroy()
+ QDEL_LIST_ASSOC_VAL(trail_components)
+ return ..()
+
+/**
+ * Returns the trail component corresponding to the given direction
+ *
+ * * for_dir: The direction to get the trail for
+ * * check_reverse: If TRUE, will also check for the reverse direction
+ * For example if you pass dir = EAST it will return the first EAST or WEST trail component
+ * * check_diagonals: If TRUE, will also check for any diagonal directions
+ * For example if you pass dir = EAST it will return the first EAST, NORTHEAST, or SOUTHEAST trail component
+ * * check_reverse_diagonals: If TRUE, will also check for any reverse diagonal directions
+ * For example if you pass dir = EAST it will return the first SOUTHEAST, EAST, NORTHEAST, WEST, SOUTHWEST, or NORTHWEST trail component
+ */
+/obj/effect/decal/cleanable/blood/trail_holder/proc/get_trail_component(for_dir, check_reverse = FALSE, check_diagonals = FALSE, check_reverse_diagonals = FALSE)
+ . = LAZYACCESS(trail_components, "[for_dir]")
+ if(.)
+ return .
+
+ if(check_reverse)
+ . = LAZYACCESS(trail_components, "[REVERSE_DIR(for_dir)]")
+ if(.)
+ return .
+
+ if(!check_diagonals)
+ return null
+
+ for(var/comp_dir_txt in trail_components)
+ var/comp_dir = text2num(comp_dir_txt)
+ if(comp_dir <= 0)
+ continue
+
+ if(comp_dir & for_dir)
+ return LAZYACCESS(trail_components, comp_dir_txt)
+
+ if(check_reverse_diagonals && (comp_dir & REVERSE_DIR(for_dir)))
+ return LAZYACCESS(trail_components, comp_dir_txt)
+
+ return null
+
+/**
+ * Add a new direction to this trail
+ *
+ * * new_dir: The direction to add
+ * * source - Mob we're sourcing blood from, if any
+ * * blood_to_add - Amount of bloodiness to give to the new component. Does not adjust this decal's own bloodiness
+ * * half_piece - If TRUE, only creates start of a trail. Does not support corners (diagonal directions)
+ * This can be a cardinal direction, a diagonal direction, or a negative number to denote a cardinal direction angled 45 degrees.
+ *
+ * Returns the new trail, a [/obj/effect/decal/cleanable/blood/trail]
+ */
+/obj/effect/decal/cleanable/blood/trail_holder/proc/add_dir_to_trail(new_dir = NORTH, mob/living/source, blood_to_add = BLOOD_AMOUNT_PER_DECAL * 0.1, half_piece = FALSE)
+ var/check_reverse = TRUE
+ // Do not check the reverse dir if we're a diagonal corner
+ if (new_dir > 0 && !(new_dir in GLOB.cardinals))
+ check_reverse = FALSE
+ var/obj/effect/decal/cleanable/blood/trail/new_trail = get_trail_component(new_dir, check_reverse = check_reverse, check_diagonals = half_piece)
+ var/list/blood_DNA = GET_ATOM_BLOOD_DNA(src)
+ if (source)
+ // Source's DNA goes first as to override possible matches in non-enzyme DNA
+ blood_DNA = (source.get_blood_dna_list() || list()) | blood_DNA
+
+ if(new_trail)
+ // If we found a full trail (straight or diagonal), or a half trail that fully overlaps with us, abort this
+ if (!new_trail.half_piece || half_piece && LAZYACCESS(trail_components, "[new_dir]") == new_trail)
+ new_trail.adjust_bloodiness(blood_to_add)
+ if (source)
+ new_trail.add_mob_blood(source)
+ return new_trail
+
+ // We've found a mirrored half-piece, so we should merge into a full piece
+ // Alternatively, we've found a half piece while being a straight piece that overlaps with it
+ // in which case we just overlap with it which should get us the same full piece
+ new_trail.half_piece = FALSE
+ new_trail.update_appearance()
+ new_trail.adjust_bloodiness(blood_to_add)
+ if (source)
+ new_trail.add_mob_blood(source)
+ return new_trail
+
+ // There's a chance that we're on the same tile as a diagonal corner, in which case we need to check for those too
+ if (half_piece && new_dir > 0)
+ var/first_dir = (new_dir & (NORTH|SOUTH)) ? EAST : NORTH
+ var/second_dir = (new_dir & (NORTH|SOUTH)) ? WEST : SOUTH
+ new_trail = get_trail_component(new_dir | first_dir) || get_trail_component(new_dir | second_dir)
+ // Found a diagonal overlapping with us, abort
+ if (new_trail)
+ new_trail.adjust_bloodiness(blood_to_add)
+ if (source)
+ new_trail.add_mob_blood(source)
+ return new_trail
+
+ // Look for perpendicular pieces to merge into a diagonal with
+ new_trail = get_trail_component(first_dir)
+ if (!new_trail?.half_piece)
+ new_trail = get_trail_component(second_dir)
+
+ if (new_trail?.half_piece)
+ new_trail.half_piece = FALSE
+ LAZYREMOVE(trail_components, "[new_trail.dir]")
+ new_trail.setDir(new_dir | new_trail.dir)
+ LAZYSET(trail_components, "[new_trail.dir]", new_trail)
+ new_trail.update_appearance()
+ new_trail.adjust_bloodiness(blood_to_add)
+ if (source)
+ new_trail.add_mob_blood(source)
+ return new_trail
+
+ new_trail = new(src, source?.get_static_viruses(), blood_DNA)
+ if (half_piece)
+ new_trail.half_piece = TRUE
+ new_trail.update_appearance()
+
+ new_trail.adjust_bloodiness(blood_to_add - new_trail.bloodiness)
+
+ if(new_dir > 0)
+ // add some free sprite variation by flipping it around
+ if((new_dir in GLOB.cardinals) && prob(50) && !half_piece)
+ new_trail.setDir(REVERSE_DIR(new_dir))
+ // otherwise the dir is the same
+ else
+ new_trail.setDir(new_dir)
+ // negative dirs denote "straight diagonal" dirs
+ else
+ var/real_dir = abs(new_dir)
+ new_trail.setDir(real_dir & (EAST|WEST))
+ switch(real_dir)
+ if(NORTHEAST)
+ new_trail.transform = new_trail.transform.Turn(-45)
+ if(NORTHWEST)
+ new_trail.transform = new_trail.transform.Turn(45)
+ if(SOUTHEAST)
+ new_trail.transform = new_trail.transform.Turn(-135)
+ if(SOUTHWEST)
+ new_trail.transform = new_trail.transform.Turn(135)
+
+ LAZYSET(trail_components, "[new_dir]", new_trail)
+ vis_contents += new_trail
+ return new_trail
+
+/obj/effect/decal/cleanable/blood/trail
+ name = "blood trail"
+ desc = "A trail of blood."
+ icon_state = "ltrails_1"
+ random_icon_states = list("ltrails_1", "ltrails_2")
+ vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID
+ appearance_flags = parent_type::appearance_flags | RESET_COLOR | KEEP_APART
+ beauty = -50
+ decay_bloodiness = FALSE // bloodiness is used as a metric for for how big the sprite is, so don't decay passively
+ bloodiness = BLOOD_AMOUNT_PER_DECAL * 0.1
+ base_suffix = "trail"
+ /// Is this just half of a trail
+ var/half_piece = FALSE
+ /// Beyond a threshold we change to a bloodier icon state
+ var/very_bloody = FALSE
+
+/obj/effect/decal/cleanable/blood/update_desc(updates)
+ . = ..()
+ desc = "A [dried ? "dried " : ""]trail of [get_blood_string()]."
+
+/obj/effect/decal/cleanable/blood/lazy_init_reagents()
+ if(!istype(loc, /obj/effect/decal/cleanable/blood/trail_holder))
+ return ..()
+
+/obj/effect/decal/cleanable/blood/trail/adjust_bloodiness(by_amount, ignore_timer = FALSE)
+ . = ..()
+ if(very_bloody || bloodiness < 0.25 * BLOOD_AMOUNT_PER_DECAL)
+ return
+
+ very_bloody = TRUE
+ icon_state = pick("trails_1", "trails_2")
+ base_icon_state = icon_state
+ update_appearance()
+
+/obj/effect/decal/cleanable/blood/trail/update_icon(updates)
+ if (half_piece)
+ icon_state = "[base_icon_state]_start"
+ else
+ icon_state = base_icon_state
+ return ..()
+
+/obj/effect/decal/cleanable/blood/gibs
+ name = "gibs"
+ desc = "They look extremely gruesome."
+ icon_state = "gib1"
+ layer = GIB_LAYER
+ plane = GAME_PLANE
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
+ mergeable_decal = FALSE
+
+ base_name = null
+ dry_prefix = "rotting"
+ dry_desc = "They look extremely gruesome as some terrible smell fills the air."
+ decal_reagent = /datum/reagent/consumable/liquidgibs
+ reagent_amount = 5
+ is_mopped = TRUE // probably shouldn't be, but janitor powercreep
+
+ /// Lazylist with information about the diseases our streaking spawns
+ var/list/streak_diseases
+ /// Do these gibs produce squishy sounds?
+ var/squishy = TRUE
+ /// Do these gibs have a separate non-blood-colored overlay?
+ var/has_overlay = TRUE
+ /// Should we be creating blood decals as we streak?
+ var/leave_blood = TRUE
+
+/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
+ . = ..()
+ leave_blood = has_blood_flag(GET_ATOM_BLOOD_DNA(src), BLOOD_COVER_TURFS)
+ if(squishy)
+ AddElement(/datum/element/squish_sound)
+ RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject))
+ update_appearance(UPDATE_OVERLAYS)
+
+/obj/effect/decal/cleanable/blood/gibs/update_overlays()
+ . = ..()
+ if(!has_overlay)
+ return
+ var/mutable_appearance/gib_overlay = mutable_appearance(icon, "[icon_state]-overlay", appearance_flags = KEEP_APART|RESET_COLOR)
+ if(dried)
+ gib_overlay.color = COLOR_GRAY
+ else if (total_dry_time)
+ gib_overlay.color = BlendRGB(COLOR_WHITE, COLOR_GRAY, 1 - drying_time / total_dry_time)
+ . += gib_overlay
+
+/obj/effect/decal/cleanable/blood/gibs/get_blood_string()
+ return null
+
+/obj/effect/decal/cleanable/blood/gibs/Destroy()
+ LAZYNULL(streak_diseases)
+ return ..()
+
+/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
+ return FALSE //Never fail to place us
+
+/obj/effect/decal/cleanable/blood/gibs/dry()
+ . = ..()
+ if(!.)
+ return
+ // AddComponent(/datum/component/rot, 0, 5 MINUTES, 0.7) SKYRAT EDIT REMOVAL
+ update_appearance(UPDATE_OVERLAYS)
+
+/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
+ return FALSE
+
+/obj/effect/decal/cleanable/blood/gibs/proc/on_pipe_eject(atom/source, direction)
+ SIGNAL_HANDLER
+
+ var/list/dirs
+ if(direction)
+ dirs = list(direction, turn(direction, -45), turn(direction, 45))
+ else
+ dirs = GLOB.alldirs.Copy()
+
+ streak(dirs)
+
+/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions, mapload = FALSE)
+ SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions)
+ var/direction = pick(directions)
+ var/delay = 2
+ var/range = pick(0, 200; 1, 150; 2, 50; 3, 17; 50) //the 3% chance of 50 steps is intentional and played for laughs.
+ if(!step_to(src, get_step(src, direction), 0))
+ return
+
+ if(!mapload)
+ var/datum/move_loop/loop = GLOB.move_manager.move_to(src, get_step(src, direction), delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
+ if (leave_blood)
+ RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects))
+ return
+
+ for (var/i in 1 to range)
+ if (leave_blood)
+ create_splatter()
+
+ if (!step_to(src, get_step(src, direction), 0))
+ break
+
+/obj/effect/decal/cleanable/blood/gibs/proc/create_splatter()
+ var/turf/my_turf = get_turf(src)
+ if(!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf))
+ new /obj/effect/decal/cleanable/blood/splatter(my_turf, streak_diseases, GET_ATOM_BLOOD_DNA(src))
+
+/obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source)
+ SIGNAL_HANDLER
+ if(!NeverShouldHaveComeHere(loc))
+ new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases, GET_ATOM_BLOOD_DNA(src))
+
+/obj/effect/decal/cleanable/blood/gibs/up
+ icon_state = "gibup1"
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/down
+ icon_state = "gibdown1"
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/body
+ icon_state = "gibtorso"
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/torso
+ icon_state = "gibtorso"
+ random_icon_states = null
+
+/obj/effect/decal/cleanable/blood/gibs/limb
+ icon_state = "gibleg"
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/core
+ icon_state = "gibmid1"
+ random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
+
+/obj/effect/decal/cleanable/blood/gibs/old
+ name = "old rotting gibs"
+ desc = "Space Jesus, why didn't anyone clean this up? They smell terrible."
+ color = BLOOD_COLOR_DRIED // Just for mappers. Overriden in init
+ bloodiness = 0
+ dried = TRUE
+ dry_prefix = null
+ dry_desc = null
+
+/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
+ . = ..()
+ setDir(pick(GLOB.cardinals))
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10)
+
+/obj/effect/decal/cleanable/blood/drip
+ name = "drop of blood"
+ desc = "A spattering."
+ icon_state = "drip5" //using drip5 since the others tend to blend in with pipes & wires.
+ random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
+ bloodiness = 0
+ base_name = "drop of"
+ dry_desc = "A dried spattering."
+
+/obj/effect/decal/cleanable/blood/footprints
+ name = "footprints"
+ desc = "WHOSE FOOTPRINTS ARE THESE?"
+ icon = 'icons/effects/footprints.dmi'
+ icon_state = "blood1"
+ random_icon_states = null
+ appearance_flags = parent_type::appearance_flags | KEEP_TOGETHER
+ bloodiness = 0 // set based on the bloodiness of the foot
+ base_name = null
+ dry_desc = "HMM... SOMEONE WAS HERE!"
+
+ var/entered_dirs = 0
+ var/exited_dirs = 0
+
+ /// Lazylist of shoe or other clothing that covers feet types that have made footprints here.
+ var/list/shoe_types
+
+ /// Lazylist of species that have made footprints here.
+ var/list/species_types
+
+/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type())
+ . = ..()
+ icon_state = "" // All of the footprint visuals come from overlays
+ if(mapload)
+ entered_dirs |= dir // Keep the same appearance as in the map editor
+ update_appearance()
+
+/obj/effect/decal/cleanable/blood/footprints/get_blood_string()
+ return null
+
+//Rotate all of the footprint directions too
+/obj/effect/decal/cleanable/blood/footprints/setDir(newdir)
+ if(dir == newdir)
+ return ..()
+
+ var/ang_change = dir2angle(newdir) - dir2angle(dir)
+ var/old_entered_dirs = entered_dirs
+ var/old_exited_dirs = exited_dirs
+ entered_dirs = NONE
+ exited_dirs = NONE
+
+ for(var/Ddir in GLOB.cardinals)
+ if(old_entered_dirs & Ddir)
+ entered_dirs |= angle2dir_cardinal(dir2angle(Ddir) + ang_change)
+ if(old_exited_dirs & Ddir)
+ exited_dirs |= angle2dir_cardinal(dir2angle(Ddir) + ang_change)
+
+ update_appearance()
+ return ..()
+
+/obj/effect/decal/cleanable/blood/footprints/update_overlays()
+ . = ..()
+ var/static/list/bloody_footprints_cache = list()
+ var/icon_state_to_use = "blood"
+ if(LAZYACCESS(species_types, BODYPART_ID_DIGITIGRADE))
+ icon_state_to_use += "claw"
+ else if(LAZYACCESS(species_types, SPECIES_MONKEY))
+ icon_state_to_use += "paw"
+ else if(LAZYACCESS(species_types, "bot"))
+ icon_state_to_use += "bot"
+
+ for(var/Ddir in GLOB.cardinals)
+ if(entered_dirs & Ddir)
+ var/enter_state = "entered-[icon_state_to_use]-[Ddir]"
+ var/image/bloodstep_overlay = bloody_footprints_cache[enter_state]
+ if(!bloodstep_overlay)
+ bloodstep_overlay = image(icon, "[icon_state_to_use]1", dir = Ddir)
+ bloody_footprints_cache[enter_state] = bloodstep_overlay
+ . += bloodstep_overlay
+
+ if(emissive_alpha && emissive_alpha < alpha && !dried)
+ var/enter_emissive_state = "[enter_state]_emissive-[emissive_alpha]"
+ var/mutable_appearance/emissive_overlay = bloody_footprints_cache[enter_emissive_state]
+ if(!emissive_overlay)
+ emissive_overlay = blood_emissive(icon, "[icon_state_to_use]1")
+ emissive_overlay.dir = Ddir
+ bloody_footprints_cache[enter_emissive_state] = emissive_overlay
+ . += emissive_overlay
+
+ if(exited_dirs & Ddir)
+ var/exit_state = "exited-[icon_state_to_use]-[Ddir]"
+ var/image/bloodstep_overlay = bloody_footprints_cache[exit_state]
+ if(!bloodstep_overlay)
+ bloodstep_overlay = image(icon, "[icon_state_to_use]2", dir = Ddir)
+ bloody_footprints_cache[exit_state] = bloodstep_overlay
+ . += bloodstep_overlay
+
+ if(emissive_alpha && emissive_alpha < alpha && !dried)
+ var/exit_emissive_state = "[exit_state]_emissive-[emissive_alpha]"
+ var/mutable_appearance/emissive_overlay = bloody_footprints_cache[exit_emissive_state]
+ if(!emissive_overlay)
+ emissive_overlay = blood_emissive(icon, "[icon_state_to_use]2")
+ emissive_overlay.dir = Ddir
+ bloody_footprints_cache[exit_emissive_state] = emissive_overlay
+ . += emissive_overlay
+
+/obj/effect/decal/cleanable/blood/footprints/examine(mob/user)
+ . = ..()
+ if(LAZYLEN(species_types) + LAZYLEN(shoe_types) == 0)
+ return
+
+ . += "You recognise the footprints as belonging to:"
+ for(var/obj/item/clothing/shoes/sole as anything in shoe_types)
+ var/article = initial(sole.article) || (initial(sole.gender) == PLURAL ? "Some" : "A")
+ . += "[icon2html(initial(sole.icon), user, initial(sole.icon_state))] [article] [initial(sole.name)]."
+
+ for(var/species in species_types)
+ switch(species)
+ if("unknown")
+ . += "• Some creature's feet."
+ if(SPECIES_MONKEY)
+ . += "• Some monkey feet."
+ if(SPECIES_HUMAN)
+ . += "• Some human feet."
+ else
+ . += "• Some [species] feet."
+
+/obj/effect/decal/cleanable/blood/hitsplatter
+ name = "blood splatter"
+ pass_flags = PASSTABLE | PASSGRILLE
+ icon_state = "hitsplatter1"
+ random_icon_states = list("hitsplatter1", "hitsplatter2", "hitsplatter3")
+
+ plane = GAME_PLANE
+ layer = ABOVE_WINDOW_LAYER
+ is_mopped = FALSE
+
+ base_name = null
+ base_suffix = "splatter"
+ can_dry = FALSE // No point
+
+ /// The turf we just came from, so we can back up when we hit a wall
+ var/turf/prev_loc
+ /// Skip making the final blood splatter when we're done, like if we're not in a turf
+ var/skip = FALSE
+ /// How many tiles/items/people we can paint red
+ var/splatter_strength = 3
+ /// Insurance so that we don't keep moving once we hit a stoppoint
+ var/hit_endpoint = FALSE
+ /// How fast the splatter moves
+ var/splatter_speed = 0.1 SECONDS
+ /// Tracks what direction we're flying
+ var/flight_dir = NONE
+ /// Should we be leaving any decals, or just adding DNA to mobs?
+ var/leave_blood = TRUE
+
+/obj/effect/decal/cleanable/blood/hitsplatter/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna = get_default_blood_type(), splatter_strength)
+ . = ..()
+ leave_blood = has_blood_flag(GET_ATOM_BLOOD_DNA(src), BLOOD_COVER_TURFS)
+ prev_loc = loc //Just so we are sure prev_loc exists
+ if(splatter_strength)
+ src.splatter_strength = splatter_strength
+
+/obj/effect/decal/cleanable/blood/hitsplatter/proc/expire()
+ if(isturf(loc) && !skip)
+ playsound(src, 'sound/effects/wounds/splatter.ogg', 60, TRUE, -1)
+ loc.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ qdel(src)
+
+/// Set the splatter up to fly through the air until it rounds out of steam or hits something
+/obj/effect/decal/cleanable/blood/hitsplatter/proc/fly_towards(turf/target_turf, range)
+ flight_dir = get_dir(src, target_turf)
+ var/datum/move_loop/loop = GLOB.move_manager.move_towards(src, target_turf, splatter_speed, timeout = splatter_speed * range, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_START_FAST)
+ RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move))
+ RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move))
+ RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(loop_done))
+
+/obj/effect/decal/cleanable/blood/hitsplatter/proc/pre_move(datum/move_loop/source)
+ SIGNAL_HANDLER
+ prev_loc = loc
+
+/obj/effect/decal/cleanable/blood/hitsplatter/proc/post_move(datum/move_loop/source)
+ SIGNAL_HANDLER
+ if(loc == prev_loc || !isturf(loc))
+ return
+
+ for(var/atom/movable/iter_atom in loc)
+ if(hit_endpoint)
+ return
+ if(iter_atom == src || iter_atom.invisibility || iter_atom.alpha <= 0 || (isobj(iter_atom) && !iter_atom.density))
+ continue
+ if(splatter_strength <= 0)
+ break
+ iter_atom.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+
+ splatter_strength--
+ // we used all our blood so go away
+ if(splatter_strength <= 0)
+ expire()
+ return
+
+ if(!leave_blood)
+ loc.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ return
+
+ // make a trail
+ var/obj/effect/decal/cleanable/blood/fly_trail = new(loc, null, GET_ATOM_BLOOD_DNA(src))
+ fly_trail.dir = dir
+ if(ISDIAGONALDIR(flight_dir))
+ fly_trail.transform = fly_trail.transform.Turn((flight_dir == NORTHEAST || flight_dir == SOUTHWEST) ? 135 : 45)
+ fly_trail.icon_state = pick("trails_1", "trails_2")
+ fly_trail.adjust_bloodiness(fly_trail.bloodiness * -0.66)
+ fly_trail.update_appearance()
+
+/obj/effect/decal/cleanable/blood/hitsplatter/proc/loop_done(datum/source)
+ SIGNAL_HANDLER
+ if(!QDELETED(src))
+ expire()
+
+/obj/effect/decal/cleanable/blood/hitsplatter/Bump(atom/bumped_atom)
+ if(!iswallturf(bumped_atom) && !istype(bumped_atom, /obj/structure/window))
+ expire()
+ return
+
+ if(istype(bumped_atom, /obj/structure/window))
+ var/obj/structure/window/bumped_window = bumped_atom
+ if(!bumped_window.fulltile)
+ hit_endpoint = TRUE
+ expire()
+ return
+
+ hit_endpoint = TRUE
+ if(!isturf(prev_loc)) // This will only happen if prev_loc is not even a turf, which is highly unlikely.
+ abstract_move(bumped_atom)
+ expire()
+ return
+
+ abstract_move(bumped_atom)
+ skip = TRUE
+ //Adjust pixel offset to make splatters appear on the wall
+ if(istype(bumped_atom, /obj/structure/window))
+ if(land_on_window(bumped_atom))
+ return
+
+ if(!leave_blood)
+ prev_loc.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ return
+
+ var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new(prev_loc, null, GET_ATOM_BLOOD_DNA(src))
+ final_splatter.pixel_x = (dir == EAST ? 32 : (dir == WEST ? -32 : 0))
+ final_splatter.pixel_y = (dir == NORTH ? 32 : (dir == SOUTH ? -32 : 0))
+
+/// A special case for hitsplatters hitting windows, since those can actually be moved around, store it in the window and slap it in the vis_contents
+/obj/effect/decal/cleanable/blood/hitsplatter/proc/land_on_window(obj/structure/window/the_window)
+ if(!leave_blood)
+ the_window.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
+ return TRUE
+
+ if(!the_window.fulltile)
+ return FALSE
+
+ var/obj/effect/decal/cleanable/final_splatter = new /obj/effect/decal/cleanable/blood/splatter/over_window(prev_loc, null, GET_ATOM_BLOOD_DNA(src))
+ final_splatter.forceMove(the_window)
+ the_window.vis_contents += final_splatter
+ expire()
+ return TRUE
diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm
index d612bd9e7f5..911f1ba4f14 100644
--- a/code/game/objects/effects/decals/cleanable/food.dm
+++ b/code/game/objects/effects/decals/cleanable/food.dm
@@ -35,6 +35,13 @@
icon_state = "salt_pile"
var/safepasses = 3 //how many times can this salt pile be passed before dissipating
+/obj/effect/decal/cleanable/food/salt/Initialize(mapload, list/datum/disease/diseases)
+ . = ..()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
/obj/effect/decal/cleanable/food/salt/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
if(is_species(mover, /datum/species/snail))
@@ -45,14 +52,17 @@
if(is_species(AM, /datum/species/snail))
to_chat(AM, span_danger("Your path is obstructed by [span_phobia("salt")]."))
-/obj/effect/decal/cleanable/food/salt/on_entered(datum/source, atom/movable/AM)
- . = ..()
+/obj/effect/decal/cleanable/food/salt/proc/on_entered(datum/source, atom/movable/AM)
+ SIGNAL_HANDLER
+
if(!isliving(AM))
return
+
if(iscarbon(AM))
var/mob/living/carbon/C = AM
if(C.move_intent == MOVE_INTENT_WALK)
return
+
safepasses--
if(safepasses <= 0 && !QDELETED(src))
qdel(src)
@@ -65,7 +75,7 @@
/obj/effect/decal/cleanable/food/squid_ink
name = "ink smear"
desc = "a smear from some inky substance..."
- icon = 'icons/mob/silicon/robots.dmi'
+ icon = 'icons/effects/blood.dmi'
icon_state = "floor1"
color = COLOR_DARK
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
deleted file mode 100644
index 35b5d5830f1..00000000000
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ /dev/null
@@ -1,508 +0,0 @@
-/obj/effect/decal/cleanable/blood
- name = "blood"
- desc = "It's red and gooey. Perhaps it's the chef's cooking?"
- icon = 'icons/effects/blood.dmi'
- icon_state = "floor1"
- random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- blood_state = BLOOD_STATE_HUMAN
- bloodiness = BLOOD_AMOUNT_PER_DECAL
- beauty = -100
- clean_type = CLEAN_TYPE_BLOOD
- color = BLOOD_COLOR_RED
- var/should_dry = TRUE
- var/dryname = "dried blood" //when the blood lasts long enough, it becomes dry and gets a new name
- var/drydesc = "Looks like it's been here a while. Eew." //as above
- var/drytime = 0
- var/footprint_sprite = null
- /// If we've dried already
- var/has_dried
-
-/obj/effect/decal/cleanable/blood/Initialize(mapload)
- . = ..()
- if(!should_dry)
- return
- if(bloodiness)
- start_drying()
- else
- dry(freshly_made = TRUE)
-
-/obj/effect/decal/cleanable/blood/Destroy()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/effect/decal/cleanable/blood/process()
- if(world.time > drytime)
- dry()
-
-/obj/effect/decal/cleanable/blood/add_blood_DNA(list/blood_DNA, no_visuals = FALSE)
- . = ..()
- if(!no_visuals && length(blood_DNA))
- color = get_blood_dna_color(blood_DNA)
-
-/obj/effect/decal/cleanable/blood/proc/get_timer()
- drytime = world.time + 3 MINUTES
-
-/obj/effect/decal/cleanable/blood/proc/start_drying()
- get_timer()
- START_PROCESSING(SSobj, src)
-
-///This is what actually "dries" the blood. Returns true if it's all out of blood to dry, and false otherwise
-/obj/effect/decal/cleanable/blood/proc/dry(freshly_made = FALSE)
- if(freshly_made)
- start_drying()
- return FALSE
- if(bloodiness > 20)
- bloodiness -= BLOOD_AMOUNT_PER_DECAL
- get_timer()
- return FALSE
-
- name = dryname
- has_dried = TRUE
- desc = drydesc
- bloodiness = 0
- STOP_PROCESSING(SSobj, src)
- // We're not using a matrix so we're free to use BlendRGB
- if(!islist(color))
- add_atom_colour(BlendRGB(color, COLOR_BLACK, 0.5), FIXED_COLOUR_PRIORITY)
- return TRUE
-
- // We're using a matrix, so we need to halve all values
- var/list/blood_matrix = color
- for(var/i in 1 to min(length(blood_matrix), 16))
- if (length(blood_matrix) == 12 && i > 9) // Don't modify constants
- break
- if (length(blood_matrix) >= 16 && i % 4 == 0) // Don't modify alpha either
- continue
- blood_matrix[i] *= 0.5
- color = blood_matrix
- return TRUE
-
-/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
- C.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
- if (bloodiness)
- C.bloodiness = min((C.bloodiness + bloodiness), BLOOD_AMOUNT_PER_DECAL)
- return ..()
-
-/obj/effect/decal/cleanable/blood/old
- bloodiness = 0
- icon_state = "floor1-old"
-
-/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
- add_blood_DNA(list("Non-human DNA" = random_human_blood_type())) // Needs to happen before ..()
- return ..()
-
-/obj/effect/decal/cleanable/blood/splatter
- icon_state = "gibbl1"
- random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
-
-/obj/effect/decal/cleanable/blood/splatter/over_window // special layer/plane set to appear on windows
- layer = ABOVE_WINDOW_LAYER
- plane = GAME_PLANE
- vis_flags = VIS_INHERIT_PLANE
- alpha = 180
- is_mopped = FALSE
-
-/obj/effect/decal/cleanable/blood/splatter/over_window/NeverShouldHaveComeHere(turf/here_turf)
- return isgroundlessturf(here_turf)
-
-/obj/effect/decal/cleanable/blood/tracks
- icon_state = "tracks"
- desc = "They look like tracks left by wheels."
- random_icon_states = null
- beauty = -50
- dryname = "dried tracks"
- drydesc = "Some old bloody tracks left by wheels. Machines are evil, perhaps."
-
-/obj/effect/decal/cleanable/blood/trail_holder
- name = "blood"
- desc = "Your instincts say you shouldn't be following these."
- icon = 'icons/effects/blood.dmi'
- icon_state = null
- random_icon_states = null
- beauty = -50
- var/list/existing_dirs = list()
-
-/obj/effect/decal/cleanable/blood/trail_holder/replace_decal(obj/effect/decal/cleanable/blood/trail_holder/blood_decal)
- if(blood_state != blood_decal.blood_state)
- return FALSE
- return ..()
-
-// normal version of the above trail holder object for use in less convoluted things
-/obj/effect/decal/cleanable/blood/trails
- desc = "Looks like a corpse was smeared all over the floor like ketchup. Kinda makes you hungry."
- random_icon_states = list("trails_1", "trails_2")
- icon_state = "trails_1"
- beauty = -50
- dryname = "dried tracks"
- drydesc = "Looks like a corpse was smeared all over the floor like ketchup, but it's all dried up and nasty now, ew. You lose some of your appetite."
-
-/obj/effect/decal/cleanable/blood/gibs
- name = "gibs"
- desc = "They look bloody and gruesome."
- icon = 'icons/effects/blood.dmi'
- icon_state = "gib1"
- layer = GIB_LAYER
- plane = GAME_PLANE
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
- mergeable_decal = FALSE
-
- dryname = "rotting gibs"
- drydesc = "They look bloody and gruesome while some terrible smell fills the air."
- decal_reagent = /datum/reagent/consumable/liquidgibs
- reagent_amount = 5
-
- is_mopped = TRUE // probably shouldn't be, but janitor powercreep
-
-/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases)
- . = ..()
- AddElement(/datum/element/squish_sound)
- RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject))
- update_appearance(UPDATE_OVERLAYS)
-
-/obj/effect/decal/cleanable/blood/gibs/update_overlays()
- . = ..()
- var/mutable_appearance/gib_overlay = mutable_appearance(icon, "[icon_state]-overlay", appearance_flags = KEEP_APART|RESET_COLOR)
- if(gib_overlay)
- if(has_dried)
- gib_overlay.color = COLOR_GRAY
- . += gib_overlay
-
-/obj/effect/decal/cleanable/blood/gibs/replace_decal(obj/effect/decal/cleanable/C)
- return FALSE //Never fail to place us
-
-/obj/effect/decal/cleanable/blood/gibs/dry(freshly_made = FALSE)
- . = ..()
- if(!.)
- return
- update_appearance(UPDATE_OVERLAYS)
- //AddComponent(/datum/component/rot, 0, 5 MINUTES, 0.7) skyrat edit
-
-/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
- return FALSE
-
-/obj/effect/decal/cleanable/blood/gibs/proc/on_pipe_eject(atom/source, direction)
- SIGNAL_HANDLER
-
- var/list/dirs
- if(direction)
- dirs = list(direction, turn(direction, -45), turn(direction, 45))
- else
- dirs = GLOB.alldirs.Copy()
-
- streak(dirs)
-
-/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions, mapload=FALSE)
- SEND_SIGNAL(src, COMSIG_GIBS_STREAK, directions)
- var/direction = pick(directions)
- var/delay = 2
- var/range = pick(0, 200; 1, 150; 2, 50; 3, 17; 50) //the 3% chance of 50 steps is intentional and played for laughs.
- if(!step_to(src, get_step(src, direction), 0))
- return
-
- if(!mapload)
- var/datum/move_loop/loop = GLOB.move_manager.move_to(src, get_step(src, direction), delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
- RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects))
- return
-
- for (var/i in 1 to range)
- var/turf/my_turf = get_turf(src)
- if(!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf))
- var/obj/effect/decal/cleanable/blood/splatter/new_splatter = new /obj/effect/decal/cleanable/blood/splatter(my_turf)
- new_splatter.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
-
- if (!step_to(src, get_step(src, direction), 0))
- break
-
-/obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source)
- SIGNAL_HANDLER
- if(NeverShouldHaveComeHere(loc))
- return
- var/obj/effect/decal/cleanable/blood/splatter/new_splatter = new /obj/effect/decal/cleanable/blood/splatter(loc)
- new_splatter.add_blood_DNA(GET_ATOM_BLOOD_DNA(src))
-
-/obj/effect/decal/cleanable/blood/gibs/up
- icon_state = "gibup1"
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
-
-/obj/effect/decal/cleanable/blood/gibs/down
- icon_state = "gibdown1"
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
-
-/obj/effect/decal/cleanable/blood/gibs/body
- icon_state = "gibtorso"
- random_icon_states = list("gibhead", "gibtorso")
-
-/obj/effect/decal/cleanable/blood/gibs/torso
- icon_state = "gibtorso"
- random_icon_states = null
-
-/obj/effect/decal/cleanable/blood/gibs/limb
- icon_state = "gibleg"
- random_icon_states = list("gibleg", "gibarm")
-
-/obj/effect/decal/cleanable/blood/gibs/core
- icon_state = "gibmid1"
- random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
-
-/obj/effect/decal/cleanable/blood/gibs/old
- name = "old rotting gibs"
- desc = "Space Jesus, why didn't anyone clean this up? They smell terrible."
- icon_state = "gib1-old"
- bloodiness = 0
- should_dry = FALSE
- dryname = "old rotting gibs"
- drydesc = "Space Jesus, why didn't anyone clean this up? They smell terrible."
-
-/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases)
- . = ..()
- setDir(pick(1,2,4,8))
- add_blood_DNA(list("Non-human DNA" = random_human_blood_type()))
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10)
- dry()
-
-/obj/effect/decal/cleanable/blood/drip
- name = "drips of blood"
- desc = "It's red."
- icon_state = "drip5" //using drip5 since the others tend to blend in with pipes & wires.
- random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
- bloodiness = 0
- var/drips = 1
- dryname = "drips of blood"
- drydesc = "It's red."
-
-/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
- return TRUE
-
-//BLOODY FOOTPRINTS
-/obj/effect/decal/cleanable/blood/footprints
- name = "footprints"
- desc = "WHOSE FOOTPRINTS ARE THESE?"
- icon = 'icons/effects/footprints.dmi'
- icon_state = "blood_shoes_enter"
- random_icon_states = null
- blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
- var/entered_dirs = 0
- var/exited_dirs = 0
-
- /// List of shoe or other clothing that covers feet types that have made footprints here.
- var/list/shoe_types = list()
-
- /// List of species that have made footprints here.
- var/list/species_types = list()
-
- dryname = "dried footprints"
- drydesc = "HMM... SOMEONE WAS HERE!"
-
-/obj/effect/decal/cleanable/blood/footprints/get_save_vars()
- return ..() - NAMEOF(src, icon_state)
-
-/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload, footprint_sprite)
- src.footprint_sprite = footprint_sprite
- . = ..()
- icon_state = "" //All of the footprint visuals come from overlays
- if(mapload)
- entered_dirs |= dir //Keep the same appearance as in the map editor
- update_appearance(mapload ? (ALL) : (UPDATE_NAME | UPDATE_DESC))
-
-//Rotate all of the footprint directions too
-/obj/effect/decal/cleanable/blood/footprints/setDir(newdir)
- if(dir == newdir)
- return ..()
-
- var/ang_change = dir2angle(newdir) - dir2angle(dir)
- var/old_entered_dirs = entered_dirs
- var/old_exited_dirs = exited_dirs
- entered_dirs = 0
- exited_dirs = 0
-
- for(var/Ddir in GLOB.cardinals)
- if(old_entered_dirs & Ddir)
- entered_dirs |= turn_cardinal(Ddir, ang_change)
- if(old_exited_dirs & Ddir)
- exited_dirs |= turn_cardinal(Ddir, ang_change)
-
- update_appearance()
- return ..()
-
-/obj/effect/decal/cleanable/blood/footprints/update_name(updates)
- switch(footprint_sprite)
- if(FOOTPRINT_SPRITE_CLAWS)
- name = "clawprints"
- if(FOOTPRINT_SPRITE_SHOES)
- name = "footprints"
- if(FOOTPRINT_SPRITE_PAWS)
- name = "pawprints"
- dryname = "dried [name]"
- return ..()
-
-/obj/effect/decal/cleanable/blood/footprints/update_desc(updates)
- desc = "WHOSE [uppertext(name)] ARE THESE?"
- return ..()
-
-/obj/effect/decal/cleanable/blood/footprints/update_icon()
- . = ..()
- alpha = max(BLOODY_FOOTPRINT_BASE_ALPHA, min(255 * (bloodiness / 15), 255))
-
-//Cache of bloody footprint images
-//Key:
-//"entered-[blood_state]-[dir_of_image]"
-//or: "exited-[blood_state]-[dir_of_image]"
-GLOBAL_LIST_EMPTY(bloody_footprints_cache)
-
-/obj/effect/decal/cleanable/blood/footprints/update_overlays()
- . = ..()
- for(var/Ddir in GLOB.cardinals)
- if(entered_dirs & Ddir)
- var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"]
- if(!bloodstep_overlay)
- GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_enter", dir = Ddir)
- bloodstep_overlay.color = color
- . += bloodstep_overlay
-
- if(exited_dirs & Ddir)
- var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"]
- if(!bloodstep_overlay)
- GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_exit", dir = Ddir)
- bloodstep_overlay.color = color
- . += bloodstep_overlay
-
-
-/obj/effect/decal/cleanable/blood/footprints/examine(mob/user)
- . = ..()
- if(length(shoe_types) + length(species_types) == 0)
- return
-
- . += "You recognise \the [src] as belonging to:"
-
- for(var/sole in shoe_types)
- var/obj/item/clothing/item = sole
- var/article = initial(item.gender) == PLURAL ? "Some" : "A"
- . += "[icon2html(initial(item.icon), user, initial(item.icon_state))] [article] [initial(item.name)]."
-
- for(var/species in species_types)
- // god help me
- if(species == "unknown")
- . += "Some feet."
- else if(species == SPECIES_MONKEY)
- . += "[icon2html('icons/mob/human/human.dmi', user, "monkey")] Some monkey paws."
- else if(species == SPECIES_HUMAN)
- . += "[icon2html('icons/mob/human/bodyparts.dmi', user, "default_human_l_leg")] Some human feet."
- else
- . += "[icon2html('icons/mob/human/bodyparts.dmi', user, "[species]_l_leg")] Some [species] feet."
-
-/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/blood/blood_decal)
- if(blood_state != blood_decal.blood_state || footprint_sprite != blood_decal.footprint_sprite) //We only replace footprints of the same type as us
- return FALSE
- return ..()
-
-/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in()
- if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
- return TRUE
- return FALSE
-
-/obj/effect/decal/cleanable/blood/hitsplatter
- name = "blood splatter"
- pass_flags = PASSTABLE | PASSGRILLE
- icon_state = "hitsplatter1"
- random_icon_states = list("hitsplatter1", "hitsplatter2", "hitsplatter3")
- plane = GAME_PLANE
- layer = ABOVE_WINDOW_LAYER
- is_mopped = FALSE
- /// The turf we just came from, so we can back up when we hit a wall
- var/turf/prev_loc
- /// The cached info about the blood
- var/list/blood_dna_info
- /// Skip making the final blood splatter when we're done, like if we're not in a turf
- var/skip = FALSE
- /// How many tiles/items/people we can paint red
- var/splatter_strength = 3
- /// Insurance so that we don't keep moving once we hit a stoppoint
- var/hit_endpoint = FALSE
-
-/obj/effect/decal/cleanable/blood/hitsplatter/Initialize(mapload, splatter_strength)
- . = ..()
- prev_loc = loc //Just so we are sure prev_loc exists
- if(splatter_strength)
- src.splatter_strength = splatter_strength
-
-/obj/effect/decal/cleanable/blood/hitsplatter/proc/expire()
- if(isturf(loc) && !skip)
- playsound(src, 'sound/effects/wounds/splatter.ogg', 60, TRUE, -1)
- if(blood_dna_info)
- loc.add_blood_DNA(blood_dna_info)
- qdel(src)
-
-/// Set the splatter up to fly through the air until it rounds out of steam or hits something
-/obj/effect/decal/cleanable/blood/hitsplatter/proc/fly_towards(turf/target_turf, range)
- var/delay = 2
- var/datum/move_loop/loop = GLOB.move_manager.move_towards(src, target_turf, delay, timeout = delay * range, priority = MOVEMENT_ABOVE_SPACE_PRIORITY, flags = MOVEMENT_LOOP_START_FAST)
- RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move))
- RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move))
- RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(loop_done))
-
-/obj/effect/decal/cleanable/blood/hitsplatter/proc/pre_move(datum/move_loop/source)
- SIGNAL_HANDLER
- prev_loc = loc
-
-/obj/effect/decal/cleanable/blood/hitsplatter/proc/post_move(datum/move_loop/source)
- SIGNAL_HANDLER
-
- for(var/atom/movable/iter_atom in loc)
- if(hit_endpoint)
- return
- if(iter_atom == src || iter_atom.invisibility || iter_atom.alpha <= 0 || (isobj(iter_atom) && !iter_atom.density))
- continue
- if(splatter_strength <= 0)
- break
-
- iter_atom.add_blood_DNA(blood_dna_info)
- splatter_strength--
-
- if(splatter_strength <= 0) // we used all the puff so we delete it.
- expire()
-
-/obj/effect/decal/cleanable/blood/hitsplatter/proc/loop_done(datum/source)
- SIGNAL_HANDLER
- if(!QDELETED(src))
- expire()
-
-/obj/effect/decal/cleanable/blood/hitsplatter/Bump(atom/bumped_atom)
- if(!iswallturf(bumped_atom) && !istype(bumped_atom, /obj/structure/window))
- expire()
- return
-
- if(istype(bumped_atom, /obj/structure/window))
- var/obj/structure/window/bumped_window = bumped_atom
- if(!bumped_window.fulltile)
- hit_endpoint = TRUE
- expire()
- return
-
- hit_endpoint = TRUE
- if(!isturf(prev_loc)) // This will only happen if prev_loc is not even a turf, which is highly unlikely.
- abstract_move(bumped_atom)
- expire()
- return
-
- abstract_move(bumped_atom)
- skip = TRUE
- //Adjust pixel offset to make splatters appear on the wall
- if(istype(bumped_atom, /obj/structure/window))
- land_on_window(bumped_atom)
- return
-
- var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new(prev_loc)
- final_splatter.add_blood_DNA(blood_dna_info)
- final_splatter.pixel_x = (dir == EAST ? 32 : (dir == WEST ? -32 : 0))
- final_splatter.pixel_y = (dir == NORTH ? 32 : (dir == SOUTH ? -32 : 0))
-
-/// A special case for hitsplatters hitting windows, since those can actually be moved around, store it in the window and slap it in the vis_contents
-/obj/effect/decal/cleanable/blood/hitsplatter/proc/land_on_window(obj/structure/window/the_window)
- if(!the_window.fulltile)
- return
- var/obj/effect/decal/cleanable/final_splatter = new /obj/effect/decal/cleanable/blood/splatter/over_window(prev_loc)
- final_splatter.add_blood_DNA(blood_dna_info)
- final_splatter.forceMove(the_window)
- the_window.vis_contents += final_splatter
- the_window.bloodied = TRUE
- expire()
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index cb99987ba77..f283a2b9c7d 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -395,7 +395,7 @@
/obj/effect/decal/cleanable/ants/proc/update_ant_damage(ant_min_damage, ant_max_damage)
if(!ant_max_damage)
- ant_max_damage = min(10, round((reagents.get_reagent_amount(/datum/reagent/ants) * 0.1),0.1)) // 100u ants = 10 max_damage
+ ant_max_damage = min(10, round((reagents ? reagents.get_reagent_amount(/datum/reagent/ants) : reagent_amount) * 0.1,0.1)) // 100u ants = 10 max_damage
if(!ant_min_damage)
ant_min_damage = 0.1
var/ant_flags = (CALTROP_NOCRAWL | CALTROP_NOSTUN) /// Small amounts of ants won't be able to bite through shoes.
@@ -472,10 +472,11 @@
/obj/effect/decal/cleanable/fuel_pool/Initialize(mapload, burn_stacks)
. = ..()
- var/static/list/ignition_trigger_connections = list(
+ var/static/list/loc_connections = list(
COMSIG_TURF_MOVABLE_THROW_LANDED = PROC_REF(ignition_trigger),
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered)
)
- AddElement(/datum/element/connect_loc, ignition_trigger_connections)
+ AddElement(/datum/element/connect_loc, loc_connections)
for(var/obj/effect/decal/cleanable/fuel_pool/pool in get_turf(src)) //Can't use locate because we also belong to that turf
if(pool == src)
continue
@@ -543,11 +544,11 @@
log_combat(user, src, "used [item] to ignite")
return ..()
-/obj/effect/decal/cleanable/fuel_pool/on_entered(datum/source, atom/movable/entered_atom)
- . = ..()
- if(entered_atom.throwing) // don't light from things being thrown over us, we handle that somewhere else
- return
- ignition_trigger(source = src, enflammable_atom = entered_atom)
+/obj/effect/decal/cleanable/fuel_pool/proc/on_entered(datum/source, atom/movable/entered_atom)
+ SIGNAL_HANDLER
+
+ if(!entered_atom.throwing) // don't light from things being thrown over us, we handle that somewhere else
+ ignition_trigger(source = src, enflammable_atom = entered_atom)
/obj/effect/decal/cleanable/fuel_pool/proc/ignition_trigger(datum/source, atom/movable/enflammable_atom)
SIGNAL_HANDLER
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index 7406cd910a1..85bce021f47 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -1,115 +1,61 @@
-// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
-
-/obj/effect/decal/cleanable/robot_debris
+/obj/effect/decal/cleanable/blood/gibs/robot_debris
name = "robot debris"
desc = "It's a useless heap of junk... or is it?"
icon = 'icons/mob/silicon/robots.dmi'
- icon_state = "gib1"
- plane = GAME_PLANE
- layer = GIB_LAYER
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
- blood_state = BLOOD_STATE_OIL
- bloodiness = BLOOD_AMOUNT_PER_DECAL
- mergeable_decal = FALSE
- beauty = -50
- clean_type = CLEAN_TYPE_BLOOD
+ has_overlay = FALSE
+ squishy = FALSE
+ color = null
- is_mopped = TRUE // probably shouldn't be, but janitor powercreep
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_OIL)
-/obj/effect/decal/cleanable/robot_debris/Initialize(mapload)
- . = ..()
- RegisterSignal(src, COMSIG_MOVABLE_PIPE_EJECTING, PROC_REF(on_pipe_eject))
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/create_splatter()
+ if(prob(40))
+ return ..()
-/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions, mapload=FALSE)
- var/direction = pick(directions)
- var/delay = 2
- var/range = pick(1, 200; 2, 150; 3, 50; 4, 17; 50) //the 3% chance of 50 steps is intentional and played for laughs.
- if(!step_to(src, get_step(src, direction), 0))
- return
- if(mapload)
- for (var/i in 1 to range)
- var/turf/my_turf = get_turf(src)
- if(prob(40) && (!isgroundlessturf(my_turf) || GET_TURF_BELOW(my_turf)))
- new /obj/effect/decal/cleanable/oil/streak(my_turf)
- if (!step_to(src, get_step(src, direction), 0))
- break
- return
-
- var/datum/move_loop/loop = GLOB.move_manager.move(src, direction, delay = delay, timeout = range * delay, priority = MOVEMENT_ABOVE_SPACE_PRIORITY)
- RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(spread_movement_effects))
-
-/obj/effect/decal/cleanable/robot_debris/proc/spread_movement_effects(datum/move_loop/has_target/source)
- SIGNAL_HANDLER
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/spread_movement_effects(datum/move_loop/has_target/source)
if(NeverShouldHaveComeHere(loc))
return
if (prob(40))
- new /obj/effect/decal/cleanable/oil/streak(loc)
+ new /obj/effect/decal/cleanable/blood/splatter(loc, null, GET_ATOM_BLOOD_DNA(src))
else if (prob(10))
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
-/obj/effect/decal/cleanable/robot_debris/proc/on_pipe_eject(atom/source, direction)
- SIGNAL_HANDLER
+// Doesn't have overlay support as of now
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/update_blood_color()
+ color = null
- var/list/dirs
- if(direction)
- dirs = list(direction, turn(direction, -45), turn(direction, 45))
- else
- dirs = GLOB.alldirs.Copy()
-
- streak(dirs)
-
-/obj/effect/decal/cleanable/robot_debris/ex_act()
- return FALSE
-
-/obj/effect/decal/cleanable/robot_debris/limb
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb
icon_state = "gibarm"
random_icon_states = list("gibarm", "gibleg")
-/obj/effect/decal/cleanable/robot_debris/up
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/up
icon_state = "gibup"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup","gibup")
-/obj/effect/decal/cleanable/robot_debris/down
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/down
icon_state = "gibdown"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown","gibdown")
-/obj/effect/decal/cleanable/oil
+/obj/effect/decal/cleanable/blood/oil
name = "motor oil"
+ // This is fetched in /datum/blood_type/oil/set_up_blood() for all blood decals with default desc
desc = "It's black and greasy. Looks like Beepsky made another mess."
- icon = 'icons/mob/silicon/robots.dmi'
- icon_state = "floor1"
- random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- blood_state = BLOOD_STATE_OIL
- bloodiness = BLOOD_AMOUNT_PER_DECAL
- beauty = -100
- clean_type = CLEAN_TYPE_BLOOD
- decal_reagent = /datum/reagent/fuel/oil
- reagent_amount = 30
+ color = /datum/blood_type/oil::color // For mapper sanity
-/obj/effect/decal/cleanable/oil/attackby(obj/item/I, mob/living/user)
- var/attacked_by_hot_thing = I.get_temperature()
- if(attacked_by_hot_thing)
- user.visible_message(span_warning("[user] tries to ignite [src] with [I]!"), span_warning("You try to ignite [src] with [I]."))
- log_combat(user, src, (attacked_by_hot_thing < 480) ? "tried to ignite" : "ignited", I)
- fire_act(attacked_by_hot_thing)
- return
- return ..()
+/obj/effect/decal/cleanable/blood/oil/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_OIL)
-/obj/effect/decal/cleanable/oil/fire_act(exposed_temperature, exposed_volume)
- if(exposed_temperature < 480)
- return
- visible_message(span_danger("[src] catches fire!"))
- var/turf/T = get_turf(src)
- qdel(src)
- new /obj/effect/hotspot(T)
-
-/obj/effect/decal/cleanable/oil/streak
- icon_state = "streak1"
- random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
- beauty = -50
-
-/obj/effect/decal/cleanable/oil/slippery/Initialize(mapload)
+/obj/effect/decal/cleanable/blood/oil/slippery/Initialize(mapload, list/datum/disease/diseases, list/blood_or_dna)
. = ..()
AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE))
+
+/obj/effect/decal/cleanable/blood/splatter/oil
+ name = "motor oil"
+ color = /datum/blood_type/oil::color
+
+/obj/effect/decal/cleanable/blood/splatter/oil/get_default_blood_type()
+ return get_blood_type(BLOOD_TYPE_OIL)
diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm
index 803555ae89a..a527317b476 100644
--- a/code/game/objects/effects/decals/remains.dm
+++ b/code/game/objects/effects/decals/remains.dm
@@ -82,6 +82,6 @@
icon = 'icons/mob/silicon/robots.dmi'
icon_state = "remainsrobot"
-/obj/effect/decal/cleanable/robot_debris/old
+/obj/effect/decal/cleanable/blood/gibs/robot_debris/old
name = "dusty robot debris"
desc = "Looks like nobody has touched this in a while."
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index 66006a8b3ec..1c291bf6f17 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -1,4 +1,3 @@
-
/obj/effect/gibspawner
icon_state = "gibspawner"// For the map editor
var/sparks = 0 //whether sparks spread
@@ -21,8 +20,6 @@
stack_trace("Gib list dir length mismatch!")
return
- var/obj/effect/decal/cleanable/blood/gibs/gib = null
-
if(sound_to_play && isnum(sound_vol))
playsound(src, sound_to_play, sound_vol, TRUE)
@@ -31,7 +28,6 @@
s.set_up(2, 1, loc)
s.start()
-
var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling.
if(blood_dna_info)
dna_to_add = blood_dna_info
@@ -49,16 +45,15 @@
if(gibamounts[i])
for(var/j in 1 to gibamounts[i])
var/gibType = gibtypes[i]
- gib = new gibType(loc, diseases)
-
- gib.add_blood_DNA(dna_to_add)
-
// These might streak off into space and cause annoying flaky failures with mapping nearstation tests
#ifndef UNIT_TESTS
+ var/obj/effect/decal/cleanable/blood/gibs/gib = new gibType(loc, diseases, dna_to_add)
var/list/directions = gibdirections[i]
if(isturf(loc))
if(directions.len)
gib.streak(directions, mapload)
+#else
+ new gibType(loc, diseases, dna_to_add)
#endif
return INITIALIZE_HINT_QDEL
@@ -99,65 +94,59 @@
return ..()
-
/obj/effect/gibspawner/human/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
/obj/effect/gibspawner/human/bodypartless/Initialize(mapload)
if(!gibdirections.len)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
return ..()
-
/obj/effect/gibspawner/xeno
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up, /obj/effect/decal/cleanable/blood/gibs/xeno/down, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/body, /obj/effect/decal/cleanable/blood/gibs/xeno/limb, /obj/effect/decal/cleanable/blood/gibs/xeno/core)
gibamounts = list(1, 1, 1, 1, 1, 1, 1)
gib_mob_type = /mob/living/carbon/alien
/obj/effect/gibspawner/xeno/Initialize(mapload)
if(!gibdirections.len)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
return ..()
-
/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
-
/obj/effect/gibspawner/xeno/bodypartless/Initialize(mapload)
if(!gibdirections.len)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
return ..()
-
-
/obj/effect/gibspawner/larva
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body)
gibamounts = list(1, 1, 1, 1)
gib_mob_type = /mob/living/carbon/alien/larva
/obj/effect/gibspawner/larva/Initialize(mapload)
if(!gibdirections.len)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
return ..()
/obj/effect/gibspawner/larva/bodypartless
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva)
gibamounts = list(1, 1, 1)
/obj/effect/gibspawner/larva/bodypartless/Initialize(mapload)
if(!gibdirections.len)
- gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list())
+ gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list())
return ..()
/obj/effect/gibspawner/robot
sparks = 1
- gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris/limb)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot_debris/up, /obj/effect/decal/cleanable/blood/gibs/robot_debris/down, /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/blood/gibs/robot_debris/limb)
gibamounts = list(1, 1, 1, 1, 1, 1)
gib_mob_type = /mob/living/silicon
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 3dec4218ca2..7ee54407274 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -1,11 +1,12 @@
//unsorted miscellaneous temporary visuals
/obj/effect/temp_visual/dir_setting/bloodsplatter
icon = 'icons/effects/blood.dmi'
+ icon_state = "splatter1"
+ base_icon_state = "splatter"
duration = 5
randomdir = FALSE
layer = BELOW_MOB_LAYER
plane = GAME_PLANE
- var/splatter_type = "splatter"
// set_color arg can be either a color string or a singleton /datum/blood_type to pull the color from
/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir, set_color = BLOOD_COLOR_RED)
@@ -16,9 +17,9 @@
else
color = set_color
if(ISDIAGONALDIR(set_dir))
- icon_state = "[splatter_type][pick(1, 2, 6)]"
+ icon_state = "[base_icon_state][pick(1, 2, 6)]"
else
- icon_state = "[splatter_type][pick(3, 4, 5)]"
+ icon_state = "[base_icon_state][pick(3, 4, 5)]"
. = ..()
var/target_pixel_x = 0
var/target_pixel_y = 0
@@ -46,13 +47,7 @@
target_pixel_x = -16
target_pixel_y = -16
layer = ABOVE_MOB_LAYER
- animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
-
-/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter
- splatter_type = "splatter"
-
-/obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter/Initialize(mapload, set_dir, set_color = get_blood_type(/datum/blood_type/xeno::name))
- return ..()
+ animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration, flags = CUBIC_EASING | EASE_OUT)
/obj/effect/temp_visual/dir_setting/speedbike_trail
name = "speedbike trails"
diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm
index 7b9fdd81c7c..c997a4b51bd 100644
--- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm
+++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm
@@ -89,12 +89,12 @@
else
autopsy_information += "Unknown causes."
else
- var/blood_id = scanned.get_blood_id()
- if(blood_id)
+ var/datum/blood_type/blood_type = scanned.get_bloodtype()
+ if(blood_type)
var/blood_percent = round((scanned.blood_volume / BLOOD_VOLUME_NORMAL) * 100)
- var/datum/blood_type/blood_type = scanned.dna.blood_type
- autopsy_information += "Blood Type: [blood_type.name]
"
- autopsy_information += "Blood Volume: [scanned.blood_volume] cl ([blood_percent]%)
"
+ if (blood_type.get_type())
+ autopsy_information += "[blood_type.get_blood_name()] Type: [blood_type.get_type()]
"
+ autopsy_information += "[blood_type.get_blood_name()] Volume: [scanned.blood_volume] cl ([blood_percent]%)
"
for(var/datum/disease/diseases as anything in scanned.diseases)
autopsy_information += "Name: [diseases.name] | Type: [diseases.spread_text]
"
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index 34fc58f5eae..05a273b4463 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -373,35 +373,47 @@
render_list += "[body_temperature_message]
"
// Blood Level
- var/mob/living/carbon/carbontarget = target
- var/blood_id = carbontarget.get_blood_id()
- if(blood_id)
- var/blood_percent = round((carbontarget.blood_volume / BLOOD_VOLUME_NORMAL) * 100)
- var/datum/blood_type/blood_type = carbontarget.dna.blood_type
+ var/datum/blood_type/blood_type = target.get_bloodtype()
+ if(blood_type)
+ var/blood_percent = round((target.blood_volume / BLOOD_VOLUME_NORMAL) * 100)
var/blood_type_format
var/level_format
- if(carbontarget.blood_volume <= BLOOD_VOLUME_SAFE && carbontarget.blood_volume > BLOOD_VOLUME_OKAY)
- level_format = conditional_tooltip("LOW [blood_percent]%, [carbontarget.blood_volume] cl", "Recommendation: [blood_type.restoration_chem::name] supplement.", tochat)
- else if(carbontarget.blood_volume <= BLOOD_VOLUME_OKAY)
- level_format = conditional_tooltip("CRITICAL [blood_percent]%, [carbontarget.blood_volume] cl", "Recommendation: [blood_type.restoration_chem::name] supplement, [/datum/reagent/medicine/salglu_solution::name], or blood transfusion.", tochat)
+ if(target.blood_volume <= BLOOD_VOLUME_SAFE && target.blood_volume > BLOOD_VOLUME_OKAY)
+ level_format = "LOW [blood_percent]%, [target.blood_volume] cl"
+ if (blood_type.restoration_chem)
+ level_format = conditional_tooltip(level_format, "Recommendation: [blood_type.restoration_chem::name] supplement.", tochat)
+ else if(target.blood_volume <= BLOOD_VOLUME_OKAY)
+ level_format = "CRITICAL [blood_percent]%, [target.blood_volume] cl"
+ var/recommendation = list()
+ if (blood_type.restoration_chem)
+ recommendation += "[blood_type.restoration_chem::name] supplement"
+ if (blood_type.restoration_chem == /datum/reagent/iron)
+ recommendation += "[/datum/reagent/medicine/salglu_solution::name]"
+ if (length(recommendation))
+ recommendation += "[blood_type.get_blood_name()] transufion"
+ else
+ recommendation += "immediate [blood_type.get_blood_name()] transufion"
+ level_format = conditional_tooltip(level_format, "Recommendation: [english_list(recommendation, and_text = " or ")].", tochat)
else
- level_format = "[blood_percent]%, [carbontarget.blood_volume] cl"
+ level_format = "[blood_percent]%, [target.blood_volume] cl"
- blood_type_format = "type: [blood_type]"
- if(tochat && length(blood_type.compatible_types))
- var/list/compatible_types_readable = list()
- for(var/datum/blood_type/comp_blood_type as anything in blood_type.compatible_types)
- compatible_types_readable |= initial(comp_blood_type.name)
- blood_type_format = span_tooltip("Can receive from types [english_list(compatible_types_readable)].", blood_type_format)
+ if (blood_type.get_type())
+ blood_type_format = "type: [blood_type.get_type()]"
+ if(tochat && length(blood_type.compatible_types))
+ var/list/compatible_types_readable = list()
+ for(var/datum/blood_type/comp_blood_type as anything in blood_type.compatible_types)
+ compatible_types_readable |= initial(comp_blood_type.name)
+ blood_type_format = span_tooltip("Can receive from types [english_list(compatible_types_readable)].", blood_type_format)
- render_list += "Blood level: [level_format], [blood_type_format]
"
+ render_list += "[blood_type.get_blood_name()] level: [level_format], [blood_type_format]
"
var/blood_alcohol_content = target.get_blood_alcohol_content()
if(blood_alcohol_content > 0)
if(blood_alcohol_content >= 0.24)
- render_list += "Blood alcohol content: CRITICAL [blood_alcohol_content]%
"
+ // "Oil alcohol content" is kinda funny if you think about it from a technical standpoint
+ render_list += "[blood_type?.get_blood_name() || "Blood"] alcohol content: CRITICAL [blood_alcohol_content]%
"
else
- render_list += "Blood alcohol content: [blood_alcohol_content]%
"
+ render_list += "[blood_type?.get_blood_name() || "Blood"] alcohol content: [blood_alcohol_content]%
"
//Diseases
var/disease_hr = FALSE
@@ -527,9 +539,9 @@
render_block += "[round(reagent.volume, 0.001)] units of [reagent.name][reagent.overdosed ? " - [span_bolddanger("OVERDOSING")]" : "."]
"
if(!length(render_block)) //If no VISIBLY DISPLAYED reagents are present, we report as if there is nothing.
- render_list += "Subject contains no reagents in their blood.
"
+ render_list += "Subject contains no reagents in their [LOWER_TEXT(target.get_bloodtype()?.get_blood_name()) || "blood"]stream.
"
else
- render_list += "Subject contains the following reagents in their blood:
"
+ render_list += "Subject contains the following reagents in their [LOWER_TEXT(target.get_bloodtype()?.get_blood_name()) || "blood"]stream:
"
render_list += render_block //Otherwise, we add the header, reagent readouts, and clear the readout block for use on the stomach.
render_block.Cut()
diff --git a/code/game/objects/items/devices/scanners/sequence_scanner.dm b/code/game/objects/items/devices/scanners/sequence_scanner.dm
index 03ed5670d7e..c64e6aae2d1 100644
--- a/code/game/objects/items/devices/scanners/sequence_scanner.dm
+++ b/code/game/objects/items/devices/scanners/sequence_scanner.dm
@@ -119,7 +119,7 @@
"UE"=target.dna.unique_enzymes,
"UF"=target.dna.unique_features,
"name"=target.real_name,
- "blood_type"=target.dna.blood_type)
+ "blood_type"=target.get_bloodtype())
/obj/item/sequence_scanner/proc/display_sequence(mob/living/user)
if(!LAZYLEN(buffer) || !ready)
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 5d298ff1db4..35c17ca7f75 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -131,7 +131,7 @@
if(!target.dna.previous["UE"])
target.dna.previous["UE"] = target.dna.unique_enzymes
if(!target.dna.previous["blood_type"])
- target.dna.previous["blood_type"] = target.dna.blood_type
+ target.dna.previous["blood_type"] = target.get_bloodtype()
target.real_name = fields["name"]
target.dna.unique_enzymes = fields["UE"]
target.name = target.real_name
diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm
index d0b79db44fd..179812872e7 100644
--- a/code/game/objects/items/food/meatslab.dm
+++ b/code/game/objects/items/food/meatslab.dm
@@ -24,7 +24,6 @@
/datum/component/bloody_spreader,\
blood_left = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\
blood_dna = blood_dna_list,\
- diseases = null,\
)
/obj/item/food/meat/slab
@@ -290,7 +289,7 @@
bite_consumption = 4
tastes = list("meat" = 1, "acid" = 1)
foodtypes = RAW | MEAT
- blood_decal_type = /obj/effect/decal/cleanable/xenoblood
+ blood_decal_type = /obj/effect/decal/cleanable/blood/xeno
/obj/item/food/meat/slab/xeno/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/xeno, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut")
@@ -670,7 +669,7 @@
/obj/item/food/meat/rawcutlet/xeno
name = "raw xeno cutlet"
tastes = list("meat" = 1, "acid" = 1)
- blood_decal_type = /obj/effect/decal/cleanable/xenoblood
+ blood_decal_type = /obj/effect/decal/cleanable/blood/xeno
/obj/item/food/meat/rawcutlet/xeno/make_grillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/xeno, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm
index 066d75a1e54..650405f467f 100644
--- a/code/game/objects/items/lighter.dm
+++ b/code/game/objects/items/lighter.dm
@@ -63,7 +63,7 @@
/obj/item/lighter/proc/on_intercepted_bullet(mob/living/victim, obj/projectile/bullet)
victim.visible_message(span_warning("\The [bullet] shatters on [victim]'s lighter!"))
playsound(victim, SFX_RICOCHET, 100, TRUE)
- new /obj/effect/decal/cleanable/oil(get_turf(src))
+ new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
do_sparks(1, TRUE, src)
victim.dropItemToGround(src, force = TRUE, silent = TRUE)
qdel(src)
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 16da3fddbbc..66a01dfbfa3 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -287,8 +287,6 @@
AddComponent(
/datum/component/bloody_spreader,\
blood_left = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\
- blood_dna = list("MEAT DNA" = "MT+"),\
- diseases = null,\
)
/*
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index 1c179bb1495..7d62320f3b5 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -524,7 +524,7 @@
///Bleed and make blood splatters at tele start and end points
/obj/item/syndicate_teleporter/proc/make_bloods(turf/old_location, turf/new_location, mob/living/user)
- if(HAS_TRAIT(user, TRAIT_NOBLOOD))
+ if(!user.can_bleed(BLOOD_COVER_TURFS) != BLEED_SPLATTER)
return FALSE
user.add_splatter_floor(old_location)
user.add_splatter_floor(new_location)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index c7ef0edb806..2376faaae2d 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -30,8 +30,6 @@
var/knock_sound = 'sound/effects/glass/glassknock.ogg'
var/bash_sound = 'sound/effects/glass/glassbash.ogg'
var/hit_sound = 'sound/effects/glass/glasshit.ogg'
- /// If some inconsiderate jerk has had their blood spilled on this window, thus making it cleanable
- var/bloodied = FALSE
///Datum that the shard and debris type is pulled from for when the glass is broken.
var/datum/material/glass_material_datum = /datum/material/glass
/// Whether or not we're disappearing but dramatically
@@ -385,7 +383,6 @@
if(!cleanables.wash(clean_types))
continue
vis_contents -= cleanables
- bloodied = FALSE
/obj/structure/window/Destroy()
set_density(FALSE)
diff --git a/code/game/turfs/open/dirtystation.dm b/code/game/turfs/open/dirtystation.dm
index 63d25fefb87..3808622982d 100644
--- a/code/game/turfs/open/dirtystation.dm
+++ b/code/game/turfs/open/dirtystation.dm
@@ -55,9 +55,9 @@
switch (rand(1, 100))
if(1 to 35)//35%
if(prob(4))
- new /obj/effect/decal/cleanable/robot_debris/old(src)
+ new /obj/effect/decal/cleanable/blood/gibs/robot_debris/old(src)
else
- new /obj/effect/decal/cleanable/oil(src)
+ new /obj/effect/decal/cleanable/blood/oil(src)
if(35 to 95)//60%
new /obj/effect/decal/cleanable/dirt(src)
if(95 to 100)//5%
@@ -83,7 +83,7 @@
var/static/list/oily_areas = typecacheof(/area/station/cargo)
if(is_type_in_typecache(A, oily_areas))
if(prob(25))
- new /obj/effect/decal/cleanable/oil(src)
+ new /obj/effect/decal/cleanable/blood/oil(src)
else if(prob(20))
// or occasionally the signs of opened packages
new /obj/effect/decal/cleanable/wrapping(src)
diff --git a/code/modules/admin/verbs/list_exposer.dm b/code/modules/admin/verbs/list_exposer.dm
index 2f7e3d67d5f..5dee40c6da1 100644
--- a/code/modules/admin/verbs/list_exposer.dm
+++ b/code/modules/admin/verbs/list_exposer.dm
@@ -36,7 +36,7 @@
for(var/entry in GLOB.human_list)
var/mob/living/carbon/human/subject = entry
if(subject.ckey)
- data += "