diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 3b465cf2b2b..04b0e352831 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -270,7 +270,7 @@ /obj/item name = "item" icon = 'items.dmi' - var/icon_old = null//For when weapons get bloodied this saves their old icon. + var/icon/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/abstract = 0 var/force = 0 var/item_state = null diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index e8367bcefd9..a541de1013e 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -1,5 +1,3 @@ - - /atom/proc/MouseDrop_T() return @@ -166,7 +164,7 @@ src.fingerprintslast = M.key return - +//returns 1 if made bloody, returns 0 otherwise /atom/proc/add_blood(mob/living/carbon/human/M as mob) if (!( istype(M, /mob/living/carbon/human) )) return 0 @@ -174,66 +172,71 @@ M.dna = new /datum/dna(null) M.check_dna() if (!( src.flags ) & 256) - return - if(!blood_DNA) + return 0 + if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. blood_DNA = list() - if (blood_DNA.len) - if (istype(src, /obj/item)&&!istype(src, /obj/item/weapon/melee/energy))//Only regular items. Energy melee weapon are not affected. - var/obj/item/source2 = src - source2.icon_old = src.icon - var/icon/I = new /icon(src.icon, src.icon_state) - I.Blend(new /icon('blood.dmi', "thisisfuckingstupid"),ICON_ADD) - I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY) - I.Blend(new /icon(src.icon, src.icon_state),ICON_UNDERLAY) - src.icon = I - var/inthere = 0 - for(var/i = 1, i <= src.blood_DNA.len, i++) - var/list/templist = src.blood_DNA[i] - if(templist[1] == M.dna.unique_enzymes && templist[2] == M.dna.b_type) - inthere = 1 - break - if(!inthere) - src.blood_DNA.len++ - src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) - else if (istype(src, /turf/simulated)) - var/turf/simulated/source2 = src - var/list/objsonturf = range(0,src) - if(objsonturf) - for(var/i=1, i<=objsonturf.len, i++) - if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood)) - var/obj/effect/decal/cleanable/blood/this = objsonturf[i] - this.blood_DNA.len++ - this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes, M.dna.b_type) - for(var/datum/disease/D in M.viruses) - var/datum/disease/newDisease = new D.type - this.viruses += newDisease - newDisease.holder = this - return - var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2) - var/list/blood_DNA_temp[1] - blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.dna.b_type) - this.blood_DNA = blood_DNA_temp - this.blood_owner = M + + //adding blood to items + if (istype(src, /obj/item)&&!istype(src, /obj/item/weapon/melee/energy))//Only regular items. Energy melee weapon are not affected. + var/obj/item/O = src + + //if we haven't made our blood_overlay already + if( !O.blood_overlay ) + var/icon/I = new /icon(O.icon, O.icon_state) + I.Blend(new /icon('blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent) + I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + + //not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made. + for(var/obj/item/A in world) + if(A.type == O.type && !A.blood_overlay) + A.blood_overlay = I + + //apply the blood-splatter overlay if it isn't already in there + if(!blood_DNA.len) + O.overlays += O.blood_overlay + + //if this blood isn't already in the list, add it + for(var/i = 1, i <= O.blood_DNA.len, i++) + if((O.blood_DNA[i][1] == M.dna.unique_enzymes) && (O.blood_DNA[i][2] == M.dna.b_type)) + return 0 //already bloodied with this blood. Cannot add more. + O.blood_DNA.len++ + O.blood_DNA[O.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) + return 1 //we applied blood to the item + + //adding blood to turfs + else if (istype(src, /turf/simulated)) + var/turf/simulated/T = src + + //get one blood decal and infect it with virus from M.viruses + for(var/obj/effect/decal/cleanable/blood/B in T.contents) + B.blood_DNA.len++ + B.blood_DNA[B.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) for(var/datum/disease/D in M.viruses) var/datum/disease/newDisease = new D.type - this.viruses += newDisease - newDisease.holder = this - else if (istype(src, /mob/living/carbon/human)) - var/inthere = 0 - for(var/i = 1, i <= src.blood_DNA.len, i++) - var/list/templist = src.blood_DNA[i] - if(templist[1] == M.dna.unique_enzymes && templist[2] == M.dna.b_type) - inthere = 1 - break - if(!inthere) - src.blood_DNA.len++ - src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) - else - return - else - var/list/blood_DNA_temp[1] - blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.dna.b_type) - src.blood_DNA = blood_DNA_temp + B.viruses += newDisease + newDisease.holder = B + return 1 //we bloodied the floor + + //if there isn't a blood decal already, make one. + var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(T) + newblood.blood_DNA = list(list(M.dna.unique_enzymes, M.dna.b_type)) + newblood.blood_owner = M + for(var/datum/disease/D in M.viruses) + var/datum/disease/newDisease = new D.type + newblood.viruses += newDisease + newDisease.holder = newblood + return 1 //we bloodied the floor + + //adding blood to humans + else if (istype(src, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + //if this blood isn't already in the list, add it + for(var/i = 1, i <= H.blood_DNA.len, i++) + if((H.blood_DNA[i][1] == M.dna.unique_enzymes) && (H.blood_DNA[i][2] == M.dna.b_type)) + return 0 //already bloodied with this blood. Cannot add more. + H.blood_DNA.len++ + H.blood_DNA[H.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) + return 1 //we applied blood to the item return /atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0) @@ -286,36 +289,37 @@ if (!( src.flags ) & 256) return if ( src.blood_DNA ) + + //Cleaning blood off of mobs if (istype (src, /mob/living/carbon)) - var/obj/item/source2 = src - del(source2.blood_DNA) - //var/icon/I = new /icon(source2.icon_old, source2.icon_state) //doesnt have icon_old - //source2.icon = I + var/mob/living/carbon/M = src + del(M.blood_DNA) if(ishuman(src)) - var/mob/living/carbon/human/M = src - M.bloody_hands = 0 - if (istype (src, /obj/item)) - var/obj/item/source2 = src - del(source2.blood_DNA) -// var/icon/I = new /icon(source2.icon_old, source2.icon_state) - if(source2.icon_old) - source2.icon = source2.icon_old - source2.update_icon() - else - source2.icon = initial(icon) - source2.update_icon() + var/mob/living/carbon/human/H = src + H.bloody_hands = 0 + + //Cleaning blood off of items + else if (istype (src, /obj/item)) + var/obj/item/O = src + del(O.blood_DNA) + if(O.blood_overlay) + O.overlays.Remove(O.blood_overlay) + if(istype(src, /obj/item/clothing/gloves)) var/obj/item/clothing/gloves/G = src G.transfer_blood = 0 - if (istype(src, /turf/simulated)) - var/obj/item/source2 = src - del(source2.blood_DNA) - if(source2.icon_old) - var/icon/I = new /icon(source2.icon_old, source2.icon_state) - source2.icon = I + + //Cleaning blood off of turfs + else if (istype(src, /turf/simulated)) + var/turf/simulated/T = src + del(T.blood_DNA) + if(T.icon_old) + var/icon/I = new /icon(T.icon_old, T.icon_state) + T.icon = I else - source2.icon = initial(icon) - if(blood_DNA && !blood_DNA.len) + T.icon = initial(icon) + + if(blood_DNA && istype(blood_DNA, /list) && !blood_DNA.len) del(blood_DNA) if(src.fingerprints && src.fingerprints.len) var/done = 0 @@ -1049,7 +1053,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl src.Topic(nhref, params2list(nhref), src, 1) return -/atom/proc/AICtrlClick() // Bolts doors. +/atom/proc/AICtrlClick() // Bolts doors. if(istype(src , /obj/machinery/door/airlock)) if(src:locked) var/nhref = "src=\ref[src];aiEnable=4" diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index f5c84927e34..6b6a80f6ed8 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -4,8 +4,8 @@ atom/var/list/suit_fibers atom/proc/add_fibers(mob/living/carbon/human/M) if(M.gloves) - if(M.gloves.transfer_blood) - if(add_blood(M.gloves.bloody_hands_mob)) + if(M.gloves.transfer_blood) //bloodied gloves transfer blood to touched objects + if(add_blood(M.gloves.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody M.gloves.transfer_blood-- //world.log << "[M.gloves] added blood to [src] from [M.gloves.bloody_hands_mob]" else if(M.bloody_hands) diff --git a/html/changelog.html b/html/changelog.html index 0d35ea5fd1f..f5a57b04d49 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -98,6 +98,9 @@ should be listed in the changelog upon commit tho. Thanks. --> +