THE "GORY" UPDATE (#27070)

* lots of shit

* mario's mystery meat

* haha, kill all donors

* DNAlessSplatters

* hehehhehehhh....blud

* can you feel my sanity slipping away?

* more fixes and removed mop changes (other than the overlay)

* WAKE ME UP

* oh yeah I removed that arg

* fixes

* DERP

* Oh right that too

* Update code/game/objects/items/weapons/melee/energy.dm

Co-authored-by: DamianX <DamianX@users.noreply.github.com>

* Update code/game/objects/items/weapons/melee/energy.dm

Co-authored-by: DamianX <DamianX@users.noreply.github.com>

Co-authored-by: DamianX <DamianX@users.noreply.github.com>
This commit is contained in:
DeityLink
2020-07-23 11:12:26 +02:00
committed by GitHub
parent 6bcd4fc98e
commit 0289efc8b4
54 changed files with 439 additions and 181 deletions

View File

@@ -1568,8 +1568,14 @@ var/proccalls = 1
#define HOLOMAP_DRAW_PATH 3
#define HOLOMAP_DRAW_HALLWAY 4
#define HUMAN_DNA 1
#define XENO_DNA 2
#define DEFAULT_BLOOD "#A10808"
#define DEFAULT_FLESH "#FFC896"
#define ALIEN_BLOOD "#05EE05"
#define ALIEN_FLESH "#34334B"
#define ROBOT_OIL "#030303"
//Return values for /obj/machinery/proc/npc_tamper_act(mob/living/L)
#define NPC_TAMPER_ACT_FORGET 1 //Don't try to tamper with this again

View File

@@ -87,11 +87,16 @@ var/datum/subsystem/more_init/SSmore_init
for(var/brute = 1 to 3)
for(var/burn = 1 to 3)
var/damage_state = "[brute][burn]"
DI = icon('icons/mob/dam_human.dmi', "[damage_state]") // the damage icon for whole human
DI.Blend(icon('icons/mob/dam_mask.dmi', O.icon_name), ICON_MULTIPLY)
if(species_blood)
DI = icon('icons/mob/dam_human.dmi', "[brute]0-color")
DI.Blend(S.blood_color, ICON_MULTIPLY)
//testing("Completed [damage_state]/[O.icon_name]/[species_blood]")
var/icon/DI_burn = icon('icons/mob/dam_human.dmi', "0[burn]")//we don't want burns to blend with the species' blood color
DI.Blend(DI_burn, ICON_OVERLAY)
DI.Blend(icon('icons/mob/dam_mask.dmi', O.icon_name), ICON_MULTIPLY)
else
DI = icon('icons/mob/dam_human.dmi', "[damage_state]")
DI.Blend(icon('icons/mob/dam_mask.dmi', O.icon_name), ICON_MULTIPLY)
damage_icon_parts["[damage_state]/[O.icon_name]/[species_blood]"] = DI
spawn(1)
qdel(H)
qdel(H)

View File

@@ -358,7 +358,7 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc
//Is there blood on our hands?
var/mob/living/carbon/human/H_user = user
if (istype (H_user) && H_user.bloody_hands)
if (istype (H_user) && H_user.blood_DNA?.len)
data[BLOODCOST_TARGET_HANDS] = H_user
var/blood_gathered = min(amount_needed,H_user.bloody_hands)
data[BLOODCOST_AMOUNT_HANDS] = blood_gathered
@@ -593,7 +593,7 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc
switch(communion_data[BLOODCOST_RESULT])
if (BLOODCOST_TARGET_HANDS)
var/mob/living/carbon/human/HU = communion_data[BLOODCOST_USER]
blood.data["blood_colour"] = HU.hand_blood_color
blood.data["blood_colour"] = HU.bloody_hands_data["blood_colour"]
if (HU.blood_DNA && HU.blood_DNA.len)
var/blood_DNA = pick(HU.blood_DNA)
blood.data["blood_DNA"] = blood_DNA
@@ -642,8 +642,8 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc
if (BLOODCOST_TARGET_HANDS)
var/mob/living/carbon/human/H = user
blood = new()
blood.data["blood_colour"] = H.hand_blood_color
if (H.blood_DNA && H.blood_DNA.len)
blood.data["blood_colour"] = H.bloody_hands_data["blood_colour"]
if (H.blood_DNA?.len && H.bloody_hands > 0)
var/blood_DNA = pick(H.blood_DNA)
blood.data["blood_DNA"] = blood_DNA
blood.data["blood_type"] = H.blood_DNA[blood_DNA]

View File

@@ -668,8 +668,8 @@ its easier to just keep the beam vertical.
//returns 1 if made bloody, returns 0 otherwise
/atom/proc/add_blood(mob/living/carbon/human/M as mob)
.=1
/atom/proc/add_blood(var/mob/living/carbon/human/M)
.=TRUE
if(!M)//if the blood is of non-human source
if(!blood_DNA || !istype(blood_DNA, /list))
blood_DNA = list()
@@ -682,24 +682,29 @@ its easier to just keep the beam vertical.
M.dna = new /datum/dna(null)
M.dna.real_name = M.real_name
M.check_dna()
if (!( src.flags ) & FPRINT)
if (!( src.flags & FPRINT))
return FALSE
if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
blood_DNA = list()
blood_color = DEFAULT_BLOOD
if (M.species)
blood_color = M.species.blood_color
//adding blood to humans
else if (istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
//if this blood isn't already in the list, add it
if(blood_DNA[H.dna.unique_enzymes])
return FALSE //already bloodied with this blood. Cannot add more.
blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
H.update_inv_gloves() //handles bloody hands overlays and updating
had_blood = TRUE
return TRUE //we applied blood to the item
return
return TRUE
//this proc exists specifically for cases where the mob that originated the blood (aka the "donor") might not exist anymore, leading to bugs galore
/atom/proc/add_blood_from_data(var/list/blood_data)
if (!( istype(blood_data) ))
return FALSE
if (!( src.flags & FPRINT))
return FALSE
if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
blood_DNA = list()
blood_color = blood_data["blood_colour"]
return TRUE
/atom/proc/add_vomit_floor(mob/living/carbon/M, toxvomit = 0, active = 0, steal_reagents_from_mob = 1)
if( istype(src, /turf/simulated) )

View File

@@ -16,6 +16,13 @@
active_power_usage = 500
machine_flags = SCREWTOGGLE | CROWDESTROY | WRENCHMOVE | FIXED2WORK
var/list/allowed_victims = list(
/mob/living/carbon/human,
/mob/living/carbon/alien/humanoid,
/mob/living/carbon/monkey,
/mob/living/simple_animal/hostile/alien,
)
/********************************************************************
** Adding Stock Parts to VV so preconstructed shit has its candy **
********************************************************************/
@@ -104,7 +111,7 @@ obj/machinery/gibber/New()
if(src.occupant)
to_chat(user, "<span class='warning'>[src] is full! Empty it first.</span>")
return
if (!( istype(G, /obj/item/weapon/grab)) || !(istype(G.affecting, /mob/living/carbon/human)))
if (!( istype(G, /obj/item/weapon/grab)) || !(is_type_in_list(G.affecting, allowed_victims)))
to_chat(user, "<span class='warning'>This item is not suitable for [src]!</span>")
return
if(G.affecting.abiotic(1))
@@ -185,7 +192,7 @@ obj/machinery/gibber/New()
return
/obj/machinery/gibber/proc/startgibbing(mob/user as mob)
/obj/machinery/gibber/proc/startgibbing(var/mob/user)
if(src.operating)
return
if(!src.occupant)
@@ -206,10 +213,13 @@ obj/machinery/gibber/New()
var/totalslabs = src.occupant.size
var/obj/item/weapon/reagent_containers/food/snacks/meat/allmeat[totalslabs]
var/obj/effect/decal/cleanable/blood/gibs/allgibs[totalslabs]
playsound(src, 'sound/machines/blender.ogg', 50, 1)
for (var/i=1 to totalslabs)
//first we spawn the meat
var/obj/item/weapon/newmeat
if(istype(occupant.meat_type, /obj/item/weapon/reagent_containers))
newmeat = new occupant.meat_type(null, occupant)
newmeat = new occupant.meat_type(src, occupant)
newmeat.reagents.add_reagent (NUTRIMENT, sourcenutriment / totalslabs) // Thehehe. Fat guys go first
else
newmeat = new occupant.meat_type()
@@ -225,6 +235,17 @@ obj/machinery/gibber/New()
allmeat[i] = newmeat
//then we spawn the gib splatter
var/obj/effect/decal/cleanable/blood/gibs/newgib
if (isalien(occupant)||istype(occupant, /mob/living/simple_animal/hostile/alien))//alien get their own custom gibs
newgib = spawngib(/obj/effect/decal/cleanable/blood/gibs/xeno,src,ALIEN_FLESH,ALIEN_BLOOD,occupant.virus2,null)
else if (ishuman(occupant))
var/mob/living/carbon/human/H = occupant
newgib = spawngib(/obj/effect/decal/cleanable/blood/gibs,src,H.species.flesh_color,H.species.blood_color,H.virus2,H.dna)
else
newgib = spawngib(/obj/effect/decal/cleanable/blood/gibs,src,DEFAULT_FLESH,DEFAULT_BLOOD,occupant.virus2,occupant.dna)
allgibs[i] = newgib
src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by <B>[key_name(user)]</B>" //One shall not simply gib a mob unnoticed!
user.attack_log += "\[[time_stamp()]\] Gibbed <B>[key_name(src.occupant)]</B>"
log_attack("<B>[key_name(user)]</B> gibbed <B>[key_name(src.occupant)]</B>")
@@ -240,21 +261,18 @@ obj/machinery/gibber/New()
qdel(src.occupant)
src.occupant = null
spawn(src.gibtime)
var/no_more_gibs = FALSE
spawn(src.gibtime)//finally we throw both the meat and gibs in front of the gibber.
playsound(src, 'sound/effects/gib2.ogg', 50, 1)
operating = 0
for (var/i=1 to totalslabs)
var/obj/item/meatslab = allmeat[i]
var/obj/effect/decal/cleanable/blood/gibs/gib = allgibs[i]
var/turf/Tx = locate(src.x - i, src.y, src.z)
meatslab.forceMove(src.loc)
meatslab.throw_at(Tx,i,3)
if (!Tx.density)
if(!no_more_gibs)
new /obj/effect/decal/cleanable/blood/gibs(Tx, i)
else
no_more_gibs = TRUE
if(i == 1)
new /obj/effect/decal/cleanable/blood/gibs(get_turf(src), i)
meatslab.throw_at(Tx,i,1)
gib.anchored = FALSE
gib.forceMove(src.loc)
gib.throw_at(Tx,i,1)//will cover hit humans in blood
src.operating = 0
update_icon()
@@ -313,40 +331,43 @@ obj/machinery/gibber/New()
if(newmeat==null)
return
newmeat.reagents.add_reagent (NUTRIMENT, sourcenutriment / totalslabs) // Thehehe. Fat guys go first
if (newmeat.reagents)//don't want to try and transfer reagents to bones, diamonds, and other non-meat meats
newmeat.reagents.add_reagent (NUTRIMENT, sourcenutriment / totalslabs) // Thehehe. Fat guys go first
if(victim.reagents)
victim.reagents.trans_to (newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from them
if(victim.reagents)
victim.reagents.trans_to (newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from them
allmeat[i] = newmeat
victim.attack_log += "\[[time_stamp()]\] Was auto-gibbed by <B>[src]</B>" //One shall not simply gib a mob unnoticed!
log_attack("<B>[src]</B> auto-gibbed <B>[key_name(victim)]</B>")
victim.death(1)
if(ishuman(victim) || ismonkey(victim) || isalien(victim))
if(victim.client && (ishuman(victim) || ismonkey(victim) || isalien(victim)))
var/obj/item/organ/internal/brain/B = new(src.loc)
B.transfer_identity(victim)
var/turf/Tx = locate(src.x - 2, src.y, src.z)
B.forceMove(src.loc)
B.throw_at(Tx,2,3)
if(isalien(victim))
var/obj/effect/decal/cleanable/blood/gibs/xeno/O = new /obj/effect/decal/cleanable/blood/gibs/xeno(Tx)
O.New(Tx,2)
else
var/obj/effect/decal/cleanable/blood/gibs/O = new /obj/effect/decal/cleanable/blood/gibs(Tx)
O.New(Tx,2)
B.throw_at(Tx,2,1)
else
victim.ghostize(0)
qdel(victim)
playsound(src, 'sound/effects/gib2.ogg', 50, 1)
for (var/i=1 to totalslabs)
var/obj/item/meatslab = allmeat[i]
var/turf/Tx = locate(src.x - i, src.y, src.z)
meatslab.forceMove(src.loc)
meatslab.throw_at(Tx,i,3)
meatslab.throw_at(Tx,i,1)
var/obj/effect/decal/cleanable/blood/gibs/newgib
if (!Tx.density)
var/obj/effect/decal/cleanable/blood/gibs/O = new /obj/effect/decal/cleanable/blood/gibs(Tx)
O.New(Tx,i)
if (isalien(victim)||istype(occupant, /mob/living/simple_animal/hostile/alien))//alien get their own custom gibs
newgib = spawngib(/obj/effect/decal/cleanable/blood/gibs/xeno,get_turf(src),ALIEN_FLESH,ALIEN_BLOOD,victim.virus2,null)
else if (ishuman(victim))
var/mob/living/carbon/human/H = victim
newgib = spawngib(/obj/effect/decal/cleanable/blood/gibs,get_turf(src),H.species.flesh_color,H.species.blood_color,H.virus2,H.dna)
else
newgib = spawngib(/obj/effect/decal/cleanable/blood/gibs,get_turf(src),DEFAULT_FLESH,DEFAULT_BLOOD,victim.virus2,victim.dna)
newgib.anchored = FALSE
newgib.throw_at(Tx,2,1)//will cover hit humans in blood
qdel(victim)
/obj/machinery/gibber/npc_tamper_act(mob/living/L)
attack_hand(L)

View File

@@ -4,14 +4,18 @@
name = "xeno blood"
desc = "It's green and acidic. It looks like... <i>blood?</i>"
icon = 'icons/effects/blood.dmi'
basecolor = "#05EE05"
basecolor = ALIEN_BLOOD
fake_DNA = "xeno blood splatters"
/obj/effect/decal/cleanable/blood/gibs/xeno
name = "xeno gibs"
desc = "Gnarly..."
icon_state = "xgib1"
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
basecolor = "#05EE05"
basecolor = ALIEN_BLOOD
fake_DNA = "xeno gibs splatters"
/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon()
color = "#FFFFFF"
@@ -36,4 +40,4 @@
playsound(src, get_sfx("gib"),50,1)
/obj/effect/decal/cleanable/blood/xtracks
basecolor = "#05EE05"
basecolor = ALIEN_BLOOD

View File

@@ -13,6 +13,8 @@
persistence_type = null //Yikes!
fake_DNA = "fuel splatters"
/obj/effect/decal/cleanable/liquid_fuel/New(newLoc,amt=1)
src.amount = amt

View File

@@ -16,6 +16,7 @@ var/global/list/blood_list = list()
plane = ABOVE_TURF_PLANE
layer = BLOOD_LAYER
appearance_flags = TILE_BOUND|LONG_GLIDE
throwforce = 0
var/base_icon = 'icons/effects/blood.dmi'
basecolor=DEFAULT_BLOOD // Color when wet.
@@ -26,6 +27,8 @@ var/global/list/blood_list = list()
persistence_type = SS_BLOOD
fake_DNA = "old blood splatters"
/obj/effect/decal/cleanable/blood/New(var/loc, var/age, var/icon_state, var/color, var/dir, var/pixel_x, var/pixel_y, var/basecolor)
if(basecolor)
src.basecolor = basecolor
@@ -122,6 +125,8 @@ var/global/list/blood_list = list()
persistence_type = SS_GIBS
var/fleshcolor = DEFAULT_FLESH
fake_DNA = "old gibs splatters"
/obj/effect/decal/cleanable/blood/gibs/New(var/loc, var/age, var/icon_state, var/color, var/dir, var/pixel_x, var/pixel_y, var/basecolor, var/fleshcolor)
if(fleshcolor)
src.fleshcolor = fleshcolor
@@ -194,6 +199,8 @@ var/global/list/blood_list = list()
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
fake_DNA = "viral sputum splatters"
/obj/effect/decal/cleanable/blood/viralsputum/Destroy()
for(var/datum/disease/D in viruses)
D.cure(0)
@@ -204,20 +211,25 @@ var/global/list/blood_list = list()
//We should really get directional blood streak sprites again --snx
/obj/effect/decal/cleanable/blood/proc/streak(var/list/directions, spread_radius = 0)
spawn (0)
spawn ()
var/direction = pick(directions)
for (var/i = 0 to spread_radius)
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc)
b.basecolor = src.basecolor
b.update_icon()
if(virus2?.len)
b.virus2 = filter_disease_by_spread(virus_copylist(virus2),required = SPREAD_BLOOD)
for(var/datum/disease/D in src.viruses)
var/datum/disease/ND = D.Copy(1)
b.viruses += ND
ND.holder = b
step_to(src, get_step(src, direction), 0)
anchored = FALSE
throw_at(get_step(src, direction),1,1)//will cover hit humans in blood
/obj/effect/decal/cleanable/mucus
@@ -230,4 +242,6 @@ var/global/list/blood_list = list()
icon_state = "mucus"
random_icon_states = list("mucus")
fake_DNA = "mucus splatters"
var/dry=0

View File

@@ -123,6 +123,8 @@
persistent_type_replacement = /obj/effect/decal/cleanable/vomit/pre_dry
fake_DNA = "vomit splatters"
/obj/effect/decal/cleanable/vomit/pre_dry
name = "dry vomit"
mouse_opacity = 0

View File

@@ -3,9 +3,11 @@
desc = "It's a useless heap of junk... <i>or is it?</i>"
icon = 'icons/mob/robots.dmi'
icon_state = "gib1"
basecolor="#030303"
basecolor=ROBOT_OIL
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
fake_DNA = "robot oil splatters"
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
color = "#FFFFFF"
@@ -13,7 +15,7 @@
return
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
spawn (0)
spawn ()
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
@@ -24,8 +26,9 @@
streak.update_icon()
else if (prob(10))
spark(src)
if (step_to(src, get_step(src, direction), 0))
break
anchored = FALSE
throw_at(get_step(src, direction),1,1)//will cover hit humans in oil
/obj/effect/decal/cleanable/blood/gibs/robot/limb
random_icon_states = list("gibarm", "gibleg")
@@ -39,7 +42,9 @@
/obj/effect/decal/cleanable/blood/oil
name = "motor oil"
desc = "It's black and greasy. Looks like Beepsky made another mess."
basecolor="#030303"
basecolor=ROBOT_OIL
fake_DNA = "oil splatters"
/obj/effect/decal/cleanable/blood/oil/dry()
return

View File

@@ -57,6 +57,9 @@
"128"=0
)
/obj/effect/decal/cleanable/blood/tracks/fixDNA()
blood_DNA = list()
/** DO NOT FUCKING REMOVE THIS. **/
/obj/effect/decal/cleanable/blood/tracks/process()
return PROCESS_KILL

View File

@@ -25,6 +25,7 @@ var/list/infected_cleanables = list()
var/persistence_type = SS_CLEANABLE
var/age = 1 //For map persistence. +1 per round that this item has survived. After a certain amount, it will not carry on to the next round anymore.
var/persistent_type_replacement //If defined, the persistent item generated from this will be of this type rather than our own.
var/fake_DNA = "random splatters"//for DNA-less splatters
/obj/effect/decal/cleanable/New(var/loc, var/age, var/icon_state, var/color, var/dir, var/pixel_x, var/pixel_y)
if(age)
@@ -45,6 +46,8 @@ var/list/infected_cleanables = list()
if(ticker)
initialize()
fixDNA()
..(loc)
blood_list += src
@@ -84,6 +87,41 @@ var/list/infected_cleanables = list()
if (L.client)
L.client.images |= pathogen
/obj/effect/decal/cleanable/proc/fixDNA()
if (!istype(blood_DNA, /list))
blood_DNA = list()
blood_DNA[fake_DNA] = "N/A"
/obj/effect/decal/cleanable/throw_impact(atom/hit_atom)
if (isliving(hit_atom) && blood_DNA?.len)
var/mob/living/L = hit_atom
var/blood_data = list(
"viruses" =null,
"blood_DNA" =null,
"blood_colour" =null,
"blood_type" =null,
"resistances" =null,
"trace_chem" =null,
"virus2" =list(),
"immunity" =null,
)
if(ishuman(hit_atom))
var/mob/living/carbon/human/H = L
if (blood_DNA?.len > 0)
blood_data["blood_DNA"] = blood_DNA[1]
blood_data["blood_type"] = blood_DNA[blood_DNA[1]]
blood_data["virus2"] = virus_copylist(virus2)
blood_data["blood_colour"] = basecolor
H.bloody_body_from_data(copy_blood_data(blood_data),0,src)
H.bloody_hands_from_data(copy_blood_data(blood_data),2,src)
add_blood_to(H, amount)//this one adds blood to the shoes and feet
for(var/i = 1 to L.held_items.len)
var/obj/item/I = L.held_items[i]
if(istype(I))
I.add_blood_from_data(blood_data)
anchored = TRUE
/obj/effect/decal/cleanable/initialize()
..()
if(persistence_type)

View File

@@ -28,8 +28,8 @@
var/list/gibtypes = list()
var/list/gibamounts = list()
var/list/gibdirections = list() //of lists
var/fleshcolor //Used for gibbed humans.
var/bloodcolor //Used for gibbed humans.
var/fleshcolor = DEFAULT_FLESH
var/bloodcolor = DEFAULT_BLOOD
/obj/effect/gibspawner/New(location, var/list/virus2, var/datum/dna/MobDNA, var/fleshcolor, var/bloodcolor, spread_radius)
..()
@@ -56,28 +56,31 @@
if(gibamounts[i])
for(var/j = 1, j<= gibamounts[i], j++)
var/gibType = gibtypes[i]
gib = new gibType(location)//new gibType(location)
// Apply human species colouration to masks.
if(fleshcolor)
gib.fleshcolor = fleshcolor
if(bloodcolor)
gib.basecolor = bloodcolor
gib = spawngib(gibType,location,fleshcolor,bloodcolor,virus2,MobDNA)
gib.update_icon()
if(virus2)
gib.virus2 = filter_disease_by_spread(virus_copylist(virus2),required = SPREAD_BLOOD)
gib.blood_DNA = list()
if(MobDNA)
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
else if(istype(src, /obj/effect/gibspawner/xeno))
gib.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
gib.blood_DNA["Non-human DNA"] = "A+"
var/list/directions = gibdirections[i]
if(directions.len)
if(gib && directions.len)
gib.streak(directions, spread_radius)
qdel(src)
//spawning a single gib
/proc/spawngib(var/gibType,var/location,var/fleshcolor=DEFAULT_FLESH,var/bloodcolor=DEFAULT_BLOOD,var/list/virus2 = list(), var/datum/dna/MobDNA = null)
var/obj/effect/decal/cleanable/blood/gibs/gib = new gibType(location)
if(fleshcolor)
gib.fleshcolor = fleshcolor
if(bloodcolor)
gib.basecolor = bloodcolor
gib.update_icon()
if(virus2?.len)
gib.virus2 = filter_disease_by_spread(virus_copylist(virus2),required = SPREAD_BLOOD)
if(MobDNA)
gib.blood_DNA = list()
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
return gib

View File

@@ -20,6 +20,8 @@
/obj/effect/gibspawner/xeno
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
gibamounts = list(1,1,1,1,1,1,1)
fleshcolor = ALIEN_FLESH
bloodcolor = ALIEN_BLOOD
/obj/effect/gibspawner/xeno/New()
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs, list())
@@ -30,6 +32,8 @@
sparks = 1
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
gibamounts = list(1,1,1,1,1,1)
fleshcolor = ROBOT_OIL
bloodcolor = ROBOT_OIL
/obj/effect/gibspawner/robot/New()
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), alldirs, alldirs)

View File

@@ -1041,8 +1041,6 @@
/obj/item/add_blood(var/mob/living/carbon/human/M)
if (!..())
return FALSE
if(istype(src, /obj/item/weapon/melee/energy))
return
//if we haven't made our blood_overlay already
if(!blood_overlays[type])
@@ -1076,6 +1074,45 @@
had_blood = TRUE
return TRUE //we applied blood to the item
/obj/item/add_blood_from_data(var/list/blood_data)
if (!..())
return FALSE
//if we haven't made our blood_overlay already
if(!blood_overlays[type])
generate_blood_overlay()
if(!blood_overlay)
blood_overlay = blood_overlays[type]
else
overlays.Remove(blood_overlay)
//apply the blood-splatter overlay if it isn't already in there, else it updates it.
blood_overlay.color = blood_color
overlays += blood_overlay
//if this blood isn't already in the list, add it
if(!blood_data)
return
if (blood_data["virus2"]?.len)
var/list/blood_diseases = filter_disease_by_spread(blood_data["virus2"],required = SPREAD_BLOOD)
if (blood_diseases?.len)
for (var/ID in blood_diseases)
var/datum/disease2/disease/D = blood_diseases[ID]
infect_disease2(D, notes="(Blood, coming from a blood splattering)")
if (isliving(loc))
var/mob/living/L = loc
infection_attempt(L,D)//Wear gloves when doing surgery or beating that catbeast to death!
if(blood_DNA[blood_data["blood_DNA"]])
return FALSE //already bloodied with this blood. Cannot add more.
blood_DNA[blood_data["blood_DNA"]] = blood_data["blood_type"]
had_blood = TRUE
return TRUE //we applied blood to the item
var/global/list/image/blood_overlays = list()
/obj/item/proc/generate_blood_overlay()
if(blood_overlays[type])

View File

@@ -22,6 +22,13 @@
return sharpness
return 0
//Energy weapons cannot be bloodied. Not even their handle. Don't ask.
/obj/item/weapon/melee/energy/add_blood(var/mob/living/carbon/human/M)
return FALSE
/obj/item/weapon/melee/energy/add_blood_from_data(var/list/blood_data)
return FALSE
/obj/item/weapon/melee/energy/axe
name = "energy axe"
desc = "An energised battle axe."
@@ -444,4 +451,4 @@
sharpness_flags = SHARP_BLADE | SERRATED_BLADE | CHOPWOOD | HOT_EDGE | CUT_WALL | CUT_AIRLOCK
armor_penetration = 100
hitsound = get_sfx("machete_hit")
update_icon()
update_icon()

View File

@@ -21,6 +21,15 @@
mop_list.Remove(src)
..()
/obj/item/weapon/mop/update_icon()
..()
overlays.len = 0
if (reagents.total_volume >= 1)
var/image/covering = image(icon, "mop-reagent")
covering.icon += mix_color_from_reagents(reagents.reagent_list)
covering.alpha = mix_alpha_from_reagents(reagents.reagent_list)
overlays += covering
/obj/item/weapon/mop/proc/clean(turf/simulated/A as turf)
for(var/obj/effect/O in A)
if(iscleanaway(O))
@@ -38,6 +47,7 @@
if(!user.Adjacent(A))
return
if(A.mop_act(src, user))
update_icon()
return
if(istype(A, /mob/living))
if(!(reagents.total_volume < 1)) //Slap slap slap
@@ -53,3 +63,4 @@
user.delayNextAttack(10)
clean(get_turf(A))
reagents.remove_any(1) //Might be a tad wonky with "special mop mixes", but fuck it
update_icon()

View File

@@ -26,10 +26,12 @@
anchored = 1
user.visible_message("<span class='notice'>[user] locks [src]'s wheels!</span>")
lockedby += "\[[time_stamp()]\] [usr] ([usr.ckey]) - locked [src]"
icon_state = "mopbucket_deploy"
else
anchored = 0
user.visible_message("<span class='notice'>[user] unlocks [src]'s wheels!</span>")
lockedby += "\[[time_stamp()]\] [usr] ([usr.ckey]) - unlocked [src]"
icon_state = "mopbucket"
/obj/structure/mopbucket/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/mop))

View File

@@ -71,7 +71,7 @@
..()
//returns 1 if made bloody, returns 0 otherwise
/turf/simulated/add_blood(mob/living/carbon/human/M as mob)
/turf/simulated/add_blood(var/mob/living/carbon/human/M)
if (!..())
return FALSE
@@ -87,8 +87,10 @@
return TRUE //we bloodied the floor
// Only adds blood on the floor -- Skie
/turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob)
if(istype(M, /mob/living/carbon/monkey))
/turf/simulated/proc/add_blood_floor(var/mob/living/carbon/M)
if (ishuman(M))
add_blood(M)
else if(istype(M, /mob/living/carbon/monkey))
blood_splatter(src,M,1)
else if( istype(M, /mob/living/carbon/alien ))
var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src)

View File

@@ -6,10 +6,10 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
if(M.gloves && istype(M.gloves,/obj/item/clothing/))
var/obj/item/clothing/gloves/G = M.gloves
if(G.transfer_blood) //bloodied gloves transfer blood to touched objects
if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
if(add_blood_from_data(G.bloody_hands_data)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
G.transfer_blood--
else if(M.bloody_hands)
if(add_blood(M.bloody_hands_mob))
if(add_blood_from_data(M.bloody_hands_data))
M.bloody_hands--
if(!suit_fibers)
suit_fibers = list()
@@ -452,7 +452,7 @@ var/const/FINGERPRINT_COMPLETE = 6 //This is the output of the stringpercent(pri
var/obj/item/device/pda/the_pda = scanning
if(the_pda.cartridge && the_pda.cartridge.access_security)
is_scanner = TRUE
if(is_scanner)
scan_data += "<br><b>Data transfered from \the [scanning] to Database.</b><br>"
add_data_scanner(scanning)

View File

@@ -1,6 +1,6 @@
/mob
var/bloody_hands = 0
var/mob/living/carbon/human/bloody_hands_mob
var/list/bloody_hands_data = list()
var/track_blood = 0
var/list/feet_blood_DNA
var/feet_blood_color
@@ -8,9 +8,9 @@
/obj/item/clothing/gloves
var/transfer_blood = 0
var/mob/living/carbon/human/bloody_hands_mob
var/list/bloody_hands_data = list()
/obj/item/clothing/shoes/
/obj/item/clothing/shoes
var/track_blood = 0
/obj/item/weapon/reagent_containers/glass/rag
@@ -39,7 +39,7 @@
src.reagents.reaction(M, TOUCH)
spawn(5) src.reagents.clear_reagents()
return 1
else
else
var/datum/organ/external/targetorgan = M.get_organ(user.zone_sel.selecting)
var/list/bleeding_organs = M.get_bleeding_organs()
if(targetorgan in bleeding_organs) //rags work as bandages

View File

@@ -980,20 +980,38 @@
*/
//returns 1 if made bloody, returns 0 otherwise
/mob/living/carbon/human/add_blood(mob/living/carbon/human/M as mob)
/mob/living/carbon/human/add_blood(var/mob/living/carbon/human/M)
if (!..())
return 0
return FALSE
if(!M)
return
had_blood = TRUE
//if this blood isn't already in the list, add it
if(blood_DNA[M.dna.unique_enzymes])
return 0 //already bloodied with this blood. Cannot add more.
return FALSE //already bloodied with this blood. Cannot add more.
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
hand_blood_color = blood_color
src.update_inv_gloves() //handles bloody hands overlays and updating
update_inv_gloves() //handles bloody hands overlays and updating
verbs += /mob/living/carbon/human/proc/bloody_doodle
return 1 //we applied blood to the item
/mob/living/carbon/human/add_blood_from_data(var/list/blood_data)
if (!..())
return FALSE
if(!blood_data)
return
had_blood = TRUE
//if this blood isn't already in the list, add it
if(blood_DNA[blood_data["blood_DNA"]])
return FALSE //already bloodied with this blood. Cannot add more.
blood_DNA[blood_data["blood_DNA"]] = blood_data["blood_type"]
update_inv_gloves() //handles bloody hands overlays and updating
verbs += /mob/living/carbon/human/proc/bloody_doodle
return TRUE //we applied blood to the item
/mob/living/carbon/human/clean_blood(var/clean_feet)
.=..()
if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
@@ -1231,6 +1249,9 @@
if (src.stat)
return
if (!(bloody_hands_data?.len))
return
if (usr != src)
return 0 //something is terribly wrong
@@ -1274,7 +1295,7 @@
var/obj/effect/decal/cleanable/blood/writing/W = new /obj/effect/decal/cleanable/blood/writing(T)
W.New(T)
W.basecolor = (hand_blood_color) ? hand_blood_color : DEFAULT_BLOOD
W.basecolor = (bloody_hands_data["blood_colour"]) ? bloody_hands_data["blood_colour"] : DEFAULT_BLOOD
W.update_icon()
W.message = message
W.add_fingerprint(src)

View File

@@ -328,11 +328,11 @@ emp_act
G.add_blood(source)
if (istype(G))
G.transfer_blood = amount
G.bloody_hands_mob = source
G.bloody_hands_data = source.get_blood_data()
else
add_blood(source)
bloody_hands = amount
bloody_hands_mob = source
bloody_hands_data = source.get_blood_data()
update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
/mob/living/carbon/human/proc/bloody_body(var/mob/living/source,var/update = 0)
@@ -348,6 +348,43 @@ emp_act
w_uniform.add_blood(source)
update_inv_w_uniform(update)
//=======================================================================================================================
//The two procs bellow are for when getting bloodied with blood that doesn't come straight from a mob, but from a beaker or something else
//Since the original donor might not exist anymore
/mob/living/carbon/human/proc/bloody_hands_from_data(var/list/blood_data,var/amount = 2,var/source)
//we're getting splashed with blood, so let's check for viruses
var/block = check_contact_sterility(HANDS)
var/bleeding = check_bodypart_bleeding(HANDS)
assume_contact_diseases(blood_data["virus2"],source,block,bleeding)
if (gloves)
var/obj/item/clothing/gloves/G = gloves
G.add_blood_from_data(blood_data)
if (istype(G))
G.transfer_blood = amount
G.bloody_hands_data = copy_blood_data(blood_data)
else
add_blood_from_data(blood_data)
bloody_hands = amount
bloody_hands_data = copy_blood_data(blood_data)
update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves
/mob/living/carbon/human/proc/bloody_body_from_data(var/list/blood_data,var/update = 0,var/source)
//we're getting splashed with blood, so let's check for viruses
var/block = check_contact_sterility(FULL_TORSO)
var/bleeding = check_bodypart_bleeding(FULL_TORSO)
assume_contact_diseases(blood_data["virus2"],source,block,bleeding)
if(wear_suit)
wear_suit.add_blood_from_data(blood_data)
update_inv_wear_suit(update)
if(w_uniform)
w_uniform.add_blood_from_data(blood_data)
update_inv_w_uniform(update)
//=======================================================================================================================
/mob/living/carbon/human/apply_luminol(var/update = FALSE) //Despite what you might think with FALSE this will update things as normal.
if(wear_suit)
wear_suit.apply_luminol()

View File

@@ -57,7 +57,6 @@
var/lastpuke = 0
var/mob/remoteview_target = null
var/hand_blood_color
var/meatleft = 3 //For chef item

View File

@@ -167,7 +167,6 @@ var/global/list/organ_damage_overlays = list(
handle_shock()
handle_pain()
handle_medical_side_effects()
handle_equipment()
handle_stasis_bag()
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
cycle = "DEAD"

View File

@@ -1,13 +0,0 @@
//Refer to life.dm for caller
/mob/living/carbon/human/proc/handle_equipment()
if(head)
if(istype(head, /obj/item/weapon/reagent_containers/glass/bucket))
var/obj/item/weapon/reagent_containers/glass/bucket/B = head
if(B.reagents.total_volume)
for(var/atom/movable/O in loc)
B.reagents.reaction(O, TOUCH)
B.reagents.reaction(loc, TOUCH)
visible_message("<span class='warning'>The bucket's content spills on [src]</span>")
spawn(5)
B.reagents.clear_reagents()

View File

@@ -7,6 +7,8 @@
flags = IS_WHITELISTED | PLASMA_IMMUNE
anatomy_flags = NO_BLOOD
blood_color = "#743474"
flesh_color = "#898476"
//default_mutations=list(M_SKELETON) // This screws things up
primitive = /mob/living/carbon/monkey/skellington/plasma

View File

@@ -133,11 +133,17 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/get_damage_icon_part(damage_state, body_part,species_blood = "")
var/icon/I = damage_icon_parts["[damage_state]/[body_part]/[species_blood]"]
if(!I)
if(!I)//This should never happen anyway since all species damage icons are getting cached at roundstart (see cachedamageicons())
var/icon/DI = icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human
DI.Blend(icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels
if(species_blood)
DI.Blend(species_blood, ICON_MULTIPLY) // mask with this species's blood color
var/brute = copytext(damage_state,1,2)
var/burn = copytext(damage_state,2)
DI = icon('icons/mob/dam_human.dmi', "[brute]0-color")
DI.Blend(species_blood, ICON_MULTIPLY)
var/icon/DI_burn = icon('icons/mob/dam_human.dmi', "0[burn]")//we don't want burns to blend with the species' blood color
DI.Blend(DI_burn, ICON_OVERLAY)
DI.Blend(icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY)
damage_icon_parts["[damage_state]/[body_part]/[species_blood]"] = DI
return DI
else
@@ -704,18 +710,12 @@ var/global/list/damage_icon_parts = list()
O.pixel_x = species.inventory_offsets["[slot_gloves]"]["pixel_x"] * PIXEL_MULTIPLIER
O.pixel_y = species.inventory_offsets["[slot_gloves]"]["pixel_y"] * PIXEL_MULTIPLIER
obj_to_plane_overlay(O,GLOVES_LAYER)
//overlays_standing[GLOVES_LAYER] = standing
else
if(blood_DNA && blood_DNA.len)
if(blood_DNA?.len && bloody_hands_data?.len)
O.icon = 'icons/effects/blood.dmi'
O.icon_state = "bloodyhands"
O.color = hand_blood_color
//var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
//bloodsies.color = hand_blood_color
//overlays_standing[GLOVES_LAYER] = bloodsies
O.color = bloody_hands_data["blood_colour"]
obj_to_plane_overlay(O,GLOVES_LAYER)
//else
//overlays_standing[GLOVES_LAYER] = null
if(update_icons)
update_icons()

View File

@@ -45,7 +45,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
for(var/datum/reagent/blood/B in vessel.reagent_list)
if(B.id == BLOOD)
B.data = list(
"donor"=src,
"viruses"=null,
"blood_DNA"=dna.unique_enzymes,
"blood_colour"= species.blood_color,
@@ -72,12 +71,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(blood_volume < BLOOD_VOLUME_MAX && blood_volume)
var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
if(B) // Make sure there's some blood at all
if(B.data["donor"] != src) //If it's not theirs, then we look for theirs
for(var/datum/reagent/blood/D in vessel.reagent_list)
if(D.data["donor"] == src)
B = D
break
B.volume += 0.1 // regenerate blood VERY slowly
if(M_REGEN in mutations)
B.volume += 0.4 //A big chunky boost. If you have nutriment and iron you can regenerate 4.1 blood per tick
@@ -227,8 +220,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
B.volume += amount
//set reagent data
B.data["donor"] = src
if (!B.data["virus2"])
B.data["virus2"] = list()
@@ -236,8 +227,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if (immune_system)
B.data["immunity"] = src.immune_system.GetImmunity()
if (dna)
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
B.data["blood_type"] = copytext(src.dna.b_type,1,0)
B.data["blood_DNA"] = src.dna.unique_enzymes
B.data["blood_type"] = src.dna.b_type
if(src.resistances && src.resistances.len)
if(B.data["resistances"])
B.data["resistances"] |= src.resistances.Copy()
@@ -252,7 +243,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
var/list/temp_chem = list()
for(var/datum/reagent/R in src.reagents.reagent_list)
temp_chem += R.id
temp_chem[R.id] = R.volume
B.data["trace_chem"] = list2params(temp_chem)
@@ -264,6 +254,62 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
container.update_icon()
return B
/mob/living/proc/get_blood_data()//sometimes we just want a copy of the blood data whether there is blood or not in the mob
var/blood_data = list(
"viruses"=null,
"blood_DNA"=null,
"blood_colour"= null,
"blood_type"=null,
"resistances"=null,
"trace_chem"=null,
"virus2" = null,
"immunity" = null,
)
if (dna)
blood_data["blood_DNA"] = dna.unique_enzymes
blood_data["blood_type"] = dna.b_type
var/mob/living/carbon/human/H
if(istype(src,/mob/living/carbon/human))
H = src
if (H?.species)
blood_data["blood_colour"] = H.species.blood_color
else
blood_data["blood_colour"] = DEFAULT_BLOOD
if(resistances && resistances.len)
blood_data["resistances"] = resistances.Copy()
var/list/temp_chem = list()
for(var/datum/reagent/R in reagents.reagent_list)
temp_chem[R.id] = R.volume
blood_data["trace_chem"] = list2params(temp_chem)
blood_data["virus2"] = list()
blood_data["virus2"] |= filter_disease_by_spread(virus_copylist(src.virus2),required = SPREAD_BLOOD)
if (immune_system)
blood_data["immunity"] = immune_system.GetImmunity()
return blood_data
/proc/copy_blood_data(var/list/data)
var/blood_data = list(
"viruses" =null,
"blood_DNA" =data["blood_DNA"],
"blood_colour" =data["blood_colour"],
"blood_type" =data["blood_type"],
"resistances" =null,
"trace_chem" =data["trace_chem"],
"virus2" =virus_copylist(data["virus2"]),
"immunity" =null,
)
if (data["resistances"])
blood_data["resistances"] = data["resistances"].Copy()
if (data["immunity"])
blood_data["immunity"] = data["immunity"].Copy()
return blood_data
//For humans, blood does not appear from blue, it comes from vessels.
/mob/living/carbon/human/take_blood(obj/item/weapon/reagent_containers/container, var/amount)

View File

@@ -18,6 +18,17 @@
var/had_mind = FALSE // Owner had a mind at some point. (heist)
var/stabilized = FALSE
var/blood_data = list(
"viruses" = null,
"blood_DNA" = null,
"blood_type" = "O+",
"blood_colour" = DEFAULT_BLOOD,
"resistances" = null,
"trace_chem" = null,
"virus2" = null,
"immunity" = null,
)
/obj/item/organ/internal/attack_self(mob/user as mob)
// Convert it to an edible form, yum yum.
@@ -75,8 +86,9 @@
if(fresh && prob(40))
fresh--
var/datum/reagent/blood = reagents.reagent_list[BLOOD]
blood_splatter(src,blood,1)
var/datum/reagent/blood/blud = new
blud.data = copy_blood_data(blood_data)
blood_splatter(src,blud,1)
health -= rand(1,3)
if(health <= 0)
@@ -324,10 +336,12 @@
name = "appendix"
/obj/item/organ/internal/proc/removed(var/mob/living/target,var/mob/living/user)
if(!target || !user)
if(!target)
return
if(organ_data.vital)
blood_data = target.get_blood_data()
if(user && organ_data.vital)
user.attack_log += "\[[time_stamp()]\]<font color='red'> removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
target.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
@@ -397,8 +411,9 @@
return
to_chat(user, "<span class='notice'>You take an experimental bite out of \the [src].</span>")
var/datum/reagent/blood = reagents.reagent_list[BLOOD]
blood_splatter(src,blood,1)
var/datum/reagent/blood/blud = new
blud.data = copy_blood_data(blood_data)
blood_splatter(src,blud,1)
user.drop_from_inventory(src)

View File

@@ -355,7 +355,6 @@
specheatcap = 3.49
data = list(
"donor"= null,
"viruses" = null,
"blood_DNA" = null,
"blood_type" = null,
@@ -405,9 +404,8 @@
if(ishuman(L) && (method == TOUCH))
var/mob/living/carbon/human/H = L
H.bloody_body(self.data["donor"])
if(self.data["donor"])
H.bloody_hands(self.data["donor"])
H.bloody_body_from_data(data,0,src)
H.bloody_hands_from_data(data,2,src)
spawn() //Bloody feet, result of the blood that fell on the floor
var/obj/effect/decal/cleanable/blood/B = locate() in get_turf(H)
@@ -458,31 +456,8 @@
if(volume < 3) //Hardcoded
return
// WHY WAS THIS MAKING 2 SPLATTERS? Awfully hardcoded, no need to exist, and this is completely broken colorwise
//
//var/datum/disease/D = self.data["virus"]
// if(!self.data["donor"] || ishuman(self.data["donor"]))
// var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //Find some blood here
// if(!blood_prop) //First blood
// blood_prop = new /obj/effect/decal/cleanable/blood(T)
// blood_prop.New(T)
// blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
//
// for(var/datum/disease/D in self.data["viruses"])
// var/datum/disease/newVirus = D.Copy(1)
// blood_prop.viruses += newVirus
//
if(!self.data["donor"] || ishuman(self.data["donor"]))
blood_splatter(T, self, 1)
else if(ismonkey(self.data["donor"]))
var/obj/effect/decal/cleanable/blood/B = blood_splatter(T, self, 1)
if(B)
B.blood_DNA["Non-Human DNA"] = "A+"
else if(isalien(self.data["donor"]))
var/obj/effect/decal/cleanable/blood/B = blood_splatter(T, self, 1)
if(B)
B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
blood_splatter(T, self, 1)
T.had_blood = TRUE
if(volume >= 5 && !istype(T.loc, /area/chapel)) //Blood desanctifies non-chapel tiles
T.holy = 0
@@ -497,10 +472,11 @@
return 1
/datum/reagent/blood/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
O.add_blood_from_data(data)
if(istype(O, /obj/item/clothing/mask/stone))
var/obj/item/clothing/mask/stone/S = O
S.spikes()

View File

@@ -3269,7 +3269,6 @@
new_virus.makerandom(list(40,60),list(20,90),anti,bad,src)
var/list/blood_data = list(
"donor" = null,
"viruses" = null,
"blood_DNA" = null,
"blood_type" = "O-",

View File

@@ -364,6 +364,16 @@
flags = FPRINT | OPENCONTAINER
slot_flags = SLOT_HEAD
/obj/item/weapon/reagent_containers/glass/bucket/equipped(var/mob/M, var/slot)
..()
if(slot == slot_head)
if(reagents.total_volume)
for(var/atom/movable/O in M.loc)
reagents.reaction(O, TOUCH)
reagents.reaction(M.loc, TOUCH)
visible_message("<span class='warning'>The bucket's content spills on [src]</span>")
reagents.clear_reagents()
/obj/item/weapon/reagent_containers/glass/bucket/mop_act(obj/item/weapon/mop/M, mob/user)
if(..())
if (src.reagents.total_volume >= 1)

View File

@@ -389,7 +389,6 @@ var/datum/disease2/disease/magnitis = null
magnitis.update_global_log()
var/list/blood_data = list(
"donor" = null,
"viruses" = null,
"blood_DNA" = null,
"blood_type" = "O-",
@@ -449,7 +448,6 @@ var/datum/disease2/disease/wizarditis = null
wizarditis.update_global_log()
var/list/blood_data = list(
"donor" = null,
"viruses" = null,
"blood_DNA" = null,
"blood_type" = "O-",

View File

@@ -52,7 +52,6 @@
new_virus.makerandom(list(40,60),list(20,90),anti,bad,null)
var/list/blood_data = list(
"donor" = null,
"viruses" = null,
"blood_DNA" = null,
"blood_type" = "O-",

View File

@@ -21,7 +21,7 @@
return
var/obj/item/weapon/reagent_containers/glass/beaker/product = new(src.loc)
var/list/data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=list(),"antibodies"=0)
var/list/data = list("viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"virus2"=list(),"antibodies"=0)
data["virus2"] |= I:virus2
product.reagents.add_reagent(BLOOD,30,data)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1787,7 +1787,6 @@
#include "code\modules\mob\living\carbon\human\life\handle_chemicals_in_body.dm"
#include "code\modules\mob\living\carbon\human\life\handle_disabilities.dm"
#include "code\modules\mob\living\carbon\human\life\handle_environment.dm"
#include "code\modules\mob\living\carbon\human\life\handle_equipment.dm"
#include "code\modules\mob\living\carbon\human\life\handle_fire.dm"
#include "code\modules\mob\living\carbon\human\life\handle_hud_list.dm"
#include "code\modules\mob\living\carbon\human\life\handle_mutations_and_radiation.dm"