mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Merge pull request #32311 from kevinz000/component_forensics
MoreRobustThanYou's datum forensics but it's a component this time. Fully refactors forensics, including fingerprints, hidden/admin fingerprints, suit/clothing/whatever fibers, and blood DNA residue to /datum/component/forensics. Adds support for manually adding fingerprints. 🆑 code: Forensics is now a datum component. balance: NPC humans will now start leaving fingerprints on things they touch! /🆑
This commit is contained in:
@@ -5,3 +5,8 @@
|
|||||||
#define CLEAN_STRONG 4 // Industrial strength
|
#define CLEAN_STRONG 4 // Industrial strength
|
||||||
#define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud
|
#define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud
|
||||||
#define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure
|
#define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure
|
||||||
|
|
||||||
|
//How strong things have to be to wipe forensic evidence...
|
||||||
|
#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE
|
||||||
|
#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK
|
||||||
|
#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE
|
||||||
|
|||||||
@@ -27,6 +27,13 @@
|
|||||||
#define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
|
#define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
|
||||||
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
|
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
|
||||||
#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob)
|
#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob)
|
||||||
|
#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides)
|
||||||
|
//Positions for overrides list
|
||||||
|
#define EXAMINE_POSITION_ARTICLE 1
|
||||||
|
#define EXAMINE_POSITION_BEFORE 2
|
||||||
|
#define EXAMINE_POSITION_NAME 3
|
||||||
|
//End positions
|
||||||
|
#define COMPONENT_EXNAME_CHANGED 1
|
||||||
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom)
|
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom)
|
||||||
#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target)
|
#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target)
|
||||||
#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity)
|
#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity)
|
||||||
|
|||||||
2
code/__DEFINES/forensics.dm
Normal file
2
code/__DEFINES/forensics.dm
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA))
|
||||||
|
#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions))
|
||||||
@@ -13,28 +13,28 @@
|
|||||||
if(!isturf(tile))
|
if(!isturf(tile))
|
||||||
return
|
return
|
||||||
|
|
||||||
tile.clean_blood()
|
tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
for(var/A in tile)
|
for(var/A in tile)
|
||||||
if(is_cleanable(A))
|
if(is_cleanable(A))
|
||||||
qdel(A)
|
qdel(A)
|
||||||
else if(istype(A, /obj/item))
|
else if(istype(A, /obj/item))
|
||||||
var/obj/item/cleaned_item = A
|
var/obj/item/I = A
|
||||||
cleaned_item.clean_blood()
|
I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
else if(ishuman(A))
|
else if(ishuman(A))
|
||||||
var/mob/living/carbon/human/cleaned_human = A
|
var/mob/living/carbon/human/cleaned_human = A
|
||||||
if(cleaned_human.lying)
|
if(cleaned_human.lying)
|
||||||
if(cleaned_human.head)
|
if(cleaned_human.head)
|
||||||
cleaned_human.head.clean_blood()
|
cleaned_human.head.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
cleaned_human.update_inv_head()
|
cleaned_human.update_inv_head()
|
||||||
if(cleaned_human.wear_suit)
|
if(cleaned_human.wear_suit)
|
||||||
cleaned_human.wear_suit.clean_blood()
|
cleaned_human.wear_suit.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
cleaned_human.update_inv_wear_suit()
|
cleaned_human.update_inv_wear_suit()
|
||||||
else if(cleaned_human.w_uniform)
|
else if(cleaned_human.w_uniform)
|
||||||
cleaned_human.w_uniform.clean_blood()
|
cleaned_human.w_uniform.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
cleaned_human.update_inv_w_uniform()
|
cleaned_human.update_inv_w_uniform()
|
||||||
if(cleaned_human.shoes)
|
if(cleaned_human.shoes)
|
||||||
cleaned_human.shoes.clean_blood()
|
cleaned_human.shoes.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
cleaned_human.update_inv_shoes()
|
cleaned_human.update_inv_shoes()
|
||||||
cleaned_human.clean_blood()
|
cleaned_human.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
cleaned_human.wash_cream()
|
cleaned_human.wash_cream()
|
||||||
to_chat(cleaned_human, "<span class='danger'>[AM] cleans your face!</span>")
|
to_chat(cleaned_human, "<span class='danger'>[AM] cleans your face!</span>")
|
||||||
|
|||||||
@@ -6,19 +6,11 @@
|
|||||||
var/mutable_appearance/pic
|
var/mutable_appearance/pic
|
||||||
|
|
||||||
/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description)
|
/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_GOD, _color, _layer=TURF_LAYER, _description)
|
||||||
if(!isatom(parent) || !_icon || !_icon_state)
|
if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color))
|
||||||
. = COMPONENT_INCOMPATIBLE
|
. = COMPONENT_INCOMPATIBLE
|
||||||
CRASH("A turf decal was applied incorrectly to [parent.type]: icon:[_icon ? _icon : "none"] icon_state:[_icon_state ? _icon_state : "none"]")
|
CRASH("A turf decal was applied incorrectly to [parent.type]: icon:[_icon ? _icon : "none"] icon_state:[_icon_state ? _icon_state : "none"]")
|
||||||
|
|
||||||
// It has to be made from an image or dir breaks because of a byond bug
|
|
||||||
var/temp_image = image(_icon, null, _icon_state, _layer, _dir)
|
|
||||||
pic = new(temp_image)
|
|
||||||
pic.color = _color
|
|
||||||
|
|
||||||
cleanable = _cleanable
|
|
||||||
description = _description
|
description = _description
|
||||||
|
cleanable = _cleanable
|
||||||
apply()
|
|
||||||
|
|
||||||
if(_dir) // If no dir is assigned at start then it follows the atom's dir
|
if(_dir) // If no dir is assigned at start then it follows the atom's dir
|
||||||
RegisterSignal(COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
RegisterSignal(COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
||||||
@@ -26,6 +18,7 @@
|
|||||||
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
||||||
if(_description)
|
if(_description)
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
|
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||||
|
apply()
|
||||||
|
|
||||||
/datum/component/decal/Destroy()
|
/datum/component/decal/Destroy()
|
||||||
remove()
|
remove()
|
||||||
@@ -36,6 +29,15 @@
|
|||||||
remove(thing)
|
remove(thing)
|
||||||
apply(thing)
|
apply(thing)
|
||||||
|
|
||||||
|
/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
|
||||||
|
if(!_icon || !_icon_state)
|
||||||
|
return FALSE
|
||||||
|
// It has to be made from an image or dir breaks because of a byond bug
|
||||||
|
var/temp_image = image(_icon, null, _icon_state, _layer, _dir)
|
||||||
|
pic = new(temp_image)
|
||||||
|
pic.color = _color
|
||||||
|
return TRUE
|
||||||
|
|
||||||
/datum/component/decal/proc/apply(atom/thing)
|
/datum/component/decal/proc/apply(atom/thing)
|
||||||
var/atom/master = thing || parent
|
var/atom/master = thing || parent
|
||||||
master.add_overlay(pic, TRUE)
|
master.add_overlay(pic, TRUE)
|
||||||
|
|||||||
35
code/datums/components/decals/blood.dm
Normal file
35
code/datums/components/decals/blood.dm
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/datum/component/decal/blood
|
||||||
|
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||||
|
|
||||||
|
/datum/component/decal/blood/Initialize(_icon, _icon_state, _dir, _cleanable=CLEAN_STRENGTH_BLOOD, _color, _layer=ABOVE_OBJ_LAYER)
|
||||||
|
if(!isitem(parent))
|
||||||
|
. = COMPONENT_INCOMPATIBLE
|
||||||
|
CRASH("Warning: Blood decal attempted to be added to non-item of type [parent.type]")
|
||||||
|
. = ..()
|
||||||
|
RegisterSignal(COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
|
||||||
|
|
||||||
|
/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
|
||||||
|
var/obj/item/I = parent
|
||||||
|
if(!_icon)
|
||||||
|
_icon = 'icons/effects/blood.dmi'
|
||||||
|
if(!_icon_state)
|
||||||
|
_icon_state = "itemblood"
|
||||||
|
if(!initial(I.icon) || !initial(I.icon_state))
|
||||||
|
return FALSE
|
||||||
|
var/static/list/blood_splatter_appearances = list()
|
||||||
|
//try to find a pre-processed blood-splatter. otherwise, make a new one
|
||||||
|
var/index = "[REF(initial(I.icon))]-[initial(I.icon_state)]"
|
||||||
|
pic = blood_splatter_appearances[index]
|
||||||
|
if(!pic)
|
||||||
|
var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.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(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
|
||||||
|
pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state), I.layer)
|
||||||
|
blood_splatter_appearances[index] = pic
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/decal/blood/proc/get_examine_name(mob/user, list/override)
|
||||||
|
var/atom/A = parent
|
||||||
|
override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a"
|
||||||
|
override[EXAMINE_POSITION_BEFORE] = " blood-stained "
|
||||||
|
return COMPONENT_EXNAME_CHANGED
|
||||||
158
code/datums/components/forensics.dm
Normal file
158
code/datums/components/forensics.dm
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
/datum/component/forensics
|
||||||
|
var/list/fingerprints //assoc print = print
|
||||||
|
var/list/hiddenprints //assoc ckey = realname/gloves/ckey
|
||||||
|
var/list/blood_DNA //assoc dna = bloodtype
|
||||||
|
var/list/fibers //assoc print = print
|
||||||
|
|
||||||
|
/datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL.
|
||||||
|
fingerprints = fingerprints | F.fingerprints
|
||||||
|
hiddenprints = hiddenprints | F.hiddenprints
|
||||||
|
blood_DNA = blood_DNA | F.blood_DNA
|
||||||
|
fibers = fibers | F.fibers
|
||||||
|
check_blood()
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers)
|
||||||
|
if(!isatom(parent))
|
||||||
|
. = COMPONENT_INCOMPATIBLE
|
||||||
|
CRASH("Forensics datum applied incorrectly to non-atom of type [parent.type]!")
|
||||||
|
fingerprints = new_fingerprints
|
||||||
|
hiddenprints = new_hiddenprints
|
||||||
|
blood_DNA = new_blood_DNA
|
||||||
|
fibers = new_fibers
|
||||||
|
check_blood()
|
||||||
|
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act)
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/wipe_fingerprints()
|
||||||
|
fingerprints = null
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/wipe_hiddenprints()
|
||||||
|
return //no.
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/wipe_blood_DNA()
|
||||||
|
blood_DNA = null
|
||||||
|
if(isitem(parent))
|
||||||
|
qdel(parent.GetComponent(/datum/component/decal/blood))
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/wipe_fibers()
|
||||||
|
fibers = null
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/clean_act(strength)
|
||||||
|
if(strength >= CLEAN_STRENGTH_FINGERPRINTS)
|
||||||
|
wipe_fingerprints()
|
||||||
|
if(strength >= CLEAN_STRENGTH_BLOOD)
|
||||||
|
wipe_blood_DNA()
|
||||||
|
if(strength >= CLEAN_STRENGTH_FIBERS)
|
||||||
|
wipe_fibers()
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text)
|
||||||
|
if(!length(_fingerprints))
|
||||||
|
return
|
||||||
|
LAZYINITLIST(fingerprints)
|
||||||
|
for(var/i in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours.
|
||||||
|
fingerprints[i] = i
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
|
||||||
|
if(!M)
|
||||||
|
return
|
||||||
|
add_hiddenprint(M)
|
||||||
|
if(ishuman(M))
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
add_fibers(H)
|
||||||
|
if(H.gloves) //Check if the gloves (if any) hide fingerprints
|
||||||
|
var/obj/item/clothing/gloves/G = H.gloves
|
||||||
|
if(G.transfer_prints)
|
||||||
|
ignoregloves = TRUE
|
||||||
|
if(!ignoregloves)
|
||||||
|
H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop.
|
||||||
|
return
|
||||||
|
var/full_print = md5(H.dna.uni_identity)
|
||||||
|
LAZYSET(fingerprints, full_print, full_print)
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_fiber_list(list/_fibertext) //list(text)
|
||||||
|
if(!length(_fibertext))
|
||||||
|
return
|
||||||
|
LAZYINITLIST(fibers)
|
||||||
|
for(var/i in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours.
|
||||||
|
fibers[i] = i
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_fibers(mob/living/carbon/human/M)
|
||||||
|
var/fibertext
|
||||||
|
var/item_multiplier = isitem(src)?1.2:1
|
||||||
|
if(M.wear_suit)
|
||||||
|
fibertext = "Material from \a [M.wear_suit]."
|
||||||
|
if(prob(10*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||||
|
LAZYSET(fibers, fibertext, fibertext)
|
||||||
|
if(!(M.wear_suit.body_parts_covered & CHEST))
|
||||||
|
if(M.w_uniform)
|
||||||
|
fibertext = "Fibers from \a [M.w_uniform]."
|
||||||
|
if(prob(12*item_multiplier) && !LAZYACCESS(fibers, fibertext)) //Wearing a suit means less of the uniform exposed.
|
||||||
|
LAZYSET(fibers, fibertext, fibertext)
|
||||||
|
if(!(M.wear_suit.body_parts_covered & HANDS))
|
||||||
|
if(M.gloves)
|
||||||
|
fibertext = "Material from a pair of [M.gloves.name]."
|
||||||
|
if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||||
|
LAZYSET(fibers, fibertext, fibertext)
|
||||||
|
else if(M.w_uniform)
|
||||||
|
fibertext = "Fibers from \a [M.w_uniform]."
|
||||||
|
if(prob(15*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||||
|
// "Added fibertext: [fibertext]"
|
||||||
|
LAZYSET(fibers, fibertext, fibertext)
|
||||||
|
if(M.gloves)
|
||||||
|
fibertext = "Material from a pair of [M.gloves.name]."
|
||||||
|
if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||||
|
LAZYSET(fibers, fibertext, fibertext)
|
||||||
|
else if(M.gloves)
|
||||||
|
fibertext = "Material from a pair of [M.gloves.name]."
|
||||||
|
if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext))
|
||||||
|
LAZYSET(fibers, fibertext, fibertext)
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_hiddenprint_list(list/_hiddenprints) //list(ckey = text)
|
||||||
|
if(!length(_hiddenprints))
|
||||||
|
return
|
||||||
|
LAZYINITLIST(hiddenprints)
|
||||||
|
for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours.
|
||||||
|
hiddenprints[i] = _hiddenprints[i]
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_hiddenprint(mob/living/M)
|
||||||
|
if(!M || !M.key)
|
||||||
|
return
|
||||||
|
var/hasgloves = ""
|
||||||
|
if(ishuman(M))
|
||||||
|
var/mob/living/carbon/human/H = M
|
||||||
|
if(H.gloves)
|
||||||
|
hasgloves = "(gloves)"
|
||||||
|
var/current_time = time_stamp()
|
||||||
|
if(!LAZYACCESS(hiddenprints, M.key))
|
||||||
|
LAZYSET(hiddenprints, M.key, "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]")
|
||||||
|
else
|
||||||
|
var/laststamppos = findtext(LAZYACCESS(hiddenprints, M.key), " Last: ")
|
||||||
|
if(laststamppos)
|
||||||
|
LAZYSET(hiddenprints, M.key, copytext(hiddenprints[M.key], 1, laststamppos))
|
||||||
|
hiddenprints[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else
|
||||||
|
fingerprintslast = M.ckey
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/add_blood_DNA(list/dna) //list(dna_enzymes = type)
|
||||||
|
if(!length(dna))
|
||||||
|
return
|
||||||
|
LAZYINITLIST(blood_DNA)
|
||||||
|
for(var/i in dna)
|
||||||
|
blood_DNA[i] = dna[i]
|
||||||
|
check_blood()
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/forensics/proc/check_blood()
|
||||||
|
if(!isitem(parent))
|
||||||
|
return
|
||||||
|
if(!length(blood_DNA))
|
||||||
|
return
|
||||||
|
parent.LoadComponent(/datum/component/decal/blood)
|
||||||
@@ -5,10 +5,6 @@
|
|||||||
|
|
||||||
var/flags_1 = 0
|
var/flags_1 = 0
|
||||||
var/flags_2 = 0
|
var/flags_2 = 0
|
||||||
|
|
||||||
var/list/fingerprints
|
|
||||||
var/list/fingerprintshidden
|
|
||||||
var/list/blood_DNA
|
|
||||||
var/container_type = NONE
|
var/container_type = NONE
|
||||||
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
|
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
|
||||||
var/datum/reagents/reagents = null
|
var/datum/reagents/reagents = null
|
||||||
@@ -232,21 +228,22 @@
|
|||||||
/atom/proc/in_contents_of(container)//can take class or object instance as argument
|
/atom/proc/in_contents_of(container)//can take class or object instance as argument
|
||||||
if(ispath(container))
|
if(ispath(container))
|
||||||
if(istype(src.loc, container))
|
if(istype(src.loc, container))
|
||||||
return 1
|
return TRUE
|
||||||
else if(src in container)
|
else if(src in container)
|
||||||
return 1
|
return TRUE
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/atom/proc/get_examine_name(mob/user)
|
||||||
|
. = "\a [src]"
|
||||||
|
var/list/override = list(gender == PLURAL? "some" : "a" , " ", "[name]")
|
||||||
|
if(SendSignal(COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
|
||||||
|
. = override.Join("")
|
||||||
|
|
||||||
|
/atom/proc/get_examine_string(mob/user, thats = FALSE)
|
||||||
|
. = "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
|
||||||
|
|
||||||
/atom/proc/examine(mob/user)
|
/atom/proc/examine(mob/user)
|
||||||
//This reformat names to get a/an properly working on item descriptions when they are bloody
|
to_chat(user, get_examine_string(user, TRUE))
|
||||||
var/f_name = "\a [src]."
|
|
||||||
if(src.blood_DNA && !istype(src, /obj/effect/decal))
|
|
||||||
if(gender == PLURAL)
|
|
||||||
f_name = "some "
|
|
||||||
else
|
|
||||||
f_name = "a "
|
|
||||||
f_name += "<span class='danger'>blood-stained</span> [name]!"
|
|
||||||
|
|
||||||
to_chat(user, "[icon2html(src, user)] That's [f_name]")
|
|
||||||
|
|
||||||
if(desc)
|
if(desc)
|
||||||
to_chat(user, desc)
|
to_chat(user, desc)
|
||||||
@@ -303,11 +300,6 @@
|
|||||||
if(AM && isturf(AM.loc))
|
if(AM && isturf(AM.loc))
|
||||||
step(AM, turn(AM.dir, 180))
|
step(AM, turn(AM.dir, 180))
|
||||||
|
|
||||||
GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
|
||||||
|
|
||||||
/atom/proc/blood_splatter_index()
|
|
||||||
return "[REF(initial(icon))]-[initial(icon_state)]"
|
|
||||||
|
|
||||||
//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
|
//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
|
||||||
/mob/living/proc/get_blood_dna_list()
|
/mob/living/proc/get_blood_dna_list()
|
||||||
if(get_blood_id() != "blood")
|
if(get_blood_id() != "blood")
|
||||||
@@ -332,100 +324,28 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
|||||||
// Returns 0 if we have that blood already
|
// Returns 0 if we have that blood already
|
||||||
var/new_blood_dna = L.get_blood_dna_list()
|
var/new_blood_dna = L.get_blood_dna_list()
|
||||||
if(!new_blood_dna)
|
if(!new_blood_dna)
|
||||||
return 0
|
return FALSE
|
||||||
if(!blood_DNA) //if our list of DNA doesn't exist yet, initialise it.
|
var/old_length = blood_DNA_length()
|
||||||
blood_DNA = list()
|
add_blood_DNA(new_blood_dna)
|
||||||
var/old_length = blood_DNA.len
|
if(blood_DNA_length() == old_length)
|
||||||
blood_DNA |= new_blood_dna
|
return FALSE
|
||||||
if(blood_DNA.len == old_length)
|
return TRUE
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
//to add blood dna info to the object's blood_DNA list
|
|
||||||
/atom/proc/transfer_blood_dna(list/blood_dna)
|
|
||||||
if(!blood_DNA)
|
|
||||||
blood_DNA = list()
|
|
||||||
var/old_length = blood_DNA.len
|
|
||||||
blood_DNA |= blood_dna
|
|
||||||
if(blood_DNA.len > old_length)
|
|
||||||
return 1//some new blood DNA was added
|
|
||||||
|
|
||||||
|
|
||||||
//to add blood from a mob onto something, and transfer their dna info
|
//to add blood from a mob onto something, and transfer their dna info
|
||||||
/atom/proc/add_mob_blood(mob/living/M)
|
/atom/proc/add_mob_blood(mob/living/M)
|
||||||
var/list/blood_dna = M.get_blood_dna_list()
|
var/list/blood_dna = M.get_blood_dna_list()
|
||||||
if(!blood_dna)
|
if(!blood_dna)
|
||||||
return 0
|
return FALSE
|
||||||
return add_blood(blood_dna)
|
return add_blood_DNA(blood_dna)
|
||||||
|
|
||||||
//to add blood onto something, with blood dna info to include.
|
|
||||||
/atom/proc/add_blood(list/blood_dna)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/obj/add_blood(list/blood_dna)
|
|
||||||
return transfer_blood_dna(blood_dna)
|
|
||||||
|
|
||||||
/obj/item/add_blood(list/blood_dna)
|
|
||||||
var/blood_count = !blood_DNA ? 0 : blood_DNA.len
|
|
||||||
if(!..())
|
|
||||||
return 0
|
|
||||||
if(!blood_count)//apply the blood-splatter overlay if it isn't already in there
|
|
||||||
add_blood_overlay()
|
|
||||||
return 1 //we applied blood to the item
|
|
||||||
|
|
||||||
/obj/item/proc/add_blood_overlay()
|
|
||||||
if(initial(icon) && initial(icon_state))
|
|
||||||
//try to find a pre-processed blood-splatter. otherwise, make a new one
|
|
||||||
var/index = blood_splatter_index()
|
|
||||||
var/icon/blood_splatter_icon = GLOB.blood_splatter_icons[index]
|
|
||||||
if(!blood_splatter_icon)
|
|
||||||
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 = fcopy_rsc(blood_splatter_icon)
|
|
||||||
GLOB.blood_splatter_icons[index] = blood_splatter_icon
|
|
||||||
add_overlay(blood_splatter_icon)
|
|
||||||
|
|
||||||
/obj/item/clothing/gloves/add_blood(list/blood_dna)
|
|
||||||
. = ..()
|
|
||||||
transfer_blood = rand(2, 4)
|
|
||||||
|
|
||||||
/turf/add_blood(list/blood_dna, list/datum/disease/diseases)
|
|
||||||
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
|
|
||||||
if(!B)
|
|
||||||
B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
|
|
||||||
B.transfer_blood_dna(blood_dna) //give blood info to the blood decal.
|
|
||||||
return 1 //we bloodied the floor
|
|
||||||
|
|
||||||
/mob/living/carbon/human/add_blood(list/blood_dna)
|
|
||||||
if(wear_suit)
|
|
||||||
wear_suit.add_blood(blood_dna)
|
|
||||||
update_inv_wear_suit()
|
|
||||||
else if(w_uniform)
|
|
||||||
w_uniform.add_blood(blood_dna)
|
|
||||||
update_inv_w_uniform()
|
|
||||||
if(gloves)
|
|
||||||
var/obj/item/clothing/gloves/G = gloves
|
|
||||||
G.add_blood(blood_dna)
|
|
||||||
else
|
|
||||||
transfer_blood_dna(blood_dna)
|
|
||||||
bloody_hands = rand(2, 4)
|
|
||||||
update_inv_gloves() //handles bloody hands overlays and updating
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/atom/proc/clean_blood()
|
|
||||||
if(islist(blood_DNA))
|
|
||||||
blood_DNA = null
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/atom/proc/wash_cream()
|
/atom/proc/wash_cream()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
/atom/proc/isinspace()
|
/atom/proc/isinspace()
|
||||||
if(isspaceturf(get_turf(src)))
|
if(isspaceturf(get_turf(src)))
|
||||||
return 1
|
return TRUE
|
||||||
else
|
else
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/atom/proc/handle_fall()
|
/atom/proc/handle_fall()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -67,10 +67,7 @@
|
|||||||
//Left hand items
|
//Left hand items
|
||||||
for(var/obj/item/I in held_items)
|
for(var/obj/item/I in held_items)
|
||||||
if(!(I.flags_1 & ABSTRACT_1))
|
if(!(I.flags_1 & ABSTRACT_1))
|
||||||
if(I.blood_DNA)
|
msg += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
||||||
msg += "<span class='warning'>It is holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "It is holding [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
|
||||||
|
|
||||||
//Braindead
|
//Braindead
|
||||||
if(!client && stat != DEAD)
|
if(!client && stat != DEAD)
|
||||||
|
|||||||
@@ -213,7 +213,7 @@
|
|||||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||||
var/mob/living/carbon/human/target = null
|
var/mob/living/carbon/human/target = null
|
||||||
var/list/mob/living/carbon/human/possible = list()
|
var/list/mob/living/carbon/human/possible = list()
|
||||||
var/obj/item/linked_item = null
|
var/obj/item/voodoo_link = null
|
||||||
var/cooldown_time = 30 //3s
|
var/cooldown_time = 30 //3s
|
||||||
var/cooldown = 0
|
var/cooldown = 0
|
||||||
max_integrity = 10
|
max_integrity = 10
|
||||||
@@ -237,10 +237,10 @@
|
|||||||
cooldown = world.time +cooldown_time
|
cooldown = world.time +cooldown_time
|
||||||
return
|
return
|
||||||
|
|
||||||
if(!linked_item)
|
if(!voodoo_link)
|
||||||
if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
|
if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
|
||||||
if (user.transferItemToLoc(I,src))
|
if (user.transferItemToLoc(I,src))
|
||||||
linked_item = I
|
voodoo_link = I
|
||||||
to_chat(user, "You attach [I] to the doll.")
|
to_chat(user, "You attach [I] to the doll.")
|
||||||
update_targets()
|
update_targets()
|
||||||
|
|
||||||
@@ -255,11 +255,11 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
if(user.zone_selected == "chest")
|
if(user.zone_selected == "chest")
|
||||||
if(linked_item)
|
if(voodoo_link)
|
||||||
target = null
|
target = null
|
||||||
linked_item.forceMove(drop_location())
|
voodoo_link.forceMove(drop_location())
|
||||||
to_chat(user, "<span class='notice'>You remove the [linked_item] from the doll.</span>")
|
to_chat(user, "<span class='notice'>You remove the [voodoo_link] from the doll.</span>")
|
||||||
linked_item = null
|
voodoo_link = null
|
||||||
update_targets()
|
update_targets()
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -291,10 +291,13 @@
|
|||||||
|
|
||||||
/obj/item/voodoo/proc/update_targets()
|
/obj/item/voodoo/proc/update_targets()
|
||||||
possible = list()
|
possible = list()
|
||||||
if(!linked_item)
|
if(!voodoo_link)
|
||||||
return
|
return
|
||||||
|
var/list/prints = voodoo_link.return_fingerprints()
|
||||||
|
if(!length(prints))
|
||||||
|
return FALSE
|
||||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||||
if(md5(H.dna.uni_identity) in linked_item.fingerprints)
|
if(prints[md5(H.dna.uni_identity)])
|
||||||
possible |= H
|
possible |= H
|
||||||
|
|
||||||
/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
|
/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
to_chat(user, "<span class='notice'>You remove the glass panel.</span>")
|
to_chat(user, "<span class='notice'>You remove the glass panel.</span>")
|
||||||
state = 3
|
state = 3
|
||||||
icon_state = "3"
|
icon_state = "3"
|
||||||
var/obj/item/stack/sheet/glass/G = new (drop_location(), 2)
|
var/obj/item/stack/sheet/glass/G = new(drop_location(), 2)
|
||||||
G.add_fingerprint(user)
|
G.add_fingerprint(user)
|
||||||
return
|
return
|
||||||
if(istype(P, /obj/item/screwdriver))
|
if(istype(P, /obj/item/screwdriver))
|
||||||
|
|||||||
@@ -154,11 +154,8 @@
|
|||||||
to_chat(usr, "<span class='warning'>There's not enough room to build that here!</span>")
|
to_chat(usr, "<span class='warning'>There's not enough room to build that here!</span>")
|
||||||
qdel(C)
|
qdel(C)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
if(href_list["dir"])
|
if(href_list["dir"])
|
||||||
C.setDir(text2num(href_list["dir"]))
|
C.setDir(text2num(href_list["dir"]))
|
||||||
|
|
||||||
C.add_fingerprint(usr)
|
C.add_fingerprint(usr)
|
||||||
C.update_icon()
|
C.update_icon()
|
||||||
wait = world.time + 15
|
wait = world.time + 15
|
||||||
|
|||||||
@@ -236,8 +236,7 @@
|
|||||||
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
|
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
|
||||||
playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
|
playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
|
||||||
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
|
||||||
I.clean_blood()
|
I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
|
||||||
I.fingerprints = list()
|
|
||||||
var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive)
|
var/datum/component/radioactive/contamination = I.GetComponent(/datum/component/radioactive)
|
||||||
if(contamination)
|
if(contamination)
|
||||||
qdel(contamination)
|
qdel(contamination)
|
||||||
|
|||||||
@@ -12,6 +12,10 @@
|
|||||||
var/obj/item/color_source
|
var/obj/item/color_source
|
||||||
var/max_wash_capacity = 5
|
var/max_wash_capacity = 5
|
||||||
|
|
||||||
|
/obj/machinery/washing_machine/ComponentInitialize()
|
||||||
|
. = ..()
|
||||||
|
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
|
||||||
|
|
||||||
/obj/machinery/washing_machine/examine(mob/user)
|
/obj/machinery/washing_machine/examine(mob/user)
|
||||||
..()
|
..()
|
||||||
to_chat(user, "<span class='notice'>Alt-click it to start a wash cycle.</span>")
|
to_chat(user, "<span class='notice'>Alt-click it to start a wash cycle.</span>")
|
||||||
@@ -36,20 +40,17 @@
|
|||||||
|
|
||||||
busy = TRUE
|
busy = TRUE
|
||||||
update_icon()
|
update_icon()
|
||||||
sleep(200)
|
addtimer(CALLBACK(src, .proc/wash_cycle), 200)
|
||||||
wash_cycle()
|
|
||||||
|
|
||||||
/obj/machinery/washing_machine/clean_blood()
|
/obj/machinery/washing_machine/proc/clean_blood()
|
||||||
..()
|
|
||||||
if(!busy)
|
if(!busy)
|
||||||
bloody_mess = 0
|
bloody_mess = FALSE
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/washing_machine/proc/wash_cycle()
|
/obj/machinery/washing_machine/proc/wash_cycle()
|
||||||
for(var/X in contents)
|
for(var/X in contents)
|
||||||
var/atom/movable/AM = X
|
var/atom/movable/AM = X
|
||||||
AM.clean_blood()
|
AM.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
AM.machine_wash(src)
|
AM.machine_wash(src)
|
||||||
|
|
||||||
busy = FALSE
|
busy = FALSE
|
||||||
|
|||||||
@@ -79,14 +79,11 @@
|
|||||||
add_blood = bloodiness
|
add_blood = bloodiness
|
||||||
bloodiness -= add_blood
|
bloodiness -= add_blood
|
||||||
S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS,S.bloody_shoes[blood_state]+add_blood)
|
S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS,S.bloody_shoes[blood_state]+add_blood)
|
||||||
if(blood_DNA && blood_DNA.len)
|
S.add_blood_DNA(return_blood_DNA())
|
||||||
S.add_blood(blood_DNA)
|
|
||||||
S.blood_state = blood_state
|
S.blood_state = blood_state
|
||||||
update_icon()
|
update_icon()
|
||||||
H.update_inv_shoes()
|
H.update_inv_shoes()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
|
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
|
||||||
if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
|
if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY))
|
||||||
return bloodiness
|
return bloodiness
|
||||||
|
|||||||
@@ -6,10 +6,13 @@
|
|||||||
icon = 'icons/effects/blood.dmi'
|
icon = 'icons/effects/blood.dmi'
|
||||||
icon_state = "xfloor1"
|
icon_state = "xfloor1"
|
||||||
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
|
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
|
||||||
blood_DNA = list("UNKNOWN DNA" = "X*")
|
|
||||||
bloodiness = MAX_SHOE_BLOODINESS
|
bloodiness = MAX_SHOE_BLOODINESS
|
||||||
blood_state = BLOOD_STATE_XENO
|
blood_state = BLOOD_STATE_XENO
|
||||||
|
|
||||||
|
/obj/effect/decal/cleanable/xenoblood/Initialize()
|
||||||
|
. = ..()
|
||||||
|
add_blood_DNA(list("UNKNOWN DNA" = "X*"))
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/xenoblood/xsplatter
|
/obj/effect/decal/cleanable/xenoblood/xsplatter
|
||||||
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
|
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
|
||||||
|
|
||||||
@@ -62,4 +65,7 @@
|
|||||||
/obj/effect/decal/cleanable/blood/xtracks
|
/obj/effect/decal/cleanable/blood/xtracks
|
||||||
icon_state = "xtracks"
|
icon_state = "xtracks"
|
||||||
random_icon_states = null
|
random_icon_states = null
|
||||||
blood_DNA = list("UNKNOWN DNA" = "X*")
|
|
||||||
|
/obj/effect/decal/cleanable/blood/xtracks/Initialize()
|
||||||
|
. = ..()
|
||||||
|
add_blood_DNA(list("Unknown DNA" = "X*"))
|
||||||
|
|||||||
@@ -4,13 +4,11 @@
|
|||||||
icon = 'icons/effects/blood.dmi'
|
icon = 'icons/effects/blood.dmi'
|
||||||
icon_state = "floor1"
|
icon_state = "floor1"
|
||||||
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
||||||
blood_DNA = list()
|
|
||||||
blood_state = BLOOD_STATE_HUMAN
|
blood_state = BLOOD_STATE_HUMAN
|
||||||
bloodiness = MAX_SHOE_BLOODINESS
|
bloodiness = MAX_SHOE_BLOODINESS
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
|
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
|
||||||
if (C.blood_DNA)
|
add_blood_DNA(C.return_blood_DNA())
|
||||||
blood_DNA |= C.blood_DNA.Copy()
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/blood/old
|
/obj/effect/decal/cleanable/blood/old
|
||||||
@@ -21,7 +19,7 @@
|
|||||||
/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
|
/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
|
||||||
. = ..()
|
. = ..()
|
||||||
icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization.
|
icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization.
|
||||||
blood_DNA["Non-human DNA"] = "A+"
|
add_blood_DNA(list("Non-human DNA" = "A+"))
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/blood/splatter
|
/obj/effect/decal/cleanable/blood/splatter
|
||||||
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
|
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
|
||||||
@@ -37,11 +35,9 @@
|
|||||||
desc = "Your instincts say you shouldn't be following these."
|
desc = "Your instincts say you shouldn't be following these."
|
||||||
random_icon_states = null
|
random_icon_states = null
|
||||||
var/list/existing_dirs = list()
|
var/list/existing_dirs = list()
|
||||||
blood_DNA = list()
|
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
|
/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/blood/gibs
|
/obj/effect/decal/cleanable/blood/gibs
|
||||||
name = "gibs"
|
name = "gibs"
|
||||||
@@ -100,8 +96,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
setDir(pick(1,2,4,8))
|
setDir(pick(1,2,4,8))
|
||||||
icon_state += "-old"
|
icon_state += "-old"
|
||||||
blood_DNA["Non-human DNA"] = "A+"
|
add_blood_DNA(list("Non-human DNA" = "A+"))
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/blood/drip
|
/obj/effect/decal/cleanable/blood/drip
|
||||||
name = "drips of blood"
|
name = "drips of blood"
|
||||||
@@ -111,9 +106,8 @@
|
|||||||
bloodiness = 0
|
bloodiness = 0
|
||||||
var/drips = 1
|
var/drips = 1
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
|
/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in()
|
||||||
return 1
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
//BLOODY FOOTPRINTS
|
//BLOODY FOOTPRINTS
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
digester.stomach_contents += gib
|
digester.stomach_contents += gib
|
||||||
|
|
||||||
if(MobDNA)
|
if(MobDNA)
|
||||||
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.blood_type
|
|
||||||
else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
|
else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
|
||||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
gib.add_blood_DNA(list("Non-human DNA" = "A+"))
|
||||||
var/list/directions = gibdirections[i]
|
var/list/directions = gibdirections[i]
|
||||||
if(isturf(loc))
|
if(isturf(loc))
|
||||||
if(directions.len)
|
if(directions.len)
|
||||||
|
|||||||
@@ -559,20 +559,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
|||||||
M.become_blind(EYE_DAMAGE)
|
M.become_blind(EYE_DAMAGE)
|
||||||
to_chat(M, "<span class='danger'>You go blind!</span>")
|
to_chat(M, "<span class='danger'>You go blind!</span>")
|
||||||
|
|
||||||
/obj/item/clean_blood()
|
|
||||||
. = ..()
|
|
||||||
if(.)
|
|
||||||
if(initial(icon) && initial(icon_state))
|
|
||||||
var/index = blood_splatter_index()
|
|
||||||
var/icon/blood_splatter_icon = GLOB.blood_splatter_icons[index]
|
|
||||||
if(blood_splatter_icon)
|
|
||||||
cut_overlay(blood_splatter_icon)
|
|
||||||
|
|
||||||
/obj/item/clothing/gloves/clean_blood()
|
|
||||||
. = ..()
|
|
||||||
if(.)
|
|
||||||
transfer_blood = 0
|
|
||||||
|
|
||||||
/obj/item/singularity_pull(S, current_size)
|
/obj/item/singularity_pull(S, current_size)
|
||||||
..()
|
..()
|
||||||
if(current_size >= STAGE_FOUR)
|
if(current_size >= STAGE_FOUR)
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
var/obj/effect/decal/cleanable/C = locate() in target
|
var/obj/effect/decal/cleanable/C = locate() in target
|
||||||
qdel(C)
|
qdel(C)
|
||||||
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||||
target.clean_blood()
|
target.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
target.wash_cream()
|
target.wash_cream()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -141,8 +141,8 @@
|
|||||||
else
|
else
|
||||||
icon_state = initial(icon_state)
|
icon_state = initial(icon_state)
|
||||||
|
|
||||||
/obj/item/device/radio/intercom/add_blood(list/blood_dna)
|
/obj/item/device/radio/intercom/add_blood_DNA(list/blood_dna)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
//Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it!
|
//Created through the autolathe or through deconstructing intercoms. Can be applied to wall to make a new intercom on it!
|
||||||
/obj/item/wallframe/intercom
|
/obj/item/wallframe/intercom
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
user.visible_message("<span class='suicide'>[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku!</span>")
|
user.visible_message("<span class='suicide'>[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku!</span>")
|
||||||
return (BRUTELOSS|FIRELOSS)
|
return (BRUTELOSS|FIRELOSS)
|
||||||
|
|
||||||
/obj/item/melee/transforming/energy/add_blood(list/blood_dna)
|
/obj/item/melee/transforming/energy/add_blood_DNA(list/blood_dna)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/obj/item/melee/transforming/energy/is_sharp()
|
/obj/item/melee/transforming/energy/is_sharp()
|
||||||
return active * sharpness
|
return active * sharpness
|
||||||
|
|||||||
@@ -285,8 +285,8 @@
|
|||||||
shard.Consume()
|
shard.Consume()
|
||||||
T.CalculateAdjacentTurfs()
|
T.CalculateAdjacentTurfs()
|
||||||
|
|
||||||
/obj/item/melee/supermatter_sword/add_blood(list/blood_dna)
|
/obj/item/melee/supermatter_sword/add_blood_DNA(list/blood_dna)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
/obj/item/melee/curator_whip
|
/obj/item/melee/curator_whip
|
||||||
name = "curator's whip"
|
name = "curator's whip"
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
/obj/item/mop/proc/clean(turf/A)
|
/obj/item/mop/proc/clean(turf/A)
|
||||||
if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1))
|
if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1))
|
||||||
A.clean_blood()
|
|
||||||
A.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
A.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
||||||
for(var/obj/effect/O in A)
|
for(var/obj/effect/O in A)
|
||||||
if(is_cleanable(O))
|
if(is_cleanable(O))
|
||||||
|
|||||||
@@ -336,10 +336,10 @@
|
|||||||
else
|
else
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj)
|
/obj/item/stack/proc/copy_evidences(obj/item/stack/from)
|
||||||
blood_DNA = from.blood_DNA
|
add_blood_DNA(from.return_blood_DNA())
|
||||||
fingerprints = from.fingerprints
|
add_fingerprint_list(from.return_fingerprints())
|
||||||
fingerprintshidden = from.fingerprintshidden
|
add_hiddenprint_list(from.return_hiddenprints())
|
||||||
fingerprintslast = from.fingerprintslast
|
fingerprintslast = from.fingerprintslast
|
||||||
//TODO bloody overlay
|
//TODO bloody overlay
|
||||||
|
|
||||||
|
|||||||
@@ -213,5 +213,5 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
|||||||
else
|
else
|
||||||
return ..(M,user,heal_mode = FALSE)
|
return ..(M,user,heal_mode = FALSE)
|
||||||
|
|
||||||
/obj/item/storage/book/bible/syndicate/add_blood(list/blood_dna)
|
/obj/item/storage/book/bible/syndicate/add_blood_DNA(list/blood_dna)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|||||||
@@ -293,7 +293,7 @@
|
|||||||
icon_state = "dualsaber[item_color][wielded]"
|
icon_state = "dualsaber[item_color][wielded]"
|
||||||
else
|
else
|
||||||
icon_state = "dualsaber0"
|
icon_state = "dualsaber0"
|
||||||
clean_blood()//blood overlays get weird otherwise, because the sprite changes.
|
SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
|
|
||||||
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
|
/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
|
||||||
if(user.has_dna())
|
if(user.has_dna())
|
||||||
|
|||||||
@@ -296,8 +296,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/obj/machinery/shower/proc/wash_obj(obj/O)
|
/obj/machinery/shower/proc/wash_obj(obj/O)
|
||||||
O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
. = O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||||
. = O.clean_blood()
|
|
||||||
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||||
if(isitem(O))
|
if(isitem(O))
|
||||||
var/obj/item/I = O
|
var/obj/item/I = O
|
||||||
@@ -310,7 +309,6 @@
|
|||||||
var/turf/tile = loc
|
var/turf/tile = loc
|
||||||
tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
tile.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||||
tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||||
tile.clean_blood()
|
|
||||||
for(var/obj/effect/E in tile)
|
for(var/obj/effect/E in tile)
|
||||||
if(is_cleanable(E))
|
if(is_cleanable(E))
|
||||||
qdel(E)
|
qdel(E)
|
||||||
@@ -361,7 +359,7 @@
|
|||||||
else if(H.w_uniform && wash_obj(H.w_uniform))
|
else if(H.w_uniform && wash_obj(H.w_uniform))
|
||||||
H.update_inv_w_uniform()
|
H.update_inv_w_uniform()
|
||||||
if(washgloves)
|
if(washgloves)
|
||||||
H.clean_blood()
|
H.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
if(H.shoes && washshoes && wash_obj(H.shoes))
|
if(H.shoes && washshoes && wash_obj(H.shoes))
|
||||||
H.update_inv_shoes()
|
H.update_inv_shoes()
|
||||||
if(H.wear_mask && washmask && wash_obj(H.wear_mask))
|
if(H.wear_mask && washmask && wash_obj(H.wear_mask))
|
||||||
@@ -378,9 +376,9 @@
|
|||||||
else
|
else
|
||||||
if(M.wear_mask && wash_obj(M.wear_mask))
|
if(M.wear_mask && wash_obj(M.wear_mask))
|
||||||
M.update_inv_wear_mask(0)
|
M.update_inv_wear_mask(0)
|
||||||
M.clean_blood()
|
M.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
else
|
else
|
||||||
L.clean_blood()
|
L.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
|
|
||||||
/obj/machinery/shower/proc/contamination_cleanse(atom/movable/thing)
|
/obj/machinery/shower/proc/contamination_cleanse(atom/movable/thing)
|
||||||
var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive)
|
var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive)
|
||||||
@@ -473,8 +471,7 @@
|
|||||||
H.regenerate_icons()
|
H.regenerate_icons()
|
||||||
user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep
|
user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep
|
||||||
else
|
else
|
||||||
user.clean_blood()
|
user.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/sink/attackby(obj/item/O, mob/living/user, params)
|
/obj/structure/sink/attackby(obj/item/O, mob/living/user, params)
|
||||||
if(busy)
|
if(busy)
|
||||||
@@ -530,7 +527,7 @@
|
|||||||
busy = FALSE
|
busy = FALSE
|
||||||
return 1
|
return 1
|
||||||
busy = FALSE
|
busy = FALSE
|
||||||
O.clean_blood()
|
O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
O.acid_level = 0
|
O.acid_level = 0
|
||||||
create_reagents(5)
|
create_reagents(5)
|
||||||
reagents.add_reagent(dispensedreagent, 5)
|
reagents.add_reagent(dispensedreagent, 5)
|
||||||
|
|||||||
@@ -173,7 +173,7 @@
|
|||||||
for(var/mob/living/simple_animal/slime/M in src)
|
for(var/mob/living/simple_animal/slime/M in src)
|
||||||
M.apply_water()
|
M.apply_water()
|
||||||
|
|
||||||
clean_blood()
|
SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||||
for(var/obj/effect/O in src)
|
for(var/obj/effect/O in src)
|
||||||
if(is_cleanable(O))
|
if(is_cleanable(O))
|
||||||
qdel(O)
|
qdel(O)
|
||||||
|
|||||||
@@ -11,13 +11,21 @@
|
|||||||
strip_delay = 20
|
strip_delay = 20
|
||||||
equip_delay_other = 40
|
equip_delay_other = 40
|
||||||
|
|
||||||
|
/obj/item/clothing/gloves/ComponentInitialize()
|
||||||
|
. = ..()
|
||||||
|
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
|
||||||
|
|
||||||
|
/obj/item/clothing/gloves/proc/clean_blood(strength)
|
||||||
|
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||||
|
return
|
||||||
|
transfer_blood = 0
|
||||||
|
|
||||||
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
|
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
|
||||||
. = list()
|
. = list()
|
||||||
if(!isinhands)
|
if(!isinhands)
|
||||||
if(damaged_clothes)
|
if(damaged_clothes)
|
||||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
|
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
. += mutable_appearance('icons/effects/blood.dmi', "bloodyhands")
|
. += mutable_appearance('icons/effects/blood.dmi', "bloodyhands")
|
||||||
|
|
||||||
/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE)
|
/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
if(!isinhands)
|
if(!isinhands)
|
||||||
if(damaged_clothes)
|
if(damaged_clothes)
|
||||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
|
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
. += mutable_appearance('icons/effects/blood.dmi', "helmetblood")
|
. += mutable_appearance('icons/effects/blood.dmi', "helmetblood")
|
||||||
|
|
||||||
/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE)
|
/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
if(body_parts_covered & HEAD)
|
if(body_parts_covered & HEAD)
|
||||||
if(damaged_clothes)
|
if(damaged_clothes)
|
||||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
|
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
|
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
|
||||||
|
|
||||||
/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
|
/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
if(body_parts_covered & HEAD)
|
if(body_parts_covered & HEAD)
|
||||||
if(damaged_clothes)
|
if(damaged_clothes)
|
||||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
|
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
|
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
|
||||||
|
|
||||||
/obj/item/clothing/neck/tie
|
/obj/item/clothing/neck/tie
|
||||||
|
|||||||
@@ -15,12 +15,16 @@
|
|||||||
var/offset = 0
|
var/offset = 0
|
||||||
var/equipped_before_drop = FALSE
|
var/equipped_before_drop = FALSE
|
||||||
|
|
||||||
|
/obj/item/clothing/shoes/ComponentInitialize()
|
||||||
|
. = ..()
|
||||||
|
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
|
||||||
|
|
||||||
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE)
|
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE)
|
||||||
. = list()
|
. = list()
|
||||||
if(!isinhands)
|
if(!isinhands)
|
||||||
var/bloody = 0
|
var/bloody = FALSE
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
bloody = 1
|
bloody = TRUE
|
||||||
else
|
else
|
||||||
bloody = bloody_shoes[BLOOD_STATE_HUMAN]
|
bloody = bloody_shoes[BLOOD_STATE_HUMAN]
|
||||||
|
|
||||||
@@ -53,8 +57,9 @@
|
|||||||
var/mob/M = loc
|
var/mob/M = loc
|
||||||
M.update_inv_shoes()
|
M.update_inv_shoes()
|
||||||
|
|
||||||
/obj/item/clothing/shoes/clean_blood()
|
/obj/item/clothing/shoes/proc/clean_blood(strength)
|
||||||
..()
|
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||||
|
return
|
||||||
bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
|
bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
|
||||||
blood_state = BLOOD_STATE_NOT_BLOODY
|
blood_state = BLOOD_STATE_NOT_BLOODY
|
||||||
if(ismob(loc))
|
if(ismob(loc))
|
||||||
@@ -62,4 +67,4 @@
|
|||||||
M.update_inv_shoes()
|
M.update_inv_shoes()
|
||||||
|
|
||||||
/obj/item/proc/negates_gravity()
|
/obj/item/proc/negates_gravity()
|
||||||
return 0
|
return FALSE
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
if(!isinhands)
|
if(!isinhands)
|
||||||
if(damaged_clothes)
|
if(damaged_clothes)
|
||||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]")
|
. += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]")
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood")
|
. += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood")
|
||||||
var/mob/living/carbon/human/M = loc
|
var/mob/living/carbon/human/M = loc
|
||||||
if(ishuman(M) && M.w_uniform)
|
if(ishuman(M) && M.w_uniform)
|
||||||
|
|||||||
@@ -19,10 +19,9 @@
|
|||||||
/obj/item/clothing/under/worn_overlays(isinhands = FALSE)
|
/obj/item/clothing/under/worn_overlays(isinhands = FALSE)
|
||||||
. = list()
|
. = list()
|
||||||
if(!isinhands)
|
if(!isinhands)
|
||||||
|
|
||||||
if(damaged_clothes)
|
if(damaged_clothes)
|
||||||
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
|
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
|
||||||
if(blood_DNA)
|
IF_HAS_BLOOD_DNA(src)
|
||||||
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood")
|
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood")
|
||||||
if(accessory_overlay)
|
if(accessory_overlay)
|
||||||
. += accessory_overlay
|
. += accessory_overlay
|
||||||
|
|||||||
@@ -1,119 +1,102 @@
|
|||||||
//CONTAINS: Suit fibers and Detective's Scanning Computer
|
//CONTAINS: Suit fibers and Detective's Scanning Computer
|
||||||
|
|
||||||
/atom/var/list/suit_fibers
|
/atom/proc/return_fingerprints()
|
||||||
|
GET_COMPONENT(D, /datum/component/forensics)
|
||||||
|
if(D)
|
||||||
|
. = D.fingerprints
|
||||||
|
|
||||||
/atom/proc/add_fibers(mob/living/carbon/human/M)
|
/atom/proc/return_hiddenprints()
|
||||||
if(M.gloves && istype(M.gloves, /obj/item/clothing/))
|
GET_COMPONENT(D, /datum/component/forensics)
|
||||||
var/obj/item/clothing/gloves/G = M.gloves
|
if(D)
|
||||||
if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
|
. = D.hiddenprints
|
||||||
if(add_blood(G.blood_DNA)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
|
|
||||||
G.transfer_blood--
|
|
||||||
else if(M.bloody_hands > 1)
|
|
||||||
if(add_blood(M.blood_DNA))
|
|
||||||
M.bloody_hands--
|
|
||||||
if(!suit_fibers)
|
|
||||||
suit_fibers = list()
|
|
||||||
var/fibertext
|
|
||||||
var/item_multiplier = isitem(src)?1.2:1
|
|
||||||
if(M.wear_suit)
|
|
||||||
fibertext = "Material from \a [M.wear_suit]."
|
|
||||||
if(prob(10*item_multiplier) && !(fibertext in suit_fibers))
|
|
||||||
suit_fibers += fibertext
|
|
||||||
if(!(M.wear_suit.body_parts_covered & CHEST))
|
|
||||||
if(M.w_uniform)
|
|
||||||
fibertext = "Fibers from \a [M.w_uniform]."
|
|
||||||
if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed.
|
|
||||||
suit_fibers += fibertext
|
|
||||||
if(!(M.wear_suit.body_parts_covered & HANDS))
|
|
||||||
if(M.gloves)
|
|
||||||
fibertext = "Material from a pair of [M.gloves.name]."
|
|
||||||
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
|
|
||||||
suit_fibers += fibertext
|
|
||||||
else if(M.w_uniform)
|
|
||||||
fibertext = "Fibers from \a [M.w_uniform]."
|
|
||||||
if(prob(15*item_multiplier) && !(fibertext in suit_fibers))
|
|
||||||
// "Added fibertext: [fibertext]"
|
|
||||||
suit_fibers += fibertext
|
|
||||||
if(M.gloves)
|
|
||||||
fibertext = "Material from a pair of [M.gloves.name]."
|
|
||||||
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
|
|
||||||
suit_fibers += "Material from a pair of [M.gloves.name]."
|
|
||||||
else if(M.gloves)
|
|
||||||
fibertext = "Material from a pair of [M.gloves.name]."
|
|
||||||
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
|
|
||||||
suit_fibers += "Material from a pair of [M.gloves.name]."
|
|
||||||
|
|
||||||
|
/atom/proc/return_blood_DNA()
|
||||||
|
GET_COMPONENT(D, /datum/component/forensics)
|
||||||
|
if(D)
|
||||||
|
. = D.blood_DNA
|
||||||
|
|
||||||
/atom/proc/add_hiddenprint(mob/living/M)
|
/atom/proc/blood_DNA_length()
|
||||||
if(!M || !M.key)
|
GET_COMPONENT(D, /datum/component/forensics)
|
||||||
return
|
if(D)
|
||||||
|
. = length(D.blood_DNA)
|
||||||
|
|
||||||
if(!fingerprintshidden) //Add the list if it does not exist
|
/atom/proc/return_fibers()
|
||||||
fingerprintshidden = list()
|
GET_COMPONENT(D, /datum/component/forensics)
|
||||||
|
if(D)
|
||||||
var/hasgloves = ""
|
. = D.fibers
|
||||||
if(ishuman(M))
|
|
||||||
var/mob/living/carbon/human/H = M
|
|
||||||
if(H.gloves)
|
|
||||||
hasgloves = "(gloves)"
|
|
||||||
|
|
||||||
var/current_time = time_stamp()
|
|
||||||
if(!fingerprintshidden[M.key])
|
|
||||||
fingerprintshidden[M.key] = "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]"
|
|
||||||
else
|
|
||||||
var/laststamppos = findtext(fingerprintshidden[M.key], " Last: ")
|
|
||||||
if(laststamppos)
|
|
||||||
fingerprintshidden[M.key] = copytext(fingerprintshidden[M.key], 1, laststamppos)
|
|
||||||
fingerprintshidden[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]"
|
|
||||||
|
|
||||||
fingerprintslast = M.ckey
|
|
||||||
|
|
||||||
|
/atom/proc/add_fingerprint_list(list/fingerprints) //ASSOC LIST FINGERPRINT = FINGERPRINT
|
||||||
|
if(length(fingerprints))
|
||||||
|
. = AddComponent(/datum/component/forensics, fingerprints)
|
||||||
|
|
||||||
//Set ignoregloves to add prints irrespective of the mob having gloves on.
|
//Set ignoregloves to add prints irrespective of the mob having gloves on.
|
||||||
/atom/proc/add_fingerprint(mob/living/M, ignoregloves = 0)
|
/atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE)
|
||||||
if(!M || !M.key)
|
var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
|
||||||
return
|
. = D.add_fingerprint(M, ignoregloves)
|
||||||
|
|
||||||
add_hiddenprint(M)
|
/atom/proc/add_fiber_list(list/fibertext) //ASSOC LIST FIBERTEXT = FIBERTEXT
|
||||||
|
if(length(fibertext))
|
||||||
|
. = AddComponent(/datum/component/forensics, null, null, null, fibertext)
|
||||||
|
|
||||||
if(ishuman(M))
|
/atom/proc/add_fibers(mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/H = M
|
var/old = 0
|
||||||
|
if(M.gloves && istype(M.gloves, /obj/item/clothing))
|
||||||
|
var/obj/item/clothing/gloves/G = M.gloves
|
||||||
|
old = length(G.return_blood_DNA())
|
||||||
|
if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
|
||||||
|
if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody
|
||||||
|
G.transfer_blood--
|
||||||
|
else if(M.bloody_hands > 1)
|
||||||
|
old = length(M.return_blood_DNA())
|
||||||
|
if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old)
|
||||||
|
M.bloody_hands--
|
||||||
|
var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
|
||||||
|
. = D.add_fibers(M)
|
||||||
|
|
||||||
add_fibers(H)
|
/atom/proc/add_hiddenprint_list(list/hiddenprints) //NOTE: THIS IS FOR ADMINISTRATION FINGERPRINTS, YOU MUST CUSTOM SET THIS TO INCLUDE CKEY/REAL NAMES! CHECK FORENSICS.DM
|
||||||
|
if(length(hiddenprints))
|
||||||
|
. = AddComponent(/datum/component/forensics, null, hiddenprints)
|
||||||
|
|
||||||
if(H.gloves) //Check if the gloves (if any) hide fingerprints
|
/atom/proc/add_hiddenprint(mob/living/M)
|
||||||
var/obj/item/clothing/gloves/G = H.gloves
|
var/datum/component/forensics/D = AddComponent(/datum/component/forensics)
|
||||||
if(G.transfer_prints)
|
. = D.add_hiddenprint(M)
|
||||||
ignoregloves = 1
|
|
||||||
|
|
||||||
if(!ignoregloves)
|
/atom/proc/add_blood_DNA(list/dna) //ASSOC LIST DNA = BLOODTYPE
|
||||||
H.gloves.add_fingerprint(H, 1) //ignoregloves = 1 to avoid infinite loop.
|
return FALSE
|
||||||
return
|
|
||||||
|
|
||||||
if(!fingerprints) //Add the list if it does not exist
|
/obj/add_blood_DNA(list/dna)
|
||||||
fingerprints = list()
|
. = ..()
|
||||||
var/full_print = md5(H.dna.uni_identity)
|
if(length(dna))
|
||||||
fingerprints[full_print] = full_print
|
. = AddComponent(/datum/component/forensics, null, null, dna)
|
||||||
|
|
||||||
|
/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||||
|
. = ..()
|
||||||
|
transfer_blood = rand(2, 4)
|
||||||
|
|
||||||
|
/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||||
|
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
|
||||||
|
if(!B)
|
||||||
|
B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
|
||||||
|
B.add_blood_DNA(blood_dna) //give blood info to the blood decal.
|
||||||
|
return TRUE //we bloodied the floor
|
||||||
|
|
||||||
|
/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
|
||||||
|
if(wear_suit)
|
||||||
|
wear_suit.add_blood_DNA(blood_dna)
|
||||||
|
update_inv_wear_suit()
|
||||||
|
else if(w_uniform)
|
||||||
|
w_uniform.add_blood_DNA(blood_dna)
|
||||||
|
update_inv_w_uniform()
|
||||||
|
if(gloves)
|
||||||
|
var/obj/item/clothing/gloves/G = gloves
|
||||||
|
G.add_blood_DNA(blood_dna)
|
||||||
|
else if(length(blood_dna))
|
||||||
|
AddComponent(/datum/component/forensics, null, null, dna)
|
||||||
|
bloody_hands = rand(2, 4)
|
||||||
|
update_inv_gloves() //handles bloody hands overlays and updating
|
||||||
|
return TRUE
|
||||||
|
|
||||||
/atom/proc/transfer_fingerprints_to(atom/A)
|
/atom/proc/transfer_fingerprints_to(atom/A)
|
||||||
|
A.add_fingerprint_list(return_fingerprints())
|
||||||
// Make sure everything are lists.
|
A.add_hiddenprint_list(return_hiddenprints())
|
||||||
if(!islist(A.fingerprints))
|
|
||||||
A.fingerprints = list()
|
|
||||||
if(!islist(A.fingerprintshidden))
|
|
||||||
A.fingerprintshidden = list()
|
|
||||||
|
|
||||||
if(!islist(fingerprints))
|
|
||||||
fingerprints = list()
|
|
||||||
if(!islist(fingerprintshidden))
|
|
||||||
fingerprintshidden = list()
|
|
||||||
|
|
||||||
// Transfer
|
|
||||||
if(fingerprints)
|
|
||||||
A.fingerprints |= fingerprints.Copy() //detective
|
|
||||||
if(fingerprintshidden)
|
|
||||||
A.fingerprintshidden |= fingerprintshidden.Copy() //admin
|
|
||||||
A.fingerprintslast = fingerprintslast
|
A.fingerprintslast = fingerprintslast
|
||||||
|
|||||||
@@ -46,6 +46,5 @@
|
|||||||
user.visible_message("[user] starts to wipe down [A] with [src]!", "<span class='notice'>You start to wipe down [A] with [src]...</span>")
|
user.visible_message("[user] starts to wipe down [A] with [src]!", "<span class='notice'>You start to wipe down [A] with [src]...</span>")
|
||||||
if(do_after(user,30, target = A))
|
if(do_after(user,30, target = A))
|
||||||
user.visible_message("[user] finishes wiping off the [A]!", "<span class='notice'>You finish wiping off the [A].</span>")
|
user.visible_message("[user] finishes wiping off the [A]!", "<span class='notice'>You finish wiping off the [A].</span>")
|
||||||
A.clean_blood()
|
A.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
|
||||||
A.wash_cream()
|
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -67,20 +67,14 @@
|
|||||||
|
|
||||||
//Make our lists
|
//Make our lists
|
||||||
var/list/fingerprints = list()
|
var/list/fingerprints = list()
|
||||||
var/list/blood = list()
|
var/list/blood = A.return_blood_DNA()
|
||||||
var/list/fibers = list()
|
var/list/fibers = A.return_fibers()
|
||||||
var/list/reagents = list()
|
var/list/reagents = list()
|
||||||
|
|
||||||
var/target_name = A.name
|
var/target_name = A.name
|
||||||
|
|
||||||
// Start gathering
|
// Start gathering
|
||||||
|
|
||||||
if(A.blood_DNA && A.blood_DNA.len)
|
|
||||||
blood = A.blood_DNA.Copy()
|
|
||||||
|
|
||||||
if(A.suit_fibers && A.suit_fibers.len)
|
|
||||||
fibers = A.suit_fibers.Copy()
|
|
||||||
|
|
||||||
if(ishuman(A))
|
if(ishuman(A))
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = A
|
var/mob/living/carbon/human/H = A
|
||||||
@@ -89,8 +83,7 @@
|
|||||||
|
|
||||||
else if(!ismob(A))
|
else if(!ismob(A))
|
||||||
|
|
||||||
if(A.fingerprints && A.fingerprints.len)
|
fingerprints = A.return_fingerprints()
|
||||||
fingerprints = A.fingerprints.Copy()
|
|
||||||
|
|
||||||
// Only get reagents from non-mobs.
|
// Only get reagents from non-mobs.
|
||||||
if(A.reagents && A.reagents.reagent_list.len)
|
if(A.reagents && A.reagents.reagent_list.len)
|
||||||
@@ -104,6 +97,7 @@
|
|||||||
if(R.data["blood_DNA"] && R.data["blood_type"])
|
if(R.data["blood_DNA"] && R.data["blood_type"])
|
||||||
var/blood_DNA = R.data["blood_DNA"]
|
var/blood_DNA = R.data["blood_DNA"]
|
||||||
var/blood_type = R.data["blood_type"]
|
var/blood_type = R.data["blood_type"]
|
||||||
|
LAZYINITLIST(blood)
|
||||||
blood[blood_DNA] = blood_type
|
blood[blood_DNA] = blood_type
|
||||||
|
|
||||||
// We gathered everything. Create a fork and slowly display the results to the holder of the scanner.
|
// We gathered everything. Create a fork and slowly display the results to the holder of the scanner.
|
||||||
@@ -112,7 +106,7 @@
|
|||||||
add_log("<B>[worldtime2text()][get_timestamp()] - [target_name]</B>", 0)
|
add_log("<B>[worldtime2text()][get_timestamp()] - [target_name]</B>", 0)
|
||||||
|
|
||||||
// Fingerprints
|
// Fingerprints
|
||||||
if(fingerprints && fingerprints.len)
|
if(length(fingerprints))
|
||||||
sleep(30)
|
sleep(30)
|
||||||
add_log("<span class='info'><B>Prints:</B></span>")
|
add_log("<span class='info'><B>Prints:</B></span>")
|
||||||
for(var/finger in fingerprints)
|
for(var/finger in fingerprints)
|
||||||
@@ -120,7 +114,7 @@
|
|||||||
found_something = 1
|
found_something = 1
|
||||||
|
|
||||||
// Blood
|
// Blood
|
||||||
if (blood && blood.len)
|
if (length(blood))
|
||||||
sleep(30)
|
sleep(30)
|
||||||
add_log("<span class='info'><B>Blood:</B></span>")
|
add_log("<span class='info'><B>Blood:</B></span>")
|
||||||
found_something = 1
|
found_something = 1
|
||||||
@@ -128,7 +122,7 @@
|
|||||||
add_log("Type: <font color='red'>[blood[B]]</font> DNA: <font color='red'>[B]</font>")
|
add_log("Type: <font color='red'>[blood[B]]</font> DNA: <font color='red'>[B]</font>")
|
||||||
|
|
||||||
//Fibers
|
//Fibers
|
||||||
if(fibers && fibers.len)
|
if(length(fibers))
|
||||||
sleep(30)
|
sleep(30)
|
||||||
add_log("<span class='info'><B>Fibers:</B></span>")
|
add_log("<span class='info'><B>Fibers:</B></span>")
|
||||||
for(var/fiber in fibers)
|
for(var/fiber in fibers)
|
||||||
@@ -136,7 +130,7 @@
|
|||||||
found_something = 1
|
found_something = 1
|
||||||
|
|
||||||
//Reagents
|
//Reagents
|
||||||
if(reagents && reagents.len)
|
if(length(reagents))
|
||||||
sleep(30)
|
sleep(30)
|
||||||
add_log("<span class='info'><B>Reagents:</B></span>")
|
add_log("<span class='info'><B>Reagents:</B></span>")
|
||||||
for(var/R in reagents)
|
for(var/R in reagents)
|
||||||
|
|||||||
@@ -101,6 +101,7 @@
|
|||||||
return
|
return
|
||||||
if(..())
|
if(..())
|
||||||
return TRUE
|
return TRUE
|
||||||
|
add_fingerprint(usr)
|
||||||
|
|
||||||
if(href_list["category"])
|
if(href_list["category"])
|
||||||
current_category = href_list["category"]
|
current_category = href_list["category"]
|
||||||
|
|||||||
@@ -252,8 +252,7 @@
|
|||||||
drop.transfer_mob_blood_dna(src)
|
drop.transfer_mob_blood_dna(src)
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
temp_blood_DNA = list()
|
temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter
|
||||||
temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter
|
|
||||||
qdel(drop)//the drip is replaced by a bigger splatter
|
qdel(drop)//the drip is replaced by a bigger splatter
|
||||||
else
|
else
|
||||||
drop = new(T, get_static_viruses())
|
drop = new(T, get_static_viruses())
|
||||||
@@ -266,7 +265,7 @@
|
|||||||
B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
|
B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
|
||||||
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
|
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
|
||||||
if(temp_blood_DNA)
|
if(temp_blood_DNA)
|
||||||
B.blood_DNA |= temp_blood_DNA
|
B.add_blood_DNA(temp_blood_DNA)
|
||||||
|
|
||||||
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip)
|
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip)
|
||||||
if(!(NOBLOOD in dna.species.species_traits))
|
if(!(NOBLOOD in dna.species.species_traits))
|
||||||
@@ -278,7 +277,7 @@
|
|||||||
var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents
|
var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents
|
||||||
if(!B)
|
if(!B)
|
||||||
B = new(T)
|
B = new(T)
|
||||||
B.blood_DNA["UNKNOWN DNA"] = "X*"
|
B.add_blood_DNA(list("UNKNOWN DNA" = "X*"))
|
||||||
|
|
||||||
/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip)
|
/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip)
|
||||||
if(!T)
|
if(!T)
|
||||||
|
|||||||
@@ -11,21 +11,18 @@
|
|||||||
if (handcuffed)
|
if (handcuffed)
|
||||||
msg += "<span class='warning'>[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!</span>\n"
|
msg += "<span class='warning'>[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!</span>\n"
|
||||||
if (head)
|
if (head)
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(head, user)] \a [src.head] on [t_his] head. \n"
|
msg += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head. \n"
|
||||||
if (wear_mask)
|
if (wear_mask)
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(wear_mask, user)] \a [src.wear_mask] on [t_his] face.\n"
|
msg += "[t_He] [t_is] wearing [wear_mask.get_examine_string(user)] on [t_his] face.\n"
|
||||||
if (wear_neck)
|
if (wear_neck)
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(wear_neck, user)] \a [src.wear_neck] around [t_his] neck.\n"
|
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
|
||||||
|
|
||||||
for(var/obj/item/I in held_items)
|
for(var/obj/item/I in held_items)
|
||||||
if(!(I.flags_1 & ABSTRACT_1))
|
if(!(I.flags_1 & ABSTRACT_1))
|
||||||
if(I.blood_DNA)
|
msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] holding [icon2html(I, user)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
|
|
||||||
|
|
||||||
if (back)
|
if (back)
|
||||||
msg += "[t_He] [t_has] [icon2html(back, user)] \a [src.back] on [t_his] back.\n"
|
msg += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back.\n"
|
||||||
var/appears_dead = 0
|
var/appears_dead = 0
|
||||||
if (stat == DEAD)
|
if (stat == DEAD)
|
||||||
appears_dead = 1
|
appears_dead = 1
|
||||||
|
|||||||
@@ -21,54 +21,30 @@
|
|||||||
if(U.attached_accessory)
|
if(U.attached_accessory)
|
||||||
accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]"
|
accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]"
|
||||||
|
|
||||||
if(w_uniform.blood_DNA)
|
msg += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg].\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing [icon2html(w_uniform, user)] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][accessory_msg]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(w_uniform, user)] \a [w_uniform][accessory_msg].\n"
|
|
||||||
|
|
||||||
//head
|
//head
|
||||||
if(head)
|
if(head)
|
||||||
if(head.blood_DNA)
|
msg += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(head, user)] \a [head] on [t_his] head.\n"
|
|
||||||
|
|
||||||
//suit/armor
|
//suit/armor
|
||||||
if(wear_suit)
|
if(wear_suit)
|
||||||
if(wear_suit.blood_DNA)
|
msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing [icon2html(wear_suit, user)] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(wear_suit, user)] \a [wear_suit].\n"
|
|
||||||
|
|
||||||
//suit/armor storage
|
//suit/armor storage
|
||||||
if(s_store)
|
if(s_store)
|
||||||
if(s_store.blood_DNA)
|
msg += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name].\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] carrying [icon2html(s_store, user)] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] carrying [icon2html(s_store, user)] \a [s_store] on [t_his] [wear_suit.name].\n"
|
|
||||||
|
|
||||||
//back
|
//back
|
||||||
if(back)
|
if(back)
|
||||||
if(back.blood_DNA)
|
msg += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [icon2html(back, user)] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_has] [icon2html(back, user)] \a [back] on [t_his] back.\n"
|
|
||||||
|
|
||||||
//Hands
|
//Hands
|
||||||
for(var/obj/item/I in held_items)
|
for(var/obj/item/I in held_items)
|
||||||
if(!(I.flags_1 & ABSTRACT_1))
|
if(!(I.flags_1 & ABSTRACT_1))
|
||||||
if(I.blood_DNA)
|
msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] holding [icon2html(I, user)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
|
|
||||||
|
|
||||||
|
GET_COMPONENT(FR, /datum/component/forensics)
|
||||||
//gloves
|
//gloves
|
||||||
if(gloves && !(slot_gloves in obscured))
|
if(gloves && !(slot_gloves in obscured))
|
||||||
if(gloves.blood_DNA)
|
msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [icon2html(gloves, user)] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!</span>\n"
|
else if(FR && length(FR.blood_DNA))
|
||||||
else
|
|
||||||
msg += "[t_He] [t_has] [icon2html(gloves, user)] \a [gloves] on [t_his] hands.\n"
|
|
||||||
else if(blood_DNA)
|
|
||||||
var/hand_number = get_num_arms()
|
var/hand_number = get_num_arms()
|
||||||
if(hand_number)
|
if(hand_number)
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!</span>\n"
|
msg += "<span class='warning'>[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!</span>\n"
|
||||||
@@ -84,42 +60,30 @@
|
|||||||
|
|
||||||
//belt
|
//belt
|
||||||
if(belt)
|
if(belt)
|
||||||
if(belt.blood_DNA)
|
msg += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [icon2html(belt, user)] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_has] [icon2html(belt, user)] \a [belt] about [t_his] waist.\n"
|
|
||||||
|
|
||||||
//shoes
|
//shoes
|
||||||
if(shoes && !(slot_shoes in obscured))
|
if(shoes && !(slot_shoes in obscured))
|
||||||
if(shoes.blood_DNA)
|
msg += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_is] wearing [icon2html(shoes, user)] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(shoes, user)] \a [shoes] on [t_his] feet.\n"
|
|
||||||
|
|
||||||
//mask
|
//mask
|
||||||
if(wear_mask && !(slot_wear_mask in obscured))
|
if(wear_mask && !(slot_wear_mask in obscured))
|
||||||
if(wear_mask.blood_DNA)
|
msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [icon2html(wear_mask, user)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_has] [icon2html(wear_mask, user)] \a [wear_mask] on [t_his] face.\n"
|
|
||||||
|
|
||||||
if (wear_neck && !(slot_neck in obscured))
|
if (wear_neck && !(slot_neck in obscured))
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(wear_neck, user)] \a [src.wear_neck] around [t_his] neck.\n"
|
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
|
||||||
|
|
||||||
//eyes
|
//eyes
|
||||||
if(glasses && !(slot_glasses in obscured))
|
if(glasses && !(slot_glasses in obscured))
|
||||||
if(glasses.blood_DNA)
|
msg += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes.\n"
|
||||||
msg += "<span class='warning'>[t_He] [t_has] [icon2html(glasses, user)] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "[t_He] [t_has] [icon2html(glasses, user)] \a [glasses] covering [t_his] eyes.\n"
|
|
||||||
|
|
||||||
//ears
|
//ears
|
||||||
if(ears && !(slot_ears in obscured))
|
if(ears && !(slot_ears in obscured))
|
||||||
msg += "[t_He] [t_has] [icon2html(ears, user)] \a [ears] on [t_his] ears.\n"
|
msg += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears.\n"
|
||||||
|
|
||||||
//ID
|
//ID
|
||||||
if(wear_id)
|
if(wear_id)
|
||||||
msg += "[t_He] [t_is] wearing [icon2html(wear_id, user)] \a [wear_id].\n"
|
msg += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)].\n"
|
||||||
|
|
||||||
//Jitters
|
//Jitters
|
||||||
switch(jitteriness)
|
switch(jitteriness)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
create_internal_organs() //most of it is done in set_species now, this is only for parent call
|
create_internal_organs() //most of it is done in set_species now, this is only for parent call
|
||||||
|
|
||||||
handcrafting = new()
|
handcrafting = new()
|
||||||
|
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
|
||||||
|
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
@@ -678,19 +679,18 @@
|
|||||||
if(..())
|
if(..())
|
||||||
dropItemToGround(I)
|
dropItemToGround(I)
|
||||||
|
|
||||||
/mob/living/carbon/human/clean_blood()
|
/mob/living/carbon/human/proc/clean_blood(strength)
|
||||||
var/mob/living/carbon/human/H = src
|
if(strength < CLEAN_STRENGTH_BLOOD)
|
||||||
if(H.gloves)
|
return
|
||||||
if(H.gloves.clean_blood())
|
if(gloves)
|
||||||
H.update_inv_gloves()
|
if(gloves.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||||
|
update_inv_gloves()
|
||||||
else
|
else
|
||||||
..() // Clear the Blood_DNA list
|
if(bloody_hands)
|
||||||
if(H.bloody_hands)
|
bloody_hands = 0
|
||||||
H.bloody_hands = 0
|
update_inv_gloves()
|
||||||
H.update_inv_gloves()
|
|
||||||
update_icons() //apply the now updated overlays to the mob
|
update_icons() //apply the now updated overlays to the mob
|
||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/wash_cream()
|
/mob/living/carbon/human/wash_cream()
|
||||||
if(creamed) //clean both to prevent a rare bug
|
if(creamed) //clean both to prevent a rare bug
|
||||||
cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard"))
|
cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard"))
|
||||||
|
|||||||
@@ -51,8 +51,7 @@
|
|||||||
FP.blood_state = S.blood_state
|
FP.blood_state = S.blood_state
|
||||||
FP.entered_dirs |= dir
|
FP.entered_dirs |= dir
|
||||||
FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
|
FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
|
||||||
if(S.blood_DNA && S.blood_DNA.len)
|
FP.add_blood_DNA(S.return_blood_DNA())
|
||||||
FP.transfer_blood_dna(S.blood_DNA)
|
|
||||||
FP.update_icon()
|
FP.update_icon()
|
||||||
update_inv_shoes()
|
update_inv_shoes()
|
||||||
//End bloody footprints
|
//End bloody footprints
|
||||||
|
|||||||
@@ -176,7 +176,8 @@ There are several things that need to be remembered:
|
|||||||
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves]
|
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves]
|
||||||
inv.update_icon()
|
inv.update_icon()
|
||||||
|
|
||||||
if(!gloves && blood_DNA)
|
GET_COMPONENT(FR, /datum/component/forensics)
|
||||||
|
if(!gloves && FR && length(FR.blood_DNA))
|
||||||
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
|
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
|
||||||
if(get_num_arms() < 2)
|
if(get_num_arms() < 2)
|
||||||
if(has_left_hand())
|
if(has_left_hand())
|
||||||
|
|||||||
@@ -472,8 +472,7 @@
|
|||||||
if(isturf(next))
|
if(isturf(next))
|
||||||
if(bloodiness)
|
if(bloodiness)
|
||||||
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
|
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
|
||||||
if(blood_DNA && blood_DNA.len)
|
B.add_blood_DNA(return_blood_DNA())
|
||||||
B.blood_DNA |= blood_DNA.Copy()
|
|
||||||
var/newdir = get_dir(next, loc)
|
var/newdir = get_dir(next, loc)
|
||||||
if(newdir == dir)
|
if(newdir == dir)
|
||||||
B.setDir(newdir)
|
B.setDir(newdir)
|
||||||
@@ -655,8 +654,7 @@
|
|||||||
T.add_mob_blood(H)
|
T.add_mob_blood(H)
|
||||||
|
|
||||||
var/list/blood_dna = H.get_blood_dna_list()
|
var/list/blood_dna = H.get_blood_dna_list()
|
||||||
if(blood_dna)
|
add_blood_DNA(blood_dna)
|
||||||
transfer_blood_dna(blood_dna)
|
|
||||||
bloodiness += 4
|
bloodiness += 4
|
||||||
|
|
||||||
// player on mulebot attempted to move
|
// player on mulebot attempted to move
|
||||||
|
|||||||
@@ -177,24 +177,15 @@
|
|||||||
//Hands
|
//Hands
|
||||||
for(var/obj/item/I in held_items)
|
for(var/obj/item/I in held_items)
|
||||||
if(!(I.flags_1 & ABSTRACT_1))
|
if(!(I.flags_1 & ABSTRACT_1))
|
||||||
if(I.blood_DNA)
|
msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
||||||
msg += "<span class='warning'>It has [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "It has [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
|
||||||
|
|
||||||
//Internal storage
|
//Internal storage
|
||||||
if(internal_storage && !(internal_storage.flags_1&ABSTRACT_1))
|
if(internal_storage && !(internal_storage.flags_1&ABSTRACT_1))
|
||||||
if(internal_storage.blood_DNA)
|
msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n"
|
||||||
msg += "<span class='warning'>It is holding [icon2html(internal_storage, user)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "It is holding [icon2html(internal_storage, user)] \a [internal_storage] in its internal storage.\n"
|
|
||||||
|
|
||||||
//Cosmetic hat - provides no function other than looks
|
//Cosmetic hat - provides no function other than looks
|
||||||
if(head && !(head.flags_1&ABSTRACT_1))
|
if(head && !(head.flags_1&ABSTRACT_1))
|
||||||
if(head.blood_DNA)
|
msg += "It is wearing [head.get_examine_string(user)] on its head.\n"
|
||||||
msg += "<span class='warning'>It is wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "It is wearing [icon2html(head, user)] \a [head] on its head.\n"
|
|
||||||
|
|
||||||
//Braindead
|
//Braindead
|
||||||
if(!client && stat != DEAD)
|
if(!client && stat != DEAD)
|
||||||
|
|||||||
@@ -31,16 +31,9 @@
|
|||||||
|
|
||||||
for(var/obj/item/I in held_items)
|
for(var/obj/item/I in held_items)
|
||||||
if(!(I.flags_1 & ABSTRACT_1))
|
if(!(I.flags_1 & ABSTRACT_1))
|
||||||
if(I.blood_DNA)
|
msg += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
||||||
msg += "<span class='warning'>It has [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "It has [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
|
||||||
|
|
||||||
if(internal_storage && !(internal_storage.flags_1&ABSTRACT_1))
|
if(internal_storage && !(internal_storage.flags_1&ABSTRACT_1))
|
||||||
if(internal_storage.blood_DNA)
|
msg += "It is holding [internal_storage.get_examine_string(user)] in its internal storage.\n"
|
||||||
msg += "<span class='warning'>It is holding [icon2html(internal_storage, user)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!</span>\n"
|
|
||||||
else
|
|
||||||
msg += "It is holding [icon2html(internal_storage, user)] \a [internal_storage] in its internal storage.\n"
|
|
||||||
msg += "*---------*</span>"
|
msg += "*---------*</span>"
|
||||||
to_chat(user, msg)
|
to_chat(user, msg)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -171,6 +171,6 @@
|
|||||||
qdel(target)
|
qdel(target)
|
||||||
return TRUE
|
return TRUE
|
||||||
var/atom/movable/M = target
|
var/atom/movable/M = target
|
||||||
M.clean_blood()
|
M.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
visible_message("[src] polishes \the [target].")
|
visible_message("[src] polishes \the [target].")
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|||||||
@@ -40,26 +40,26 @@
|
|||||||
|
|
||||||
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
|
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
|
||||||
if(!candrain || draining)
|
if(!candrain || draining)
|
||||||
return 0
|
return FALSE
|
||||||
if(!ishuman(loc))
|
if(!ishuman(loc))
|
||||||
return 0 //Only works while worn
|
return FALSE //Only works while worn
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = loc
|
var/mob/living/carbon/human/H = loc
|
||||||
|
|
||||||
var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit
|
var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit
|
||||||
if(!istype(suit))
|
if(!istype(suit))
|
||||||
return 0
|
return FALSE
|
||||||
if(isturf(A))
|
if(isturf(A))
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
if(!proximity)
|
if(!proximity)
|
||||||
return 0
|
return FALSE
|
||||||
|
|
||||||
A.add_fingerprint(H)
|
A.add_fingerprint(H)
|
||||||
|
|
||||||
draining = 1
|
draining = TRUE
|
||||||
. = A.ninjadrain_act(suit,H,src)
|
. = A.ninjadrain_act(suit,H,src)
|
||||||
draining = 0
|
draining = FALSE
|
||||||
|
|
||||||
if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
|
if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
|
||||||
if(.)
|
if(.)
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
else
|
else
|
||||||
to_chat(H, "<span class='danger'>\The [A] has run dry of energy, you must find another source!</span>")
|
to_chat(H, "<span class='danger'>\The [A] has run dry of energy, you must find another source!</span>")
|
||||||
else
|
else
|
||||||
. = 0 //as to not cancel attack_hand()
|
. = FALSE //as to not cancel attack_hand()
|
||||||
|
|
||||||
|
|
||||||
/obj/item/clothing/gloves/space_ninja/proc/toggledrain()
|
/obj/item/clothing/gloves/space_ninja/proc/toggledrain()
|
||||||
|
|||||||
@@ -665,7 +665,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
|||||||
|
|
||||||
NC.d1 = 0
|
NC.d1 = 0
|
||||||
NC.d2 = fdirn
|
NC.d2 = fdirn
|
||||||
NC.add_fingerprint()
|
NC.add_fingerprint(user)
|
||||||
NC.update_icon()
|
NC.update_icon()
|
||||||
|
|
||||||
//create a new powernet with the cable, if needed it will be merged later
|
//create a new powernet with the cable, if needed it will be merged later
|
||||||
@@ -716,7 +716,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
|
|||||||
//updates the stored cable coil
|
//updates the stored cable coil
|
||||||
C.update_stored(2, item_color)
|
C.update_stored(2, item_color)
|
||||||
|
|
||||||
C.add_fingerprint()
|
C.add_fingerprint(user)
|
||||||
C.update_icon()
|
C.update_icon()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -164,7 +164,7 @@
|
|||||||
if(iscarbon(user))
|
if(iscarbon(user))
|
||||||
var/mob/living/carbon/C = user
|
var/mob/living/carbon/C = user
|
||||||
user_dna = C.dna
|
user_dna = C.dna
|
||||||
B.add_blood(user_dna)
|
B.add_blood_DNA(user_dna)
|
||||||
var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna))
|
var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna))
|
||||||
B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner)
|
B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner)
|
||||||
return(BRUTELOSS)
|
return(BRUTELOSS)
|
||||||
|
|||||||
@@ -79,8 +79,7 @@
|
|||||||
if(!B)
|
if(!B)
|
||||||
B = new(T)
|
B = new(T)
|
||||||
if(data["blood_DNA"])
|
if(data["blood_DNA"])
|
||||||
B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
|
B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
||||||
|
|
||||||
|
|
||||||
/datum/reagent/liquidgibs
|
/datum/reagent/liquidgibs
|
||||||
name = "Liquid gibs"
|
name = "Liquid gibs"
|
||||||
@@ -941,12 +940,12 @@
|
|||||||
else
|
else
|
||||||
if(O)
|
if(O)
|
||||||
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||||
O.clean_blood()
|
O.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
|
|
||||||
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
|
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
|
||||||
if(reac_volume >= 1)
|
if(reac_volume >= 1)
|
||||||
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||||
T.clean_blood()
|
T.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
for(var/obj/effect/decal/cleanable/C in T)
|
for(var/obj/effect/decal/cleanable/C in T)
|
||||||
qdel(C)
|
qdel(C)
|
||||||
|
|
||||||
@@ -964,26 +963,26 @@
|
|||||||
H.lip_style = null
|
H.lip_style = null
|
||||||
H.update_body()
|
H.update_body()
|
||||||
for(var/obj/item/I in C.held_items)
|
for(var/obj/item/I in C.held_items)
|
||||||
I.clean_blood()
|
I.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
if(C.wear_mask)
|
if(C.wear_mask)
|
||||||
if(C.wear_mask.clean_blood())
|
if(C.wear_mask.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||||
C.update_inv_wear_mask()
|
C.update_inv_wear_mask()
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = C
|
var/mob/living/carbon/human/H = C
|
||||||
if(H.head)
|
if(H.head)
|
||||||
if(H.head.clean_blood())
|
if(H.head.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||||
H.update_inv_head()
|
H.update_inv_head()
|
||||||
if(H.wear_suit)
|
if(H.wear_suit)
|
||||||
if(H.wear_suit.clean_blood())
|
if(H.wear_suit.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||||
H.update_inv_wear_suit()
|
H.update_inv_wear_suit()
|
||||||
else if(H.w_uniform)
|
else if(H.w_uniform)
|
||||||
if(H.w_uniform.clean_blood())
|
if(H.w_uniform.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||||
H.update_inv_w_uniform()
|
H.update_inv_w_uniform()
|
||||||
if(H.shoes)
|
if(H.shoes)
|
||||||
if(H.shoes.clean_blood())
|
if(H.shoes.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
|
||||||
H.update_inv_shoes()
|
H.update_inv_shoes()
|
||||||
H.wash_cream()
|
H.wash_cream()
|
||||||
M.clean_blood()
|
M.SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||||
|
|
||||||
/datum/reagent/space_cleaner/ez_clean
|
/datum/reagent/space_cleaner/ez_clean
|
||||||
name = "EZ Clean"
|
name = "EZ Clean"
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
if(..(user))
|
if(..(user))
|
||||||
return
|
return
|
||||||
add_fingerprint(usr)
|
add_fingerprint(usr)
|
||||||
|
|
||||||
var/list/options = params2list(possible_destinations)
|
var/list/options = params2list(possible_destinations)
|
||||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||||
var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]<br><br>"
|
var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]<br><br>"
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
#include "code\__DEFINES\events.dm"
|
#include "code\__DEFINES\events.dm"
|
||||||
#include "code\__DEFINES\flags.dm"
|
#include "code\__DEFINES\flags.dm"
|
||||||
#include "code\__DEFINES\food.dm"
|
#include "code\__DEFINES\food.dm"
|
||||||
|
#include "code\__DEFINES\forensics.dm"
|
||||||
#include "code\__DEFINES\hud.dm"
|
#include "code\__DEFINES\hud.dm"
|
||||||
#include "code\__DEFINES\integrated_electronics.dm"
|
#include "code\__DEFINES\integrated_electronics.dm"
|
||||||
#include "code\__DEFINES\inventory.dm"
|
#include "code\__DEFINES\inventory.dm"
|
||||||
@@ -311,6 +312,7 @@
|
|||||||
#include "code\datums\components\chasm.dm"
|
#include "code\datums\components\chasm.dm"
|
||||||
#include "code\datums\components\cleaning.dm"
|
#include "code\datums\components\cleaning.dm"
|
||||||
#include "code\datums\components\decal.dm"
|
#include "code\datums\components\decal.dm"
|
||||||
|
#include "code\datums\components\forensics.dm"
|
||||||
#include "code\datums\components\infective.dm"
|
#include "code\datums\components\infective.dm"
|
||||||
#include "code\datums\components\jousting.dm"
|
#include "code\datums\components\jousting.dm"
|
||||||
#include "code\datums\components\knockoff.dm"
|
#include "code\datums\components\knockoff.dm"
|
||||||
@@ -325,6 +327,7 @@
|
|||||||
#include "code\datums\components\spooky.dm"
|
#include "code\datums\components\spooky.dm"
|
||||||
#include "code\datums\components\squeek.dm"
|
#include "code\datums\components\squeek.dm"
|
||||||
#include "code\datums\components\thermite.dm"
|
#include "code\datums\components\thermite.dm"
|
||||||
|
#include "code\datums\components\decals\blood.dm"
|
||||||
#include "code\datums\diseases\_disease.dm"
|
#include "code\datums\diseases\_disease.dm"
|
||||||
#include "code\datums\diseases\_MobProcs.dm"
|
#include "code\datums\diseases\_MobProcs.dm"
|
||||||
#include "code\datums\diseases\anxiety.dm"
|
#include "code\datums\diseases\anxiety.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user