diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 426d23b4ab..36e363df25 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -317,7 +317,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
/obj/effect/meteor/meaty/xeno/ram_turf(turf/T)
if(!isspaceturf(T))
- new /obj/effect/decal/cleanable/xenoblood(T)
+ new /obj/effect/decal/cleanable/blood/xenoblood(T)
//Station buster Tunguska
/obj/effect/meteor/tunguska
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index aa9a4757c8..6dee6b5e7b 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -3,7 +3,6 @@
/obj/effect/decal/cleanable/blood/xenoblood
name = "xeno blood"
desc = "It's green and acidic. It looks like... blood?"
- icon = 'icons/effects/blood.dmi'
blood_state = BLOOD_STATE_XENO
color = BLOOD_COLOR_XENO
@@ -15,19 +14,16 @@
name = "xeno gibs"
desc = "Gnarly..."
-/obj/effect/decal/cleanable/blood/xenoblood/xgibs/proc/streak(list/directions)
+/obj/effect/decal/cleanable/blood/xenoblood/gibs/proc/streak(list/directions)
set waitfor = 0
var/direction = pick(directions)
for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++)
sleep(2)
if(i > 0)
- new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc)
+ new /obj/effect/decal/cleanable/blood/splatter(loc)
if(!step_to(src, get_step(src, direction), 0))
break
-/obj/effect/decal/cleanable/blood/xenoblood/xgibs/ex_act()
- return
-
/obj/effect/decal/cleanable/blood/xenoblood/gibs/up
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index 6996e107ba..2c4575f247 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -46,12 +46,11 @@
/obj/effect/decal/cleanable/blood/gibs
name = "gibs"
desc = "They look bloody and gruesome."
- icon = 'icons/effects/blood.dmi'
icon_state = "gibbl5"
layer = LOW_OBJ_LAYER
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
mergeable_decal = FALSE
- var/fleshcolor = "#FFFFFF"
+ var/fleshcolor
/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -61,18 +60,21 @@
return
/obj/effect/decal/cleanable/blood/gibs/update_icon()
- var/image/giblets = new(base_icon, "[icon_state]_flesh", dir)
- if(!fleshcolor || fleshcolor == "rainbow")
- fleshcolor = "#[skintone2hex[random_skin_tone()]]"
+ var/generic_skin = random_skin_tone()
+ var/ethnicity = "#[skintone2hex(generic_skin)]"
+
+ var/image/giblets = image(icon, "[icon_state]_flesh", dir)
+ if(!fleshcolor)
+ fleshcolor = ethnicity
giblets.color = fleshcolor
- var/icon/blood = new(base_icon,"[icon_state]",dir)
- if(basecolor == "rainbow") basecolor = "#[skintone2hex[random_skin_tone()]]"
- blood.Blend(basecolor,ICON_MULTIPLY)
+ for(var/datum/reagent/blood/B in reagents)
+ var/image/blood/goop = image(icon,"[icon_state]",dir)
+ goop.Blend(B.color,ICON_MULTIPLY)
- icon = blood
+ icon = goop
overlays.Cut()
- overlays += giblets
+ add_overlay(giblets)
/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L)
if(istype(L) && has_gravity(loc))
diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm
index e99a2fcbc6..bc62ae95c0 100644
--- a/code/game/objects/effects/spawners/gibspawner.dm
+++ b/code/game/objects/effects/spawners/gibspawner.dm
@@ -5,6 +5,8 @@
var/list/gibtypes = list() //typepaths of the gib decals to spawn
var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn.
var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards.
+ var/fleshcolor
+ var/bloodcolor
/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA, list/datum/disease/diseases)
. = ..()
@@ -13,6 +15,9 @@
to_chat(world, "Gib list length mismatch!")
return
+ if(fleshcolor) src.fleshcolor = fleshcolor
+ if(bloodcolor) src.bloodcolor = bloodcolor
+
var/obj/effect/decal/cleanable/blood/gibs/gib = null
if(sparks)
@@ -25,13 +30,24 @@
for(var/j = 1, j<= gibamounts[i], j++)
var/gibType = gibtypes[i]
gib = new gibType(loc, diseases)
+
if(iscarbon(loc))
var/mob/living/carbon/digester = loc
digester.stomach_contents += gib
if(MobDNA)
+ var/list/blood_dna = MobDNA.get_blood_dna_list()
+ gib.add_blood_DNA(blood_dna)
- else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
+ // Apply human species colouration to masks.
+ if(fleshcolor)
+ gib.fleshcolor = fleshcolor
+ if(bloodcolor)
+ gib.color = bloodcolor
+
+ gib.update_icon()
+
+ if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
gib.add_blood_DNA(list("Non-human DNA" = "A+"))
var/list/directions = gibdirections[i]
if(isturf(loc))
@@ -72,7 +88,7 @@
/obj/effect/gibspawner/xeno
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up, /obj/effect/decal/cleanable/xenoblood/xgibs/down, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/body, /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /obj/effect/decal/cleanable/xenoblood/xgibs/core)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/xenoblood/gibs/up, /obj/effect/decal/cleanable/blood/xenoblood/gibs/down, /obj/effect/decal/cleanable/blood/xenoblood/gibs, /obj/effect/decal/cleanable/blood/xenoblood/gibs, /obj/effect/decal/cleanable/blood/xenoblood/gibs/body, /obj/effect/decal/cleanable/blood/xenoblood/gibs/limb, /obj/effect/decal/cleanable/blood/xenoblood/gibs/core)
gibamounts = list(1,1,1,1,1,1,1)
/obj/effect/gibspawner/xeno/Initialize()
@@ -82,7 +98,7 @@
/obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso).
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/xenoblood/gibs, /obj/effect/decal/cleanable/blood/xenoblood/gibs/core, /obj/effect/decal/cleanable/blood/xenoblood/gibs, /obj/effect/decal/cleanable/blood/xenoblood/gibs/core, /obj/effect/decal/cleanable/blood/xenoblood/gibs, /obj/effect/decal/cleanable/blood/xenoblood/gibs/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
@@ -92,7 +108,7 @@
. = ..()
/obj/effect/gibspawner/larva
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/xenoblood/gibs/larva, /obj/effect/decal/cleanable/blood/xenoblood/gibs/larva, /obj/effect/decal/cleanable/blood/xenoblood/gibs/larva/body, /obj/effect/decal/cleanable/blood/xenoblood/gibs/larva/body)
gibamounts = list(1, 1, 1, 1)
/obj/effect/gibspawner/larva/Initialize()
@@ -101,7 +117,7 @@
. = ..()
/obj/effect/gibspawner/larvabodypartless
- gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva)
+ gibtypes = list(/obj/effect/decal/cleanable/blood/xenoblood/gibs/larva, /obj/effect/decal/cleanable/blood/xenoblood/gibs/larva, /obj/effect/decal/cleanable/blood/xenoblood/gibs/larva)
gibamounts = list(1, 1, 1)
/obj/effect/gibspawner/larvabodypartless/Initialize()
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index 325683df6e..e62e9160aa 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -190,6 +190,7 @@
if(!suiciding)
blood_data["cloneable"] = 1
blood_data["blood_type"] = copytext(dna.blood_type,1,0)
+ blood_data["bloodcolor"] = blood_id.color
blood_data["gender"] = gender
blood_data["real_name"] = real_name
blood_data["features"] = dna.features
@@ -289,7 +290,7 @@
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip)
if(!T)
T = get_turf(src)
- var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents
+ var/obj/effect/decal/cleanable/blood/xenoblood/B = locate() in T.contents
if(!B)
B = new(T)
B.add_blood_DNA(list("UNKNOWN DNA" = "X*"))
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 2a5fdeaa33..3fec41ad58 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -144,7 +144,7 @@
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
//Makes the mob have the color of the blood pool it came out of
var/newcolor = rgb(149, 10, 10)
- if(istype(B, /obj/effect/decal/cleanable/xenoblood))
+ if(istype(B, /obj/effect/decal/cleanable/blood/xenoblood))
newcolor = rgb(43, 186, 0)
add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
// but only for a few seconds
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 10fddfcb20..5ebfaf663b 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -20,7 +20,7 @@
var/heat_protection = 0.5
var/leaping = 0
- gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs
+ gib_type = /obj/effect/decal/cleanable/blood/xenoblood/gibs
unique_name = 1
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index bc8dd0c3ab..d576ebddbf 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -155,7 +155,7 @@
else
shuffle = TRUE //Shuffle the list the next time we scan so we dont both go the same way.
path = list()
-
+
if(!path || path.len == 0) //No path, need a new one
//Try to produce a path to the target, and ignore airlocks to which it has access.
path = get_path_to(src, target.loc, /turf/proc/Distance_cardinal, 0, 30, id=access_card)
@@ -191,7 +191,7 @@
)
if(blood)
- target_types += /obj/effect/decal/cleanable/xenoblood
+ target_types += /obj/effect/decal/cleanable/blood/xenoblood
target_types += /obj/effect/decal/cleanable/blood
target_types += /obj/effect/decal/cleanable/trail_holder
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index c2d0a214b4..c4ef1253f7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -39,7 +39,7 @@
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
- wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/)
+ wanted_objects = list(/obj/effect/decal/cleanable/blood/xenoblood/gibs, /obj/effect/decal/cleanable/blood/gibs/)
var/obj/item/udder/gutlunch/udder = null
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index a4a0bed102..ec7cd265f1 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,8 +1,8 @@
/datum/reagent/blood
- data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_color"=color, "blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"bloodcolor"= BLOOD_COLOR_HUMAN, "blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Blood"
id = "blood"
- color = "#C80000" // rgb: 200, 0, 0
+ color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0
metabolization_rate = 5 //fast rate so it disappears fast.
taste_description = "iron"
taste_mult = 1.3
@@ -87,13 +87,19 @@
B = new(T)
if(data["blood_DNA"])
B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+ B.color = data["bloodcolor"]
/datum/reagent/blood/synthetics
- data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_color"=color, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"bloodcolor"=BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Synthetic Blood"
id = "syntheticblood"
- color = "#0b0730" // rgb: 11, 7, 48
+ color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48
+/datum/reagent/blood/xenomorph
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"bloodcolor"=BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Xenomorph Blood"
+ id = "xenoblood"
+ color = BLOOD_COLOR_XENO // greenish yellow ooze
/datum/reagent/liquidgibs
name = "Liquid gibs"