u h g. I hate this
This commit is contained in:
@@ -15,21 +15,21 @@
|
||||
_icon_state = "itemblood"
|
||||
var/icon = initial(I.icon)
|
||||
var/icon_state = initial(I.icon_state)
|
||||
var/color = initial(I.blood_DNA_to_color(I.blood_mix_types))
|
||||
if(!icon || !icon_state)
|
||||
// It's something which takes on the look of other items, probably
|
||||
icon = I.icon
|
||||
icon_state = I.icon_state
|
||||
var/static/list/blood_splatter_appearances = list()
|
||||
//try to find a pre-processed blood-splatter. otherwise, make a new one
|
||||
var/index = "[REF(icon)]-[icon_state]"
|
||||
var/index = "[REF(icon)]-[icon_state]-[color]"
|
||||
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
|
||||
GET_COMPONENT(D, /datum/component/forensics)
|
||||
blood_splatter_icon.Blend(D.blood_DNA_to_color(), ICON_MULTIPLY)
|
||||
blood_splatter_icon.color = I.blood_DNA_to_color(I.blood_mix_types) //Colors it based upon blood color mix
|
||||
blood_splatter_appearances[index] = pic
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -4,25 +4,26 @@
|
||||
var/list/hiddenprints //assoc ckey = realname/gloves/ckey
|
||||
var/list/blood_DNA //assoc dna = bloodtype
|
||||
var/list/fibers //assoc print = print
|
||||
var/list/blood_mix_types // data("[blood_type]" = sting list
|
||||
|
||||
/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
|
||||
blood_mix_types = blood_mix_types | F.blood_mix_types
|
||||
check_blood()
|
||||
blood_DNA_to_color()
|
||||
return ..()
|
||||
|
||||
/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers)
|
||||
/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers, new_blood_mix_types)
|
||||
if(!isatom(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
fingerprints = new_fingerprints
|
||||
hiddenprints = new_hiddenprints
|
||||
blood_DNA = new_blood_DNA
|
||||
fibers = new_fibers
|
||||
blood_mix_types = new_blood_mix_types
|
||||
check_blood()
|
||||
blood_DNA_to_color()
|
||||
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act)
|
||||
|
||||
/datum/component/forensics/proc/wipe_fingerprints()
|
||||
@@ -34,6 +35,7 @@
|
||||
|
||||
/datum/component/forensics/proc/wipe_blood_DNA()
|
||||
blood_DNA = null
|
||||
blood_mix_types = null
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/wipe_fibers()
|
||||
@@ -149,35 +151,61 @@
|
||||
for(var/i in dna)
|
||||
blood_DNA[i] = dna[i]
|
||||
check_blood()
|
||||
blood_DNA_to_color()
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/check_blood()
|
||||
if(!isitem(parent))
|
||||
if(!isitem(parent) || !ismob(parent))
|
||||
return
|
||||
if(!length(blood_DNA))
|
||||
return
|
||||
|
||||
/datum/component/forensics/proc/blood_DNA_to_color()
|
||||
var/list/colors = list()//first we make a list of all bloodtypes present
|
||||
for(var/bloop in blood_DNA)
|
||||
if(colors[blood_DNA[bloop]])
|
||||
colors[blood_DNA[bloop]]++
|
||||
/datum/component/forensics/proc/add_blood_list_check(list/_blood_mix_types)
|
||||
if(!length(_blood_mix_types))
|
||||
return
|
||||
LAZYINITLIST(blood_mix_types)
|
||||
for(var/i in _blood_mix_types) //We use an associative list, because all the other cool kids are doing it
|
||||
blood_mix_types[i] = i
|
||||
return TRUE
|
||||
|
||||
/datum/component/forensics/proc/blood_list_checks(Atom/A, var/blood_type) //This is a messy attempt at trying to reduce lists of items and mobs with blood colors on them
|
||||
if(blood_type in GLOB.regular_bloods)
|
||||
blood_type = "A+" //generic so we don't have 8 different types of human blood
|
||||
if(is_cleanable(src))
|
||||
var/obj/effect/decal/cleanable/CL = src
|
||||
if(blood_type in CL.blood_mix_types)
|
||||
return
|
||||
else
|
||||
colors[blood_DNA[bloop]] = 1
|
||||
LAZYSET(blood_type,CL.blood_mix_types, CL.blood_mix_types)
|
||||
CL.blood_color = blood_DNA_to_color(CL.blood_mix_types)
|
||||
else if(isitem(src))
|
||||
var/obj/item/I = src
|
||||
if(blood_type in I.blood_mix_types)
|
||||
return
|
||||
else
|
||||
LAZYSET(blood_type,I.blood_mix_types, I.blood_mix_types)
|
||||
I.blood_color = blood_DNA_to_color(I.blood_mix_types)
|
||||
else if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
if(blood_type in C.blood_mix_types)
|
||||
return
|
||||
else
|
||||
LAZYSET(blood_type,C.blood_mix_types, C.blood_mix_types)
|
||||
C.blood_color = blood_DNA_to_color(C.blood_mix_types)
|
||||
return TRUE
|
||||
|
||||
var/final_rgb = "#940000"
|
||||
|
||||
if(colors.len)
|
||||
/datum/component/forensics/proc/blood_DNA_to_color(list/bloods)
|
||||
var/final_rgb = "#940000" //We default to red just in case
|
||||
if(bloods.len)
|
||||
var/sum = 0 //this is all shitcode, but it works; trust me
|
||||
final_rgb = bloodtype_to_color(colors[1])
|
||||
sum = colors[colors[1]]
|
||||
if(colors.len > 1)
|
||||
final_rgb = bloodtype_to_color(bloods[1])
|
||||
sum = bloods[bloods[1]]
|
||||
if(bloods.len > 1)
|
||||
var/i = 2
|
||||
while(i <= colors.len)
|
||||
var/tmp = colors[colors[i]]
|
||||
final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum))
|
||||
while(i <= bloods.len)
|
||||
var/tmp = bloods[bloods[i]]
|
||||
final_rgb = BlendRGB(final_rgb, bloodtype_to_color(bloods[i]), tmp/(tmp+sum))
|
||||
sum += tmp
|
||||
i++
|
||||
|
||||
else
|
||||
final_rgb = BlendRGB(final_rgb, bloodtype_to_color(bloods))
|
||||
return final_rgb
|
||||
|
||||
Reference in New Issue
Block a user