diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
similarity index 97%
rename from code/game/objects/effects/decals/Cleanable/aliens.dm
rename to code/game/objects/effects/decals/cleanable/aliens.dm
index 7d1179a0f2..3ab96f6df5 100644
--- a/code/game/objects/effects/decals/Cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -1,76 +1,76 @@
-// 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"
- desc = "It's green and acidic. It looks like... blood?"
- icon = 'icons/effects/blood.dmi'
- icon_state = "xfloor1"
- random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
- var/list/viruses = list()
- blood_DNA = list("UNKNOWN DNA" = "X*")
- bloodiness = MAX_SHOE_BLOODINESS
- blood_state = BLOOD_STATE_XENO
-
-/obj/effect/decal/cleanable/xenoblood/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
-/obj/effect/decal/cleanable/xenoblood/xsplatter
- random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs
- name = "xeno gibs"
- desc = "Gnarly..."
- icon = 'icons/effects/blood.dmi'
- icon_state = "xgib1"
- layer = LOW_OBJ_LAYER
- random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
- mergeable_decal = 0
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions)
- set waitfor = 0
- var/direction = pick(directions)
- for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
- sleep(2)
- if (i > 0)
- var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc)
- for(var/datum/disease/D in src.viruses)
- var/datum/disease/ND = D.Copy(1)
- b.viruses += ND
- ND.holder = b
- if (!step_to(src, get_step(src, direction), 0))
- break
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
- return
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/up
- random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/down
- random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/body
- random_icon_states = list("xgibhead", "xgibtorso")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/torso
- random_icon_states = list("xgibtorso")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/limb
- random_icon_states = list("xgibleg", "xgibarm")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/core
- random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva
- random_icon_states = list("xgiblarva1", "xgiblarva2")
-
-/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body
- random_icon_states = list("xgiblarvahead", "xgiblarvatorso")
-
-/obj/effect/decal/cleanable/blood/xtracks
- icon_state = "xtracks"
- random_icon_states = null
- blood_DNA = list("UNKNOWN DNA" = "X*")
+// 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"
+ desc = "It's green and acidic. It looks like... blood?"
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "xfloor1"
+ random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
+ var/list/viruses = list()
+ blood_DNA = list("UNKNOWN DNA" = "X*")
+ bloodiness = MAX_SHOE_BLOODINESS
+ blood_state = BLOOD_STATE_XENO
+
+/obj/effect/decal/cleanable/xenoblood/Destroy()
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
+ viruses = null
+ return ..()
+
+/obj/effect/decal/cleanable/xenoblood/xsplatter
+ random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs
+ name = "xeno gibs"
+ desc = "Gnarly..."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "xgib1"
+ layer = LOW_OBJ_LAYER
+ random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
+ mergeable_decal = 0
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions)
+ set waitfor = 0
+ var/direction = pick(directions)
+ for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
+ sleep(2)
+ if (i > 0)
+ var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc)
+ for(var/datum/disease/D in src.viruses)
+ var/datum/disease/ND = D.Copy(1)
+ b.viruses += ND
+ ND.holder = b
+ if (!step_to(src, get_step(src, direction), 0))
+ break
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act()
+ return
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/up
+ random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/down
+ random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/body
+ random_icon_states = list("xgibhead", "xgibtorso")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/torso
+ random_icon_states = list("xgibtorso")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/limb
+ random_icon_states = list("xgibleg", "xgibarm")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/core
+ random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/larva
+ random_icon_states = list("xgiblarva1", "xgiblarva2")
+
+/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body
+ random_icon_states = list("xgiblarvahead", "xgiblarvatorso")
+
+/obj/effect/decal/cleanable/blood/xtracks
+ icon_state = "xtracks"
+ random_icon_states = null
+ blood_DNA = list("UNKNOWN DNA" = "X*")
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
similarity index 96%
rename from code/game/objects/effects/decals/Cleanable/humans.dm
rename to code/game/objects/effects/decals/cleanable/humans.dm
index 31cfdeea53..0d4b578653 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -1,204 +1,204 @@
-/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")
- var/list/viruses = list()
- blood_DNA = list()
- blood_state = BLOOD_STATE_HUMAN
- bloodiness = MAX_SHOE_BLOODINESS
-
-/obj/effect/decal/cleanable/blood/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
-/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
- if (C.blood_DNA)
- blood_DNA |= C.blood_DNA.Copy()
- ..()
-
-/obj/effect/decal/cleanable/blood/old
- name = "dried blood"
- desc = "Looks like it's been here a while. Eew."
- bloodiness = 0
-
-/obj/effect/decal/cleanable/blood/old/Initialize()
- ..()
- icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization.
- blood_DNA["Non-human DNA"] = "A+"
-
-/obj/effect/decal/cleanable/blood/splatter
- random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
-
-/obj/effect/decal/cleanable/blood/tracks
- icon_state = "tracks"
- desc = "They look like tracks left by wheels."
- random_icon_states = null
-
-/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
- name = "blood"
- icon_state = "ltrails_1"
- desc = "Your instincts say you shouldn't be following these."
- random_icon_states = null
- var/list/existing_dirs = list()
- blood_DNA = list()
-
-
-/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
- return 1
-
-
-/obj/effect/decal/cleanable/blood/gibs
- name = "gibs"
- desc = "They look bloody and gruesome."
- icon = 'icons/effects/blood.dmi'
- icon_state = "gibbl5"
- layer = LOW_OBJ_LAYER
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
- mergeable_decal = 0
-
-/obj/effect/decal/cleanable/blood/gibs/Initialize()
- ..()
- reagents.add_reagent("liquidgibs", 5)
-
-/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
- return
-
-/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
- set waitfor = 0
- var/direction = pick(directions)
- for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
- sleep(2)
- if (i > 0)
- var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
- for(var/datum/disease/D in src.viruses)
- var/datum/disease/ND = D.Copy(1)
- b.viruses += ND
- ND.holder = b
- if (!step_to(src, get_step(src, direction), 0))
- break
-
-/obj/effect/decal/cleanable/blood/gibs/up
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
-
-/obj/effect/decal/cleanable/blood/gibs/down
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
-
-/obj/effect/decal/cleanable/blood/gibs/body
- random_icon_states = list("gibhead", "gibtorso")
-
-/obj/effect/decal/cleanable/blood/gibs/torso
- random_icon_states = list("gibtorso")
-
-/obj/effect/decal/cleanable/blood/gibs/limb
- random_icon_states = list("gibleg", "gibarm")
-
-/obj/effect/decal/cleanable/blood/gibs/core
- 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? It smells terrible."
- bloodiness = 0
-
-/obj/effect/decal/cleanable/blood/gibs/old/Initialize()
- ..()
- setDir(pick(1,2,4,8))
- icon_state += "-old"
- blood_DNA["Non-human DNA"] = "A+"
-
-
-/obj/effect/decal/cleanable/blood/drip
- name = "drips of blood"
- desc = "It's red."
- icon_state = "1"
- random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
- bloodiness = 0
- var/drips = 1
-
-
-/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
- return 1
-
-
-//BLOODY FOOTPRINTS
-/obj/effect/decal/cleanable/blood/footprints
- name = "footprints"
- icon = 'icons/effects/footprints.dmi'
- icon_state = "nothingwhatsoever"
- desc = "where might they lead?"
- random_icon_states = null
- var/entered_dirs = 0
- var/exited_dirs = 0
- blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
- var/list/shoe_types = list()
-
-/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O)
- if(ishuman(O))
- var/mob/living/carbon/human/H = O
- var/obj/item/clothing/shoes/S = H.shoes
- if(S && S.bloody_shoes[blood_state])
- S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
- entered_dirs|= H.dir
- shoe_types |= H.shoes.type
- update_icon()
-
-/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O)
- if(ishuman(O))
- var/mob/living/carbon/human/H = O
- var/obj/item/clothing/shoes/S = H.shoes
- if(S && S.bloody_shoes[blood_state])
- S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
- exited_dirs|= H.dir
- shoe_types |= H.shoes.type
- update_icon()
-
-/obj/effect/decal/cleanable/blood/footprints/update_icon()
- cut_overlays()
-
- for(var/Ddir in GLOB.cardinal)
- if(entered_dirs & Ddir)
- var/image/I
- if(GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"])
- I = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"]
- else
- I = image(icon,"[blood_state]1",dir = Ddir)
- GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = I
- if(I)
- add_overlay(I)
- if(exited_dirs & Ddir)
- var/image/I
- if(GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"])
- I = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"]
- else
- I = image(icon,"[blood_state]2",dir = Ddir)
- GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = I
- if(I)
- add_overlay(I)
-
- alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness
-
-
-/obj/effect/decal/cleanable/blood/footprints/examine(mob/user)
- . = ..()
- if(shoe_types.len)
- . += "You recognise the footprints as belonging to:\n"
- for(var/shoe in shoe_types)
- var/obj/item/clothing/shoes/S = shoe
- . += "some [initial(S.name)] \icon[S]\n"
-
- to_chat(user, .)
-
-/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C)
- if(blood_state != C.blood_state) //We only replace footprints of the same type as us
- return
- ..()
-
-/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in()
- if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
- return 1
- return 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")
+ var/list/viruses = list()
+ blood_DNA = list()
+ blood_state = BLOOD_STATE_HUMAN
+ bloodiness = MAX_SHOE_BLOODINESS
+
+/obj/effect/decal/cleanable/blood/Destroy()
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
+ viruses = null
+ return ..()
+
+/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
+ if (C.blood_DNA)
+ blood_DNA |= C.blood_DNA.Copy()
+ ..()
+
+/obj/effect/decal/cleanable/blood/old
+ name = "dried blood"
+ desc = "Looks like it's been here a while. Eew."
+ bloodiness = 0
+
+/obj/effect/decal/cleanable/blood/old/Initialize()
+ ..()
+ icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization.
+ blood_DNA["Non-human DNA"] = "A+"
+
+/obj/effect/decal/cleanable/blood/splatter
+ random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
+
+/obj/effect/decal/cleanable/blood/tracks
+ icon_state = "tracks"
+ desc = "They look like tracks left by wheels."
+ random_icon_states = null
+
+/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
+ name = "blood"
+ icon_state = "ltrails_1"
+ desc = "Your instincts say you shouldn't be following these."
+ random_icon_states = null
+ var/list/existing_dirs = list()
+ blood_DNA = list()
+
+
+/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
+ return 1
+
+
+/obj/effect/decal/cleanable/blood/gibs
+ name = "gibs"
+ desc = "They look bloody and gruesome."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "gibbl5"
+ layer = LOW_OBJ_LAYER
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
+ mergeable_decal = 0
+
+/obj/effect/decal/cleanable/blood/gibs/Initialize()
+ ..()
+ reagents.add_reagent("liquidgibs", 5)
+
+/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
+ return
+
+/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
+ set waitfor = 0
+ var/direction = pick(directions)
+ for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
+ sleep(2)
+ if (i > 0)
+ var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
+ for(var/datum/disease/D in src.viruses)
+ var/datum/disease/ND = D.Copy(1)
+ b.viruses += ND
+ ND.holder = b
+ if (!step_to(src, get_step(src, direction), 0))
+ break
+
+/obj/effect/decal/cleanable/blood/gibs/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/blood/gibs/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/blood/gibs/body
+ random_icon_states = list("gibhead", "gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/torso
+ random_icon_states = list("gibtorso")
+
+/obj/effect/decal/cleanable/blood/gibs/limb
+ random_icon_states = list("gibleg", "gibarm")
+
+/obj/effect/decal/cleanable/blood/gibs/core
+ 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? It smells terrible."
+ bloodiness = 0
+
+/obj/effect/decal/cleanable/blood/gibs/old/Initialize()
+ ..()
+ setDir(pick(1,2,4,8))
+ icon_state += "-old"
+ blood_DNA["Non-human DNA"] = "A+"
+
+
+/obj/effect/decal/cleanable/blood/drip
+ name = "drips of blood"
+ desc = "It's red."
+ icon_state = "1"
+ random_icon_states = list("drip1","drip2","drip3","drip4","drip5")
+ bloodiness = 0
+ var/drips = 1
+
+
+/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
+ return 1
+
+
+//BLOODY FOOTPRINTS
+/obj/effect/decal/cleanable/blood/footprints
+ name = "footprints"
+ icon = 'icons/effects/footprints.dmi'
+ icon_state = "nothingwhatsoever"
+ desc = "where might they lead?"
+ random_icon_states = null
+ var/entered_dirs = 0
+ var/exited_dirs = 0
+ blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
+ var/list/shoe_types = list()
+
+/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O)
+ if(ishuman(O))
+ var/mob/living/carbon/human/H = O
+ var/obj/item/clothing/shoes/S = H.shoes
+ if(S && S.bloody_shoes[blood_state])
+ S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
+ entered_dirs|= H.dir
+ shoe_types |= H.shoes.type
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O)
+ if(ishuman(O))
+ var/mob/living/carbon/human/H = O
+ var/obj/item/clothing/shoes/S = H.shoes
+ if(S && S.bloody_shoes[blood_state])
+ S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0)
+ exited_dirs|= H.dir
+ shoe_types |= H.shoes.type
+ update_icon()
+
+/obj/effect/decal/cleanable/blood/footprints/update_icon()
+ cut_overlays()
+
+ for(var/Ddir in GLOB.cardinal)
+ if(entered_dirs & Ddir)
+ var/image/I
+ if(GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"])
+ I = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"]
+ else
+ I = image(icon,"[blood_state]1",dir = Ddir)
+ GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = I
+ if(I)
+ add_overlay(I)
+ if(exited_dirs & Ddir)
+ var/image/I
+ if(GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"])
+ I = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"]
+ else
+ I = image(icon,"[blood_state]2",dir = Ddir)
+ GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = I
+ if(I)
+ add_overlay(I)
+
+ alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness
+
+
+/obj/effect/decal/cleanable/blood/footprints/examine(mob/user)
+ . = ..()
+ if(shoe_types.len)
+ . += "You recognise the footprints as belonging to:\n"
+ for(var/shoe in shoe_types)
+ var/obj/item/clothing/shoes/S = shoe
+ . += "some [initial(S.name)] \icon[S]\n"
+
+ to_chat(user, .)
+
+/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C)
+ if(blood_state != C.blood_state) //We only replace footprints of the same type as us
+ return
+ ..()
+
+/obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in()
+ if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
+ return 1
+ return 0
+
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
similarity index 96%
rename from code/game/objects/effects/decals/Cleanable/misc.dm
rename to code/game/objects/effects/decals/cleanable/misc.dm
index 468eb367f8..f1b0a9ce40 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -1,188 +1,188 @@
-/obj/effect/decal/cleanable/generic
- name = "clutter"
- desc = "Someone should clean that up."
- icon = 'icons/obj/objects.dmi'
- icon_state = "shards"
-
-/obj/effect/decal/cleanable/ash
- name = "ashes"
- desc = "Ashes to ashes, dust to dust, and into space."
- icon = 'icons/obj/objects.dmi'
- icon_state = "ash"
- mergeable_decal = 0
-
-/obj/effect/decal/cleanable/ash/Initialize()
- ..()
- reagents.add_reagent("ash", 30)
- pixel_x = rand(-5, 5)
- pixel_y = rand(-5, 5)
-
-/obj/effect/decal/cleanable/ash/large
- name = "large pile of ashes"
- icon_state = "big_ash"
-
-/obj/effect/decal/cleanable/ash/large/Initialize()
- ..()
- reagents.add_reagent("ash", 30) //double the amount of ash.
-
-
-/obj/effect/decal/cleanable/dirt
- name = "dirt"
- desc = "Someone should clean that up."
- icon_state = "dirt"
- mouse_opacity = 0
-
-/obj/effect/decal/cleanable/flour
- name = "flour"
- desc = "It's still good. Four second rule!"
- icon_state = "flour"
-
-/obj/effect/decal/cleanable/greenglow
- name = "glowing goo"
- desc = "Jeez. I hope that's not for lunch."
- light_color = LIGHT_COLOR_GREEN
- icon_state = "greenglow"
-
-/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
- ..()
- set_light(1)
-
-/obj/effect/decal/cleanable/greenglow/ex_act()
- return
-
-/obj/effect/decal/cleanable/cobweb
- name = "cobweb"
- desc = "Somebody should remove that."
- gender = NEUTER
- layer = WALL_OBJ_LAYER
- icon_state = "cobweb1"
- resistance_flags = FLAMMABLE
-
-/obj/effect/decal/cleanable/cobweb/cobweb2
- icon_state = "cobweb2"
-
-/obj/effect/decal/cleanable/molten_object
- name = "gooey grey mass"
- desc = "It looks like a melted... something."
- gender = NEUTER
- icon = 'icons/effects/effects.dmi'
- icon_state = "molten"
- mergeable_decal = 0
-
-/obj/effect/decal/cleanable/molten_object/large
- name = "big gooey grey mass"
- icon_state = "big_molten"
-
-//Vomit (sorry)
-/obj/effect/decal/cleanable/vomit
- name = "vomit"
- desc = "Gosh, how unpleasant."
- icon = 'icons/effects/blood.dmi'
- icon_state = "vomit_1"
- random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
- var/list/viruses = list()
-
-/obj/effect/decal/cleanable/vomit/attack_hand(var/mob/user)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(isflyperson(H))
- playsound(get_turf(src), 'sound/items/drink.ogg', 50, 1) //slurp
- H.visible_message("[H] extends a small proboscis into the vomit pool, sucking it with a slurping sound.")
- if(reagents)
- for(var/datum/reagent/R in reagents.reagent_list)
- if (istype(R, /datum/reagent/consumable))
- var/datum/reagent/consumable/nutri_check = R
- if(nutri_check.nutriment_factor >0)
- H.nutrition += nutri_check.nutriment_factor * nutri_check.volume
- reagents.remove_reagent(nutri_check.id,nutri_check.volume)
- reagents.trans_to(H, reagents.total_volume)
- qdel(src)
-
-/obj/effect/decal/cleanable/vomit/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
-/obj/effect/decal/cleanable/vomit/old
- name = "crusty dried vomit"
- desc = "You try not to look at the chunks, and fail."
-
-/obj/effect/decal/cleanable/vomit/old/Initialize()
- ..()
- icon_state += "-old"
-
-/obj/effect/decal/cleanable/tomato_smudge
- name = "tomato smudge"
- desc = "It's red."
- gender = NEUTER
- icon = 'icons/effects/tomatodecal.dmi'
- random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
-
-/obj/effect/decal/cleanable/plant_smudge
- name = "plant smudge"
- gender = NEUTER
- icon = 'icons/effects/tomatodecal.dmi'
- random_icon_states = list("smashed_plant")
-
-/obj/effect/decal/cleanable/egg_smudge
- name = "smashed egg"
- desc = "Seems like this one won't hatch."
- gender = NEUTER
- icon = 'icons/effects/tomatodecal.dmi'
- random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
-
-/obj/effect/decal/cleanable/pie_smudge //honk
- name = "smashed pie"
- desc = "It's pie cream from a cream pie."
- gender = NEUTER
- icon = 'icons/effects/tomatodecal.dmi'
- random_icon_states = list("smashed_pie")
-
-/obj/effect/decal/cleanable/chem_pile
- name = "chemical pile"
- desc = "A pile of chemicals. You can't quite tell what's inside it."
- gender = NEUTER
- icon = 'icons/obj/objects.dmi'
- icon_state = "ash"
-
-/obj/effect/decal/cleanable/shreds
- name = "shreds"
- desc = "The shredded remains of what appears to be clothing."
- icon_state = "shreds"
- gender = PLURAL
- mergeable_decal = 0
-
-/obj/effect/decal/cleanable/shreds/ex_act(severity, target)
- if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
- qdel(src)
-
-/obj/effect/decal/cleanable/shreds/Initialize()
- pixel_x = rand(-10, 10)
- pixel_y = rand(-10, 10)
- ..()
-
-/obj/effect/decal/cleanable/salt
- name = "salt pile"
- desc = "A sizable pile of table salt. Someone must be upset."
- icon = 'icons/effects/tomatodecal.dmi'
- icon_state = "salt_pile"
- gender = NEUTER
-
-/obj/effect/decal/cleanable/glitter
- name = "generic glitter pile"
- desc = "The herpes of arts and crafts."
- icon = 'icons/effects/tile_effects.dmi'
- gender = NEUTER
-
-/obj/effect/decal/cleanable/glitter/pink
- name = "pink glitter"
- icon_state = "plasma"
-
-/obj/effect/decal/cleanable/glitter/white
- name = "white glitter"
- icon_state = "nitrous_oxide"
-
-/obj/effect/decal/cleanable/glitter/blue
- name = "blue glitter"
- icon_state = "freon"
+/obj/effect/decal/cleanable/generic
+ name = "clutter"
+ desc = "Someone should clean that up."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "shards"
+
+/obj/effect/decal/cleanable/ash
+ name = "ashes"
+ desc = "Ashes to ashes, dust to dust, and into space."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "ash"
+ mergeable_decal = 0
+
+/obj/effect/decal/cleanable/ash/Initialize()
+ ..()
+ reagents.add_reagent("ash", 30)
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
+/obj/effect/decal/cleanable/ash/large
+ name = "large pile of ashes"
+ icon_state = "big_ash"
+
+/obj/effect/decal/cleanable/ash/large/Initialize()
+ ..()
+ reagents.add_reagent("ash", 30) //double the amount of ash.
+
+
+/obj/effect/decal/cleanable/dirt
+ name = "dirt"
+ desc = "Someone should clean that up."
+ icon_state = "dirt"
+ mouse_opacity = 0
+
+/obj/effect/decal/cleanable/flour
+ name = "flour"
+ desc = "It's still good. Four second rule!"
+ icon_state = "flour"
+
+/obj/effect/decal/cleanable/greenglow
+ name = "glowing goo"
+ desc = "Jeez. I hope that's not for lunch."
+ light_color = LIGHT_COLOR_GREEN
+ icon_state = "greenglow"
+
+/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
+ ..()
+ set_light(1)
+
+/obj/effect/decal/cleanable/greenglow/ex_act()
+ return
+
+/obj/effect/decal/cleanable/cobweb
+ name = "cobweb"
+ desc = "Somebody should remove that."
+ gender = NEUTER
+ layer = WALL_OBJ_LAYER
+ icon_state = "cobweb1"
+ resistance_flags = FLAMMABLE
+
+/obj/effect/decal/cleanable/cobweb/cobweb2
+ icon_state = "cobweb2"
+
+/obj/effect/decal/cleanable/molten_object
+ name = "gooey grey mass"
+ desc = "It looks like a melted... something."
+ gender = NEUTER
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "molten"
+ mergeable_decal = 0
+
+/obj/effect/decal/cleanable/molten_object/large
+ name = "big gooey grey mass"
+ icon_state = "big_molten"
+
+//Vomit (sorry)
+/obj/effect/decal/cleanable/vomit
+ name = "vomit"
+ desc = "Gosh, how unpleasant."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "vomit_1"
+ random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
+ var/list/viruses = list()
+
+/obj/effect/decal/cleanable/vomit/attack_hand(var/mob/user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(isflyperson(H))
+ playsound(get_turf(src), 'sound/items/drink.ogg', 50, 1) //slurp
+ H.visible_message("[H] extends a small proboscis into the vomit pool, sucking it with a slurping sound.")
+ if(reagents)
+ for(var/datum/reagent/R in reagents.reagent_list)
+ if (istype(R, /datum/reagent/consumable))
+ var/datum/reagent/consumable/nutri_check = R
+ if(nutri_check.nutriment_factor >0)
+ H.nutrition += nutri_check.nutriment_factor * nutri_check.volume
+ reagents.remove_reagent(nutri_check.id,nutri_check.volume)
+ reagents.trans_to(H, reagents.total_volume)
+ qdel(src)
+
+/obj/effect/decal/cleanable/vomit/Destroy()
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
+ viruses = null
+ return ..()
+
+/obj/effect/decal/cleanable/vomit/old
+ name = "crusty dried vomit"
+ desc = "You try not to look at the chunks, and fail."
+
+/obj/effect/decal/cleanable/vomit/old/Initialize()
+ ..()
+ icon_state += "-old"
+
+/obj/effect/decal/cleanable/tomato_smudge
+ name = "tomato smudge"
+ desc = "It's red."
+ gender = NEUTER
+ icon = 'icons/effects/tomatodecal.dmi'
+ random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
+
+/obj/effect/decal/cleanable/plant_smudge
+ name = "plant smudge"
+ gender = NEUTER
+ icon = 'icons/effects/tomatodecal.dmi'
+ random_icon_states = list("smashed_plant")
+
+/obj/effect/decal/cleanable/egg_smudge
+ name = "smashed egg"
+ desc = "Seems like this one won't hatch."
+ gender = NEUTER
+ icon = 'icons/effects/tomatodecal.dmi'
+ random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
+
+/obj/effect/decal/cleanable/pie_smudge //honk
+ name = "smashed pie"
+ desc = "It's pie cream from a cream pie."
+ gender = NEUTER
+ icon = 'icons/effects/tomatodecal.dmi'
+ random_icon_states = list("smashed_pie")
+
+/obj/effect/decal/cleanable/chem_pile
+ name = "chemical pile"
+ desc = "A pile of chemicals. You can't quite tell what's inside it."
+ gender = NEUTER
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "ash"
+
+/obj/effect/decal/cleanable/shreds
+ name = "shreds"
+ desc = "The shredded remains of what appears to be clothing."
+ icon_state = "shreds"
+ gender = PLURAL
+ mergeable_decal = 0
+
+/obj/effect/decal/cleanable/shreds/ex_act(severity, target)
+ if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion.
+ qdel(src)
+
+/obj/effect/decal/cleanable/shreds/Initialize()
+ pixel_x = rand(-10, 10)
+ pixel_y = rand(-10, 10)
+ ..()
+
+/obj/effect/decal/cleanable/salt
+ name = "salt pile"
+ desc = "A sizable pile of table salt. Someone must be upset."
+ icon = 'icons/effects/tomatodecal.dmi'
+ icon_state = "salt_pile"
+ gender = NEUTER
+
+/obj/effect/decal/cleanable/glitter
+ name = "generic glitter pile"
+ desc = "The herpes of arts and crafts."
+ icon = 'icons/effects/tile_effects.dmi'
+ gender = NEUTER
+
+/obj/effect/decal/cleanable/glitter/pink
+ name = "pink glitter"
+ icon_state = "plasma"
+
+/obj/effect/decal/cleanable/glitter/white
+ name = "white glitter"
+ icon_state = "nitrous_oxide"
+
+/obj/effect/decal/cleanable/glitter/blue
+ name = "blue glitter"
+ icon_state = "freon"
diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
similarity index 97%
rename from code/game/objects/effects/decals/Cleanable/robots.dm
rename to code/game/objects/effects/decals/cleanable/robots.dm
index 30bfd77b29..862d21ad6b 100644
--- a/code/game/objects/effects/decals/Cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -1,62 +1,62 @@
-// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
-
-/obj/effect/decal/cleanable/robot_debris
- name = "robot debris"
- desc = "It's a useless heap of junk... or is it?"
- icon = 'icons/mob/robots.dmi'
- icon_state = "gib1"
- layer = LOW_OBJ_LAYER
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
- blood_state = BLOOD_STATE_OIL
- bloodiness = MAX_SHOE_BLOODINESS
- mergeable_decal = 0
-
-/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions)
- set waitfor = 0
- var/direction = pick(directions)
- for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
- sleep(2)
- if (i > 0)
- if (prob(40))
- new /obj/effect/decal/cleanable/oil/streak(src.loc)
- 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()
- if (!step_to(src, get_step(src, direction), 0))
- break
-
-/obj/effect/decal/cleanable/robot_debris/ex_act()
- return
-
-/obj/effect/decal/cleanable/robot_debris/limb
- random_icon_states = list("gibarm", "gibleg")
-
-/obj/effect/decal/cleanable/robot_debris/up
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1")
-
-/obj/effect/decal/cleanable/robot_debris/down
- random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1")
-
-/obj/effect/decal/cleanable/oil
- name = "motor oil"
- desc = "It's black and greasy. Looks like Beepsky made another mess."
- icon = 'icons/mob/robots.dmi'
- icon_state = "floor1"
- var/viruses = list()
- random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
- blood_state = BLOOD_STATE_OIL
- bloodiness = MAX_SHOE_BLOODINESS
-
-/obj/effect/decal/cleanable/oil/Initialize()
- ..()
- reagents.add_reagent("oil", 30)
-
-/obj/effect/decal/cleanable/oil/Destroy()
- for(var/datum/disease/D in viruses)
- D.cure(0)
- viruses = null
- return ..()
-
-/obj/effect/decal/cleanable/oil/streak
- random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
+// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
+
+/obj/effect/decal/cleanable/robot_debris
+ name = "robot debris"
+ desc = "It's a useless heap of junk... or is it?"
+ icon = 'icons/mob/robots.dmi'
+ icon_state = "gib1"
+ layer = LOW_OBJ_LAYER
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
+ blood_state = BLOOD_STATE_OIL
+ bloodiness = MAX_SHOE_BLOODINESS
+ mergeable_decal = 0
+
+/obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions)
+ set waitfor = 0
+ var/direction = pick(directions)
+ for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
+ sleep(2)
+ if (i > 0)
+ if (prob(40))
+ new /obj/effect/decal/cleanable/oil/streak(src.loc)
+ 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()
+ if (!step_to(src, get_step(src, direction), 0))
+ break
+
+/obj/effect/decal/cleanable/robot_debris/ex_act()
+ return
+
+/obj/effect/decal/cleanable/robot_debris/limb
+ random_icon_states = list("gibarm", "gibleg")
+
+/obj/effect/decal/cleanable/robot_debris/up
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1")
+
+/obj/effect/decal/cleanable/robot_debris/down
+ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1")
+
+/obj/effect/decal/cleanable/oil
+ name = "motor oil"
+ desc = "It's black and greasy. Looks like Beepsky made another mess."
+ icon = 'icons/mob/robots.dmi'
+ icon_state = "floor1"
+ var/viruses = list()
+ random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
+ blood_state = BLOOD_STATE_OIL
+ bloodiness = MAX_SHOE_BLOODINESS
+
+/obj/effect/decal/cleanable/oil/Initialize()
+ ..()
+ reagents.add_reagent("oil", 30)
+
+/obj/effect/decal/cleanable/oil/Destroy()
+ for(var/datum/disease/D in viruses)
+ D.cure(0)
+ viruses = null
+ return ..()
+
+/obj/effect/decal/cleanable/oil/streak
+ random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
diff --git a/tgstation.dme b/tgstation.dme
index 140bd78f79..97e5c82d07 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -695,10 +695,10 @@
#include "code\game\objects\effects\decals\decal.dm"
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
-#include "code\game\objects\effects\decals\Cleanable\aliens.dm"
-#include "code\game\objects\effects\decals\Cleanable\humans.dm"
-#include "code\game\objects\effects\decals\Cleanable\misc.dm"
-#include "code\game\objects\effects\decals\Cleanable\robots.dm"
+#include "code\game\objects\effects\decals\cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\cleanable\humans.dm"
+#include "code\game\objects\effects\decals\cleanable\misc.dm"
+#include "code\game\objects\effects\decals\cleanable\robots.dm"
#include "code\game\objects\effects\effect_system\effect_system.dm"
#include "code\game\objects\effects\effect_system\effects_explosion.dm"
#include "code\game\objects\effects\effect_system\effects_foam.dm"