From bc80c036791d16bc33d3d841d212003b31c7e102 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 5 Jun 2019 04:55:49 -0500 Subject: [PATCH] these too please thanks --- code/game/atoms.dm | 21 +- .../effects/decals/cleanable/footprints.dm | 201 +++++++ .../effects/decals/cleanable/humans.dm | 561 ++++++++++++------ 3 files changed, 613 insertions(+), 170 deletions(-) create mode 100644 code/game/objects/effects/decals/cleanable/footprints.dm diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 50f6cdf968..f88edcaa7e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -255,7 +255,7 @@ f_name = "some " else f_name = "a " - f_name += "blood-stained [name]!" + f_name += "stained [name]!" to_chat(user, "[icon2html(src, user)] That's [f_name]") @@ -366,8 +366,11 @@ //to add blood from a mob onto something, and transfer their dna info /atom/proc/add_mob_blood(mob/living/M) var/list/blood_dna = M.get_blood_dna_list() + blood_color = BLOOD_COLOR_HUMAN if(!blood_dna) return FALSE + if(M.blood_DNA.len) + blood_color = M.blood_DNA_to_color() return add_blood(blood_dna) //to add blood onto something, with blood dna info to include. @@ -380,18 +383,30 @@ /obj/item/add_blood(list/blood_dna) if(!..()) return FALSE - add_blood_overlay() + + //if we haven't made our blood_overlay already + if(!blood_overlay ) + add_blood_overlay() + + //apply the blood-splatter overlay if it isn't already in there + if(!blood_DNA.len) + overlays += blood_overlay + return TRUE //we applied blood to the item /obj/item/proc/add_blood_overlay() if(!blood_DNA.len) return + if(GLOB.blood_overlay_cache["[icon]" + icon_state]) + blood_overlay = GLOB.blood_overlay_cache["[icon]" + icon_state] + return if(initial(icon) && initial(icon_state)) blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) - add_overlay(blood_splatter_icon) + blood_overlay = image(I) + GLOB.blood_overlay_cache["[icon]" + icon_state] = blood_overlay /obj/item/clothing/gloves/add_blood(mob/living/carbon/M) . = ..() diff --git a/code/game/objects/effects/decals/cleanable/footprints.dm b/code/game/objects/effects/decals/cleanable/footprints.dm new file mode 100644 index 0000000000..14bf78108d --- /dev/null +++ b/code/game/objects/effects/decals/cleanable/footprints.dm @@ -0,0 +1,201 @@ +// 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 + +// color-dir-dry +var/global/list/image/fluidtrack_cache=list() + +/datum/fluidtrack + var/direction=0 + var/basecolor=BLOOD_COLOR_HUMAN + var/wet=0 + var/fresh=1 + var/crusty=0 + var/image/overlay + +/datum/fluidtrack/New(_direction,_color,_wet) + src.direction=_direction + src.basecolor=_color + +// Footprints, tire trails... +/obj/effect/decal/cleanable/blood/tracks + amount = 0 + random_icon_states = null + var/dirs=0 + icon = 'icons/effects/fluidtracks.dmi' + icon_state = "" + var/coming_state="blood1" + var/going_state="blood2" + var/updatedtracks=0 + var/dryname = "dried fluid" + var/drydesc = "diguesting dried fluid, where's the janitor?" + + // dir = id in stack + var/list/setdirs=list( + "1"=0, + "2"=0, + "4"=0, + "8"=0, + "16"=0, + "32"=0, + "64"=0, + "128"=0 + ) + + // List of laid tracks and their colors. + var/list/datum/fluidtrack/stack=list() + + /** + * 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). + * @param bloodcolor Color of the blood when wet. + */ +/obj/effect/decal/cleanable/blood/tracks/proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor=BLOOD_COLOR_HUMAN) + 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 + var/datum/fluidtrack/track + + // Process 4 bits + for(var/bi=0;bi<4;bi++) + b=1<>4 + + if(track.overlay) + track.overlay=null + var/image/I = image(icon, icon_state=state, dir=num2dir(truedir)) + I.color = track.basecolor + + track.fresh=0 + track.overlay=I + stack[stack_idx]=track + overlays += I + updatedtracks=0 // Clear our memory of updated tracks. + +/obj/effect/decal/cleanable/blood/tracks/shoeprints + name = "wet shoeprints" + dryname = "dried shoeprints" + desc = "They look like still wet tracks left by footwear." + drydesc = "They look like dried tracks left by footwear." + coming_state = "shoe1" + going_state = "shoe2" + +/obj/effect/decal/cleanable/blood/tracks/footprints + name = "wet footprints" + dryname = "dried footprints" + desc = "They look like still wet tracks left by a foot." + drydesc = "They look like dried tracks left by a foot." + coming_state = "foot1" + going_state = "foot2" + +/obj/effect/decal/cleanable/blood/tracks/snake + name = "wet tracks" + dryname = "dried tracks" + desc = "They look like still wet tracks left by a giant snake." + drydesc = "They look like dried tracks left by a giant snake." + coming_state = "snake1" + going_state = "snake2" + +/obj/effect/decal/cleanable/blood/tracks/paw + name = "wet tracks" + dryname = "dried tracks" + desc = "They look like still wet tracks left by a mammal." + drydesc = "They look like dried tracks left by a mammal." + coming_state = "paw1" + going_state = "paw2" + +/obj/effect/decal/cleanable/blood/tracks/claw + name = "wet tracks" + dryname = "dried tracks" + desc = "They look like still wet tracks left by a reptile." + drydesc = "They look like dried tracks left by a reptile." + coming_state = "claw1" + going_state = "claw2" + +/obj/effect/decal/cleanable/blood/tracks/wheels + name = "wet tracks" + dryname = "dried tracks" + desc = "They look like still wet tracks left by wheels." + drydesc = "They look like dried tracks left by wheels." + coming_state = "wheels" + going_state = "" + gender = PLURAL + +/obj/effect/decal/cleanable/blood/tracks/body + name = "wet trails" + dryname = "dried trails" + desc = "A still-wet trail left by someone crawling." + drydesc = "A dried trail left by someone crawling." + coming_state = "trail1" + going_state = "trail2" diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 711e792752..b5d4aed357 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -1,35 +1,158 @@ +#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var) +#define BLOOD_SIZE_SMALL 1 +#define BLOOD_SIZE_MEDIUM 2 +#define BLOOD_SIZE_BIG 3 +#define BLOOD_SIZE_NO_MERGE -1 + +var/global/list/image/splatter_cache=list() + /obj/effect/decal/cleanable/blood name = "blood" - desc = "It's gooey. Perhaps it's the chef's cooking?" + desc = "It's thick and gooey. Perhaps it's the chef's cooking?" + gender = PLURAL icon = 'icons/effects/blood.dmi' - icon_state = "floor1" + icon_state = "mfloor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") blood_DNA = list() - blood_state = BLOOD_STATE_BLOOD - color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. - bloodiness = BLOOD_AMOUNT_PER_DECAL + generic_filth = TRUE + persistent = TRUE + appearance_flags = NO_CLIENT_COLOR + var/base_icon = 'icons/effects/blood.dmi' + var/list/viruses = list() + var/basecolor=BLOOD_COLOR_HUMAN // Color when wet. + var/list/datum/disease2/disease/virus2 = list() + var/amount = 5 + var/drytime + var/dryname = "dried blood" + var/drydesc = "It's dry and crusty. Someone is not doing their job." + var/blood_size = BLOOD_SIZE_MEDIUM // A relative size; larger-sized blood will not override smaller-sized blood, except maybe at mapload. +/obj/effect/decal/cleanable/blood/clean_blood() + fluorescent = 0 + if(invisibility != 100) + set_invisibility(100) + amount = 0 + STOP_PROCESSING(SSobj, src) + ..(ignore=1) -/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) - if (C.blood_DNA) - blood_DNA |= C.blood_DNA.Copy() - update_icon() - ..() +/obj/effect/decal/cleanable/blood/hide() + return -/obj/effect/decal/cleanable/blood/transfer_blood_dna() - ..() - update_icon() +/obj/effect/decal/cleanable/blood/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() -/obj/effect/decal/cleanable/blood/transfer_mob_blood_dna() +/obj/effect/decal/cleanable/blood/Initialize(mapload) . = ..() + if(merge_with_blood(!mapload)) + return INITIALIZE_HINT_QDEL + start_drying() + +// Returns true if overriden and needs deletion. If the argument is false, we will merge into any existing blood. +/obj/effect/decal/cleanable/blood/proc/merge_with_blood(var/override = TRUE) + . = FALSE + if(blood_size == BLOOD_SIZE_NO_MERGE) + return + if(isturf(loc)) + for(var/obj/effect/decal/cleanable/blood/B in loc) + if(B == src) + continue + if(B.blood_size == BLOOD_SIZE_NO_MERGE) + continue + if(override && blood_size >= B.blood_size) + if (B.blood_DNA) + blood_DNA |= B.blood_DNA.Copy() + qdel(B) + continue + if(B.blood_DNA) + B.blood_DNA |= blood_DNA.Copy() + . = TRUE + +/obj/effect/decal/cleanable/blood/proc/start_drying() + drytime = world.time + DRYING_TIME * (amount+1) update_icon() + START_PROCESSING(SSobj, src) + +/obj/effect/decal/cleanable/blood/Process() + if(world.time > drytime) + dry() + +/obj/effect/decal/cleanable/blood/on_update_icon() + if(basecolor == "rainbow") basecolor = get_random_colour(1) + color = basecolor + if(basecolor == SYNTH_BLOOD_COLOUR) + SetName("oil") + desc = "It's black and greasy." + else + SetName(initial(name)) + desc = initial(desc) + +/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp) + if (!istype(perp)) + return + if(amount < 1) + return + + var/obj/item/organ/external/l_foot = perp.get_organ(BP_L_FOOT) + var/obj/item/organ/external/r_foot = perp.get_organ(BP_R_FOOT) + var/hasfeet = 1 + if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump())) + hasfeet = 0 + if(perp.shoes && !perp.buckled)//Adding blood to shoes + var/obj/item/clothing/shoes/S = perp.shoes + if(istype(S)) + S.blood_color = basecolor + S.track_blood = max(amount,S.track_blood) + if(!S.blood_overlay) + S.add_blood_overlay() + if(!S.blood_DNA) + S.blood_DNA = list() + S.blood_overlay.color = basecolor + S.overlays += S.blood_overlay + if(S.blood_overlay && S.blood_overlay.color != basecolor) + S.blood_overlay.color = basecolor + S.overlays.Cut() + S.overlays += S.blood_overlay + S.blood_DNA |= blood_DNA.Copy() + + else if (hasfeet)//Or feet + perp.feet_blood_color = basecolor + perp.track_blood = max(amount,perp.track_blood) + 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/bed/chair/wheelchair)) + var/obj/structure/bed/chair/wheelchair/W = perp.buckled + W.bloodiness = 4 + + perp.update_inv_shoes(1) + amount-- + +/obj/effect/decal/cleanable/blood/proc/dry() + name = dryname + desc = drydesc + color = adjust_brightness(color, -50) + amount = 0 + STOP_PROCESSING(SSobj, src) /obj/effect/decal/cleanable/blood/update_icon() color = blood_DNA_to_color() -//obj/effect/decal/cleanable/blood/update_color() - // if(SEND_SIGNAL(COMSIG_BLOOD_COLOR) & COMPONENT_BLOCK_UPDATE_COLOR) - // return + +/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user) + ..() + if (amount && istype(user)) + if (user.gloves) + return + var/taken = rand(1,amount) + amount -= taken + to_chat(user, "You get some of \the [src] on your hands.") + if (!user.blood_DNA) + user.blood_DNA = list() + user.blood_DNA |= blood_DNA.Copy() + user.bloody_hands = taken + user.hand_blood_color = basecolor + user.update_inv_gloves(1) /obj/effect/decal/cleanable/blood/old name = "dried blood" @@ -44,169 +167,273 @@ /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + amount = 2 + blood_size = BLOOD_SIZE_BIG -/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose so that it shows up even on regular splatters - 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() - color = BLOOD_COLOR_HUMAN - bloodiness = BLOOD_AMOUNT_PER_DECAL -/obj/effect/decal/cleanable/trail_holder/update_icon() - color = blood_DNA_to_color() +/obj/effect/decal/cleanable/blood/gibs + name = "gibs" + desc = "They look bloody and gruesome." + icon_state = "gibbl5" + layer = LOW_OBJ_LAYER + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") + blood_size = BLOOD_SIZE_NO_MERGE + var/gib_overlay = FALSE + var/slimy_gibs = FALSE + var/body_colors = "#ffffff" -/obj/effect/cleanable/trail_holder/Initialize() +/obj/effect/decal/cleanable/blood/gibs/proc/update_icon() + var/image/giblets = new(base_icon, icon_state+ "-overlay", dir) + var/image/giblets2 = new(base_icon, icon_state + "c-overlay", dir) + giblets.color = body_colors + + var/icon/blood = new(base_icon,"[icon_state]",dir) + if(basecolor == "rainbow") basecolor = get_random_colour(1) + blood.Blend(basecolor,ICON_MULTIPLY) + + icon = blood + overlays.Cut() + if(gib_overlay) + if(!slimy_gibs) + add_overlay(giblets) + else + add_overlay(giblets) + add_overlay(giblets2) + +/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) + return + +/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L) + if(istype(L) && has_gravity(loc)) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.mind.assigned_role == "Detective") //Gumshoe perks yo + playsound(loc, 'sound/effects/gib_step.ogg', 10, 1) + else + playsound(loc, 'sound/effects/gib_step.ogg', H.has_trait(TRAIT_LIGHT_STEP) ? 20 : 50, 1) + else + playsound(loc, 'sound/effects/gib_step.ogg', L.has_trait(TRAIT_LIGHT_STEP) ? 20 : 50, 1) . = ..() - update_icon() -/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() - return TRUE +/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) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc) + b.basecolor = src.basecolor + b.update_icon() + if (step_to(src, get_step(src, direction), 0)) + break -/obj/effect/decal/cleanable/trail_holder/transfer_blood_dna() - ..() - update_icon() +/obj/effect/decal/cleanable/blood/gibs/start_drying() + return -/obj/effect/decal/cleanable/trail_holder/transfer_mob_blood_dna() - . = ..() - update_icon() - -//BLOODY FOOTPRINTS -/obj/effect/decal/cleanable/blood/footprints/tracks - name = "tracks" - icon = 'icons/effects/fluidtracks.dmi' - icon_state = "nothingwhatsoever" - desc = "WHOSE FOOTPRINTS ARE THESE?" - random_icon_states = null - var/entered_dirs = 0 - var/exited_dirs = 0 - blood_state = BLOOD_STATE_BLOOD //the icon state to load images from - var/print_state = FOOTPRINT_SHOE //the print state for different feet - var/list/shoe_types = list() - -/obj/effect/decal/cleanable/blood/footprints/tracks/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.blood_smear[blood_state]) - if(color != bloodtype_to_color(S.last_bloodtype)) - return - S.blood_smear[blood_state] = max(S.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) - shoe_types |= S.type - if (!(entered_dirs & H.dir)) - entered_dirs |= H.dir - update_icon() - - else if(H && H.blood_smear[blood_state]) - if(color != bloodtype_to_color(H.last_bloodtype)) - return - H.blood_smear[blood_state] = max(H.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) - if (!(entered_dirs & H.dir)) - entered_dirs |= H.dir - update_icon() - -/obj/effect/decal/cleanable/blood/footprints/tracks/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.blood_smear[blood_state]) - if(color != bloodtype_to_color(S.last_bloodtype))//last entry - we check its color - return - S.blood_smear[blood_state] = max(S.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) - shoe_types |= S.type - if (!(exited_dirs & H.dir)) - exited_dirs |= H.dir - update_icon() - - else if(H && H.blood_smear[blood_state]) - if(color != bloodtype_to_color(H.last_bloodtype))//last entry - we check its color - return - H.blood_smear[blood_state] = max(H.blood_smear[blood_state] - BLOOD_LOSS_PER_STEP, 0) - if (!(exited_dirs & H.dir)) - exited_dirs |= H.dir - update_icon() - -/obj/effect/decal/cleanable/blood/footprints/tracks/update_icon() - ..() - cut_overlays() - to_chat(world, "[src] called update_icon with [print_state]") - for(var/Ddir in GLOB.cardinals) - if(entered_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]"] - if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["entered-[print_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[print_state]1", dir = Ddir) - add_overlay(bloodstep_overlay) - if(exited_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]"] - if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["exited-[print_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[print_state]2", dir = Ddir) - add_overlay(bloodstep_overlay) - - alpha = BLOODY_FOOTPRINT_BASE_ALPHA + bloodiness - - -/obj/effect/decal/cleanable/blood/footprints/tracks/examine(mob/user) - . = ..() - if(shoe_types.len && ishuman(user) && user.mind.assigned_role == "Detective") //gumshoe does the detective thing, not every fucking assistant - . += "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)] [icon2html(initial(S.icon), user)]\n" - - to_chat(user, .) - -/obj/effect/decal/cleanable/blood/footprints/tracks/replace_decal(obj/effect/decal/cleanable/blood/footprints/tracks/C) - if(print_state != C.print_state) //We only replace footprints of the same type as us - return - if(color != C.color) - return - ..() - -/obj/effect/decal/cleanable/blood/footprints/tracks/can_bloodcrawl_in() - if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) - return TRUE +/obj/effect/decal/cleanable/blood/gibs/merge_with_blood() return FALSE -/obj/effect/decal/cleanable/blood/footprints/tracks/shoe - name = "footprints" - desc = "They look like tracks left by footwear." - icon_state = FOOTPRINT_SHOE - print_state = FOOTPRINT_SHOE +/obj/effect/decal/cleanable/blood/gibs/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + gib_overlay = TRUE -/obj/effect/decal/cleanable/blood/footprints/tracks/foot - name = "footprints" - desc = "They look like tracks left by a bare foot." - icon_state = FOOTPRINT_FOOT - print_state = FOOTPRINT_FOOT +/obj/effect/decal/cleanable/blood/gibs/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + gib_overlay = TRUE -/obj/effect/decal/cleanable/blood/footprints/tracks/snake - name = "tracks" - desc = "They look like tracks left by a giant snake." - icon_state = FOOTPRINT_SNAKE - print_state = FOOTPRINT_SNAKE +/obj/effect/decal/cleanable/blood/gibs/body + random_icon_states = list("gibhead", "gibtorso") + gib_overlay = TRUE -/obj/effect/decal/cleanable/blood/footprints/tracks/paw - name = "footprints" - desc = "They look like tracks left by paws." - icon_state = FOOTPRINT_PAW - print_state = FOOTPRINT_PAW +/obj/effect/decal/cleanable/blood/gibs/torso + random_icon_states = list("gibtorso") + gib_overlay = TRUE -/obj/effect/decal/cleanable/blood/footprints/tracks/claw - name = "footprints" - desc = "They look like tracks left by claws." - icon_state = FOOTPRINT_CLAW - print_state = FOOTPRINT_CLAW +/obj/effect/decal/cleanable/blood/gibs/limb + random_icon_states = list("gibleg", "gibarm") + gib_overlay = TRUE -/obj/effect/decal/cleanable/blood/footprints/tracks/wheels - name = "tracks" - desc = "They look like tracks left by wheels." +/obj/effect/decal/cleanable/blood/gibs/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + gib_overlay = TRUE + +/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(mapload, list/datum/disease/diseases) + . = ..() + setDir(pick(1,2,4,8)) + icon_state += "-old" + add_blood(list("Non-human DNA" = "A+")) + +/obj/effect/decal/cleanable/blood/drip + name = "drips of blood" + desc = "It's gooey." gender = PLURAL - icon_state = FOOTPRINT_WHEEL - print_state = FOOTPRINT_WHEEL + icon_state = "1" + random_icon_states = list("drip1","drip2","drip3","drip4","drip5") + amount = 0 + var/list/drips + blood_size = BLOOD_SIZE_SMALL -/obj/effect/decal/cleanable/blood/footprints/tracks/body - name = "trails" - desc = "A trail left by something being dragged." - icon_state = FOOTPRINT_DRAG - print_state = FOOTPRINT_DRAG +/obj/effect/decal/cleanable/blood/drip/Initialize() + . = ..() + drips = list(icon_state) + +/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() + return TRUE + +/obj/effect/decal/cleanable/blood/gibs/human + +/obj/effect/decal/cleanable/blood/gibs/human/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidgibs", 5) + guts() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/human/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/human/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/human/body + random_icon_states = list("gibhead", "gibtorso") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/human/torso + random_icon_states = list("gibtorso") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/human/limb + random_icon_states = list("gibleg", "gibarm") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/human/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + gib_overlay = TRUE + slimy_gibs = TRUE + +// Slime Gibs +/obj/effect/decal/cleanable/blood/gibs/slime + desc = "They look gooey and gruesome." + +/obj/effect/decal/cleanable/blood/gibs/slime/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidslimegibs", 5) + update_icon() + guts() + +/obj/effect/decal/cleanable/blood/gibs/slime/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/slime/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/slime/body + random_icon_states = list("gibhead", "gibtorso") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/slime/torso + random_icon_states = list("gibtorso") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/slime/limb + random_icon_states = list("gibleg", "gibarm") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/slime/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/synth + desc = "They look sludgy and disgusting." + +/obj/effect/decal/cleanable/blood/gibs/synth/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidsyntheticgibs", 5) + update_icon() + guts() + +//IPCs +/obj/effect/decal/cleanable/blood/gibs/ipc + desc = "They look sharp yet oozing." + +/obj/effect/decal/cleanable/blood/gibs/ipc/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidoilgibs", 5) + update_icon() + guts() + +/obj/effect/decal/cleanable/blood/gibs/ipc/guts() + if(gib_overlay) + var/mutable_appearance/gibz = mutable_appearance(icon, icon_state + "-ipcoverlay", color = blood_color, layer = -LOW_OBJ_LAYER) + var/mutable_appearance/gibz2 = mutable_appearance(icon, icon_state + "c-ipcoverlay", color = body_colors, layer = -LOW_OBJ_LAYER) + if(!slimy_gibs) + gibz.appearance_flags = RESET_COLOR + add_overlay(gibz) + else + gibz.appearance_flags = RESET_COLOR + add_overlay(gibz) + add_overlay(gibz2) + +/obj/effect/decal/cleanable/blood/gibs/ipc/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/ipc/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/ipc/body + random_icon_states = list("gibhead", "gibtorso") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/ipc/torso + random_icon_states = list("gibtorso") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/ipc/limb + random_icon_states = list("gibleg", "gibarm") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/ipc/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + gib_overlay = TRUE + slimy_gibs = TRUE + +/obj/effect/decal/cleanable/blood/gibs/synth + desc = "They look sludgy and disgusting." + +/obj/effect/decal/cleanable/blood/gibs/synth/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidsyntheticgibs", 5) + update_icon() + guts() + +#undef BLOOD_SIZE_SMALL +#undef BLOOD_SIZE_MEDIUM +#undef BLOOD_SIZE_BIG +#undef BLOOD_SIZE_NO_MERGE \ No newline at end of file