diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 23d76f7094e..0013d531067 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -70,10 +70,45 @@
spawn(DRYING_TIME)
Del()
+/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
+ ..()
+ if (amount && istype(user))
+ add_fingerprint(user)
+ if (user.gloves)
+ return
+ var/taken = rand(1,amount)
+ amount -= taken
+ user << "You get some blood on your hands."
+ if (!user.blood_DNA)
+ user.blood_DNA = list()
+ user.blood_DNA |= blood_DNA.Copy()
+ user.bloody_hands += taken
+ user.update_inv_gloves(1)
+ user.verbs += /mob/living/carbon/human/proc/bloody_doodle
+
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
amount = 2
+/obj/effect/decal/cleanable/blood/writing
+ icon_state = "tracks"
+ desc = "It looks like a writing in blood."
+ gender = NEUTER
+ random_icon_states = list("writing1","writing2","writing3","writing4","writing5")
+ amount = 0
+ var/message
+
+/obj/effect/decal/cleanable/blood/writing/New()
+ ..()
+ for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
+ random_icon_states.Remove(W.icon_state)
+ icon_state = pick(random_icon_states)
+
+/obj/effect/decal/cleanable/blood/writing/examine()
+ ..()
+ usr << "It reads: \"[message]\""
+
+
/obj/effect/decal/cleanable/blood/green
name = "green blood"
desc = "It's green and gooey. Perhaps it's the chef's cooking?"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a5c37346cc2..9b94b22085a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1186,6 +1186,7 @@
src.update_inv_gloves(1,1) //handles bloody hands overlays and updating
else
src.update_inv_gloves(1,0)
+ verbs += /mob/living/carbon/human/proc/bloody_doodle
return 1 //we applied blood to the item
/mob/living/carbon/human/clean_blood()
@@ -1363,3 +1364,54 @@ mob/living/carbon/human/yank_out_object()
return 1
else
return 0
+
+
+/mob/living/carbon/human/proc/bloody_doodle()
+ set category = "IC"
+ set name = "Write in blood"
+ set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style."
+
+ if (usr != src)
+ return 0 //something is terribly wrong
+
+ if (!bloody_hands)
+ verbs -= /mob/living/carbon/human/proc/bloody_doodle
+
+ if (src.gloves)
+ src << "Your [src.gloves] are getting in the way."
+ return
+
+ var/turf/simulated/T = src.loc
+ if (!istype(T)) //to prevent doodling out of mechs and lockers
+ src << "You cannot reach the floor."
+ return
+
+ var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
+ if (direction != "Here")
+ T = get_step(T,text2dir(direction))
+ if (!istype(T))
+ src << "You cannot doodle there."
+ return
+
+ var/num_doodles = 0
+ for (var/obj/effect/decal/cleanable/blood/writing/W in T)
+ num_doodles++
+ if (num_doodles > 4)
+ src << "There is no space to write on!"
+ return
+
+ var/max_length = bloody_hands * 30 //tweeter style
+
+ var/message = stripped_input(src,"Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")
+
+ if (message)
+ var/used_blood_amount = round(length(message) / 30, 1)
+ bloody_hands = max(0, bloody_hands - used_blood_amount) //use up some blood
+
+ if (length(message) > max_length)
+ message += "-"
+ src << "You ran out of blood to write with!"
+
+ var/obj/effect/decal/cleanable/blood/writing/W = new(T)
+ W.message = message
+ W.add_fingerprint(src)
\ No newline at end of file
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 71df0e9bcd2..90acdae7be1 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ