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>
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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) )
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
var/lastpuke = 0
|
||||
|
||||
var/mob/remoteview_target = null
|
||||
var/hand_blood_color
|
||||
|
||||
var/meatleft = 3 //For chef item
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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-",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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-",
|
||||
|
||||
@@ -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-",
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@@ -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"
|
||||
|
||||