#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var) /obj/effect/decal/cleanable/blood name = "blood" desc = "It's red and gooey. Perhaps it's the chef's cooking?" gender = PLURAL density = 0 anchored = 1 layer = 2 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() var/list/datum/disease2/disease/virus2 = list() var/amount = 5 /obj/effect/decal/cleanable/blood/New() ..() if(istype(src, /obj/effect/decal/cleanable/blood/gibs)) return if(istype(src, /obj/effect/decal/cleanable/blood/tracks)) return // We handle our own drying. if(src.type == /obj/effect/decal/cleanable/blood) if(src.loc && isturf(src.loc)) for(var/obj/effect/decal/cleanable/blood/B in src.loc) if(B != src) if (B.blood_DNA) blood_DNA |= B.blood_DNA.Copy() del(B) spawn(DRYING_TIME * (amount+1)) dry() /obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp) if (!istype(perp)) return if(amount < 1) return var/datum/organ/external/l_foot = perp.get_organ("l_foot") var/datum/organ/external/r_foot = perp.get_organ("r_foot") var/hasfeet = 1 if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) hasfeet = 0 if(perp.shoes && !perp.buckled)//Adding blood to shoes perp.shoes:track_blood = max(amount,perp.shoes:track_blood) //Adding blood to shoes if(!perp.shoes.blood_overlay) perp.shoes.generate_blood_overlay() if(!perp.shoes.blood_DNA) perp.shoes.blood_DNA = list() perp.shoes.overlays += perp.shoes.blood_overlay perp.update_inv_shoes(1,0) perp.shoes.blood_DNA |= blood_DNA.Copy() else if (hasfeet)//Or feet perp.track_blood = max(amount,perp.track_blood) //Or feet if(!perp.feet_blood_DNA) perp.feet_blood_DNA = list() perp.feet_blood_DNA |= blood_DNA.Copy() else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair)) var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled W.bloodiness = 4 amount-- /obj/effect/decal/cleanable/blood/proc/dry() name = "dried [src]" desc = "It's dark red and crusty. Someone is not doing their job." var/icon/I = icon(icon,icon_state) I.SetIntensity(0.7) icon = I amount = 0 spawn(DRYING_TIME) Destroy() /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?" icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") /obj/effect/decal/cleanable/blood/green/Crossed(mob/living/carbon/human/perp) if (!istype(perp)) return if(amount < 1) return var/datum/organ/external/l_foot = perp.get_organ("l_foot") var/datum/organ/external/r_foot = perp.get_organ("r_foot") var/hasfeet = 1 if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED)) hasfeet = 0 if(perp.shoes && !perp.buckled)//Adding blood to shoes perp.shoes:track_blood_green= max(amount,perp.shoes:track_blood_green) //Adding blood to shoes if(!perp.shoes.blood_overlay) perp.shoes.blood_overlay_color = 1 perp.shoes.generate_blood_overlay() if(!perp.shoes.blood_DNA) perp.shoes.blood_DNA = list() perp.shoes.overlays += perp.shoes.blood_overlay perp.update_inv_shoes(1,1) perp.shoes.blood_DNA |= blood_DNA.Copy() else if (hasfeet)//Or feet perp.track_blood_green = max(amount,perp.track_blood_green) //Or feet if(!perp.feet_blood_DNA) perp.feet_blood_DNA = list() perp.feet_blood_DNA |= blood_DNA.Copy() else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair)) var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled W.bloodiness = 4 amount-- /obj/effect/decal/cleanable/blood/drip/green name = "drips of blood" desc = "It's green." gender = PLURAL icon = 'icons/effects/drip.dmi' icon_state = "g1" amount = 0 // The idea is to have 4 bits for coming and 4 for going. #define TRACKS_COMING_NORTH 1 #define TRACKS_COMING_SOUTH 2 #define TRACKS_COMING_EAST 4 #define TRACKS_COMING_WEST 8 #define TRACKS_GOING_NORTH 16 #define TRACKS_GOING_SOUTH 32 #define TRACKS_GOING_EAST 64 #define TRACKS_GOING_WEST 128 // 5 seconds #define TRACKS_CRUSTIFY_TIME 50 // Footprints, tire trails... /obj/effect/decal/cleanable/blood/tracks amount = 0 random_icon_states = null var/dirs=0 icon='icons/effects/footprints.dmi' var/coming_state="blood1" var/going_state="blood2" var/newtracks=0 // Cleared after every icon_update var/crustytracks=0 // Cleared after every icon_update // dir = last wetting var/list/wet=list( "1"=0, "2"=0, "4"=0, "8"=0, "16"=0, "32"=0, "64"=0, "128"=0 ) /** * Add tracks to an existing trail. * * @param DNA bloodDNA to add to collection. * @param comingdir Direction tracks come from, or 0. * @param goingdir Direction tracks are going to (or 0). */ proc/AddTracks(var/mob/living/carbon/human/H, var/list/DNA, var/comingdir, var/goingdir,var/typepath) if(typepath == /obj/effect/decal/cleanable/blood/tracks/footprints) if(H.species.bodyflags & FEET_CLAWS) coming_state="bloodclaw1" going_state="bloodclaw2" if(H.species.bodyflags & FEET_PADDED) coming_state="bloodpaw1" going_state="bloodpaw2" if(typepath == /obj/effect/decal/cleanable/blood/tracks/footprints/green) if(H.species.bodyflags & FEET_CLAWS) coming_state="xenoclaw1" going_state="xenoclaw2" if(H.species.bodyflags & FEET_PADDED) coming_state="xenopaw1" going_state="xenopaw2" else coming_state="xeno1" going_state="xeno2" var/updated=0 // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. var/realgoing=goingdir<<4 // Current bit var/b=0 // When tracks will start to dry out var/t=world.time + TRACKS_CRUSTIFY_TIME // Process 4 bits for(var/bi=0;bi<4;bi++) b=1<t || crusty&b) // Wet or crusty? Nuke'em either way. overlays.Remove(overlay) newtracks |= b // Mark as needing an update. // Update ONLY the overlays that have changed. for(var/bi=0;bi<4;bi++) // COMING b=1<>4)) if(crusty&b) I.SetIntensity(0.7) crustytracks |= b // Crusty? Don't update unless wetted again. else crustytracks &= ~b // Unmark as crusty. overlays += I newtracks=0 // Clear our memory of updated tracks. /obj/effect/decal/cleanable/blood/tracks/footprints name = "bloody footprints" desc = "Whoops..." /obj/effect/decal/cleanable/blood/tracks/footprints/green name = "bloody green footprints" desc = "Whoops..." /obj/effect/decal/cleanable/blood/tracks/wheels icon_state = "tracks" desc = "They look like tracks left by wheels." icon = 'icons/effects/blood.dmi' gender = PLURAL random_icon_states = null amount = 0 /obj/effect/decal/cleanable/blood/drip name = "drips of blood" desc = "It's red." gender = PLURAL icon = 'icons/effects/drip.dmi' icon_state = "1" amount = 0 /obj/effect/decal/cleanable/blood/gibs name = "gibs" desc = "They look bloody and gruesome." gender = PLURAL density = 0 anchored = 1 layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") /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/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/proc/streak(var/list/directions) spawn (0) var/direction = pick(directions) for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if (i > 0) new /obj/effect/decal/cleanable/blood/splatter(src.loc) if (step_to(src, get_step(src, direction), 0)) break /obj/effect/decal/cleanable/mucus name = "mucus" desc = "Disgusting mucus." gender = PLURAL density = 0 anchored = 1 layer = 2 icon = 'icons/effects/blood.dmi' icon_state = "mucus" random_icon_states = list("mucus") var/list/datum/disease2/disease/virus2 = list() var/dry=0 // Keeps the lag down /obj/effect/decal/cleanable/mucus/New() spawn(DRYING_TIME * 2) dry=1 /obj/effect/decal/cleanable/blood/viralsputum name = "viral sputum" desc = "It's black and nasty." // basecolor="#030303" icon = 'icons/mob/robots.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") /obj/effect/decal/cleanable/blood/old name = "dried blood" desc = "Looks like it's been here a while. Eew." /obj/effect/decal/cleanable/blood/old/New() ..() icon_state += "-old" /obj/effect/decal/cleanable/blood/gibs/old name = "old rotting gibs" desc = "Oh god, why didn't anyone clean this up? It smells terrible." /obj/effect/decal/cleanable/blood/gibs/old/New() ..() icon_state += "-old" dir = pick(1,2,4,8) /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/New() ..() icon_state += "-old"