mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-27 05:57:24 +01:00
Finally got colored blood working properly
This commit is contained in:
+21
-25
@@ -9,6 +9,7 @@ var/global/list/ghdel_profiling = list()
|
||||
var/list/fingerprintshidden
|
||||
var/fingerprintslast = null
|
||||
var/list/blood_DNA
|
||||
var/blood_color
|
||||
var/last_bumped = 0
|
||||
var/pass_flags = 0
|
||||
var/throwpass = 0
|
||||
@@ -376,30 +377,30 @@ 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)
|
||||
if(flags & NOBLOODY) return 0
|
||||
.=1
|
||||
if (!( istype(M, /mob/living/carbon/human) ))
|
||||
|
||||
if(flags & NOBLOODY)
|
||||
return 0
|
||||
if (!istype(M.dna, /datum/dna))
|
||||
M.dna = new /datum/dna(null)
|
||||
M.dna.real_name = M.real_name
|
||||
M.check_dna()
|
||||
|
||||
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()
|
||||
|
||||
//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 0 //already bloodied with this blood. Cannot add more.
|
||||
blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||
if(H.species.bloodflags & BLOOD_GREEN)
|
||||
H.update_inv_gloves(1,1)
|
||||
else
|
||||
H.update_inv_gloves(1,0) //handles bloody hands overlays and updating
|
||||
return 1 //we applied blood to the item
|
||||
return
|
||||
blood_color = "#A10808"
|
||||
if(istype(M))
|
||||
if (!istype(M.dna, /datum/dna))
|
||||
M.dna = new /datum/dna(null)
|
||||
M.dna.real_name = M.real_name
|
||||
M.check_dna()
|
||||
if (M.species)
|
||||
blood_color = M.species.blood_color
|
||||
. = 1
|
||||
return 1
|
||||
|
||||
|
||||
/atom/proc/clean_blood()
|
||||
src.germ_level = 0
|
||||
if(istype(blood_DNA, /list))
|
||||
del(blood_DNA)
|
||||
return 1
|
||||
|
||||
/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
|
||||
if( istype(src, /turf/simulated) )
|
||||
@@ -413,11 +414,6 @@ its easier to just keep the beam vertical.
|
||||
if( istype(src, /turf/simulated) )
|
||||
new /obj/effect/decal/cleanable/poop(src)
|
||||
|
||||
/atom/proc/clean_blood()
|
||||
src.germ_level = 0
|
||||
if(istype(blood_DNA, /list))
|
||||
del(blood_DNA)
|
||||
return 1
|
||||
|
||||
/atom/proc/get_global_map_pos()
|
||||
if(!islist(global_map) || isemptylist(global_map)) return
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
visible_message("<span class='userdanger'>[user] has slashed [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
if(prob(10))
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
healthcheck()
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
visible_message("<span class='userdanger'>[M] has [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked", admin=0)
|
||||
if(prob(10))
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
healthcheck()
|
||||
|
||||
/obj/machinery/bot/Topic(href, href_list) //Master Topic to handle common functions.
|
||||
@@ -270,7 +270,7 @@
|
||||
/obj/machinery/bot/emag_act(user as mob)
|
||||
if (emagged < 2)
|
||||
Emag(user)
|
||||
|
||||
|
||||
/obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
health -= Proj.damage
|
||||
@@ -345,7 +345,7 @@
|
||||
if((!on) || (!message))
|
||||
return
|
||||
if(freqname)
|
||||
Radio.autosay(message, src.name, freqname, list(src.z))
|
||||
Radio.autosay(message, src.name, freqname, list(src.z))
|
||||
else
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"</span>",2)
|
||||
@@ -789,4 +789,3 @@ obj/machinery/bot/proc/bot_summon()
|
||||
loc = Mb.loc
|
||||
frustration = 0
|
||||
return
|
||||
|
||||
@@ -206,10 +206,10 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
|
||||
/obj/machinery/bot/cleanbot/proc/get_targets()
|
||||
target_types = new/list()
|
||||
|
||||
target_types += /obj/effect/decal/cleanable/oil
|
||||
target_types += /obj/effect/decal/cleanable/blood/oil
|
||||
target_types += /obj/effect/decal/cleanable/vomit
|
||||
target_types += /obj/effect/decal/cleanable/poop
|
||||
target_types += /obj/effect/decal/cleanable/robot_debris
|
||||
target_types += /obj/effect/decal/cleanable/blood/gibs/robot
|
||||
target_types += /obj/effect/decal/cleanable/crayon
|
||||
target_types += /obj/effect/decal/cleanable/liquid_fuel
|
||||
target_types += /obj/effect/decal/cleanable/molten_item
|
||||
@@ -223,11 +223,10 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
|
||||
target_types += /obj/effect/decal/cleanable/mucus
|
||||
|
||||
if(blood)
|
||||
target_types += /obj/effect/decal/cleanable/xenoblood/
|
||||
target_types += /obj/effect/decal/cleanable/xenoblood/xgibs
|
||||
target_types += /obj/effect/decal/cleanable/blood/xeno/
|
||||
target_types += /obj/effect/decal/cleanable/blood/gibs/xeno
|
||||
target_types += /obj/effect/decal/cleanable/blood/
|
||||
target_types += /obj/effect/decal/cleanable/blood/gibs/
|
||||
target_types += /obj/effect/decal/cleanable/blood/green
|
||||
target_types += /obj/effect/decal/cleanable/blood/tracks
|
||||
target_types += /obj/effect/decal/cleanable/dirt
|
||||
|
||||
|
||||
@@ -442,7 +442,7 @@ Auto Patrol[]"},
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/bot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
|
||||
|
||||
@@ -139,7 +139,7 @@ var/global/mulebot_count = 0
|
||||
user << "<span class='notice'>You [locked ? "lock" : "unlock"] the mulebot's controls!</span>"
|
||||
flick("mulebot-emagged", src)
|
||||
playsound(loc, 'sound/effects/sparks1.ogg', 100, 0)
|
||||
|
||||
|
||||
/obj/machinery/bot/mulebot/ex_act(var/severity)
|
||||
unload(0)
|
||||
switch(severity)
|
||||
@@ -932,6 +932,6 @@ var/global/mulebot_count = 0
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
unload(0)
|
||||
qdel(src)
|
||||
|
||||
@@ -401,7 +401,7 @@ Auto Patrol: []"},
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
new /obj/effect/decal/cleanable/oil(loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/bot/secbot/attack_alien(var/mob/living/carbon/alien/user as mob)
|
||||
|
||||
@@ -1,55 +1,33 @@
|
||||
// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood
|
||||
/obj/effect/decal/cleanable/blood/xeno
|
||||
name = "xeno blood"
|
||||
desc = "It's green and acidic. It looks like... <i>blood?</i>"
|
||||
gender = PLURAL
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 2
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "xfloor1"
|
||||
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
|
||||
var/list/viruses = list()
|
||||
blood_DNA = list()
|
||||
basecolor = "#05EE05"
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc)
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xsplatter
|
||||
random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5")
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno
|
||||
name = "xeno gibs"
|
||||
desc = "Gnarly..."
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "xgib1"
|
||||
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6")
|
||||
basecolor = "#05EE05"
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs/up
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon()
|
||||
color = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/up
|
||||
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1")
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs/down
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/down
|
||||
random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1")
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs/body
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/body
|
||||
random_icon_states = list("xgibhead", "xgibtorso")
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs/limb
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/limb
|
||||
random_icon_states = list("xgibleg", "xgibarm")
|
||||
|
||||
/obj/effect/decal/cleanable/xenoblood/xgibs/core
|
||||
/obj/effect/decal/cleanable/blood/gibs/xeno/core
|
||||
random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/xtracks
|
||||
icon_state = "xtracks"
|
||||
random_icon_states = null
|
||||
basecolor = "#05EE05"
|
||||
@@ -1,27 +1,36 @@
|
||||
#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var)
|
||||
#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var)
|
||||
|
||||
var/global/list/image/splatter_cache=list()
|
||||
|
||||
/obj/effect/decal/cleanable/blood
|
||||
name = "blood"
|
||||
desc = "It's red and gooey. Perhaps it's the chef's cooking?"
|
||||
var/dryname = "dried blood"
|
||||
desc = "It's thick and gooey. Perhaps it's the chef's cooking?"
|
||||
var/drydesc = "It's dry and crusty. Someone is not doing their job."
|
||||
gender = PLURAL
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 2
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "floor1"
|
||||
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
||||
icon_state = "mfloor1"
|
||||
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
|
||||
var/base_icon = 'icons/effects/blood.dmi'
|
||||
var/list/viruses = list()
|
||||
blood_DNA = list()
|
||||
var/basecolor="#A10808" // Color when wet.
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/amount = 5
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Del()
|
||||
for(var/datum/disease2/disease/D in viruses)
|
||||
D.cure(0)
|
||||
..()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/New()
|
||||
..()
|
||||
update_icon()
|
||||
if(istype(src, /obj/effect/decal/cleanable/blood/gibs))
|
||||
return
|
||||
if(istype(src, /obj/effect/decal/cleanable/blood/tracks))
|
||||
return // We handle our own drying.
|
||||
if(src.type == /obj/effect/decal/cleanable/blood)
|
||||
if(src.loc && isturf(src.loc))
|
||||
for(var/obj/effect/decal/cleanable/blood/B in src.loc)
|
||||
@@ -32,6 +41,10 @@
|
||||
spawn(DRYING_TIME * (amount+1))
|
||||
dry()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/update_icon()
|
||||
if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
|
||||
color = basecolor
|
||||
|
||||
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
|
||||
if (!istype(perp))
|
||||
return
|
||||
@@ -44,16 +57,25 @@
|
||||
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
||||
hasfeet = 0
|
||||
if(perp.shoes && !perp.buckled)//Adding blood to shoes
|
||||
perp.shoes:track_blood = max(amount,perp.shoes:track_blood) //Adding blood to shoes
|
||||
if(!perp.shoes.blood_overlay)
|
||||
perp.shoes.generate_blood_overlay()
|
||||
if(!perp.shoes.blood_DNA)
|
||||
perp.shoes.blood_DNA = list()
|
||||
perp.shoes.overlays += perp.shoes.blood_overlay
|
||||
perp.update_inv_shoes(1,0)
|
||||
perp.shoes.blood_DNA |= blood_DNA.Copy()
|
||||
var/obj/item/clothing/shoes/S = perp.shoes
|
||||
if(istype(S))
|
||||
S.blood_color = basecolor
|
||||
S.track_blood = max(amount,S.track_blood)
|
||||
if(!S.blood_overlay)
|
||||
S.generate_blood_overlay()
|
||||
if(!S.blood_DNA)
|
||||
S.blood_DNA = list()
|
||||
S.blood_overlay.color = basecolor
|
||||
S.overlays += S.blood_overlay
|
||||
if(S.blood_overlay && S.blood_overlay.color != basecolor)
|
||||
S.blood_overlay.color = basecolor
|
||||
S.overlays.Cut()
|
||||
S.overlays += S.blood_overlay
|
||||
S.blood_DNA |= blood_DNA.Copy()
|
||||
|
||||
else if (hasfeet)//Or feet
|
||||
perp.track_blood = max(amount,perp.track_blood) //Or feet
|
||||
perp.feet_blood_color = basecolor
|
||||
perp.track_blood = max(amount,perp.track_blood)
|
||||
if(!perp.feet_blood_DNA)
|
||||
perp.feet_blood_DNA = list()
|
||||
perp.feet_blood_DNA |= blood_DNA.Copy()
|
||||
@@ -61,17 +83,14 @@
|
||||
var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled
|
||||
W.bloodiness = 4
|
||||
|
||||
perp.update_inv_shoes(1)
|
||||
amount--
|
||||
|
||||
/obj/effect/decal/cleanable/blood/proc/dry()
|
||||
name = "dried [src]"
|
||||
desc = "It's dark red and crusty. Someone is not doing their job."
|
||||
var/icon/I = icon(icon,icon_state)
|
||||
I.SetIntensity(0.7)
|
||||
icon = I
|
||||
name = dryname
|
||||
desc = drydesc
|
||||
color = adjust_brightness(color, -50)
|
||||
amount = 0
|
||||
spawn(DRYING_TIME)
|
||||
Destroy()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
|
||||
..()
|
||||
@@ -81,17 +100,33 @@
|
||||
return
|
||||
var/taken = rand(1,amount)
|
||||
amount -= taken
|
||||
user << "<span class='notice'>You get some blood on your hands.</span>"
|
||||
user << "<span class='notice'>You get some of \the [src] on your hands.</span>"
|
||||
if (!user.blood_DNA)
|
||||
user.blood_DNA = list()
|
||||
user.blood_DNA |= blood_DNA.Copy()
|
||||
user.bloody_hands += taken
|
||||
user.hand_blood_color = basecolor
|
||||
user.update_inv_gloves(1)
|
||||
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
|
||||
/obj/effect/decal/cleanable/blood/splatter
|
||||
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
|
||||
amount = 2
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip
|
||||
name = "drips of blood"
|
||||
desc = "It's red."
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/drip.dmi'
|
||||
icon_state = "1"
|
||||
random_icon_states = list("1","2","3","4","5")
|
||||
amount = 0
|
||||
var/list/drips = list()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip/New()
|
||||
..()
|
||||
spawn(1)
|
||||
drips |= icon_state
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing
|
||||
icon_state = "tracks"
|
||||
@@ -103,236 +138,16 @@
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing/New()
|
||||
..()
|
||||
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
|
||||
random_icon_states.Remove(W.icon_state)
|
||||
icon_state = pick(random_icon_states)
|
||||
if(random_icon_states.len)
|
||||
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
|
||||
random_icon_states.Remove(W.icon_state)
|
||||
icon_state = pick(random_icon_states)
|
||||
else
|
||||
icon_state = "writing1"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/writing/examine()
|
||||
..()
|
||||
usr << "It reads: <font color='#600000'>\"[message]\"<font>"
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/green
|
||||
name = "green blood"
|
||||
desc = "It's green and gooey. Perhaps it's the chef's cooking?"
|
||||
icon_state = "xfloor1"
|
||||
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/green/Crossed(mob/living/carbon/human/perp)
|
||||
if (!istype(perp))
|
||||
return
|
||||
if(amount < 1)
|
||||
return
|
||||
|
||||
var/datum/organ/external/l_foot = perp.get_organ("l_foot")
|
||||
var/datum/organ/external/r_foot = perp.get_organ("r_foot")
|
||||
var/hasfeet = 1
|
||||
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
||||
hasfeet = 0
|
||||
if(perp.shoes && !perp.buckled)//Adding blood to shoes
|
||||
perp.shoes:track_blood_green= max(amount,perp.shoes:track_blood_green) //Adding blood to shoes
|
||||
if(!perp.shoes.blood_overlay)
|
||||
perp.shoes.blood_overlay_color = 1
|
||||
perp.shoes.generate_blood_overlay()
|
||||
if(!perp.shoes.blood_DNA)
|
||||
perp.shoes.blood_DNA = list()
|
||||
perp.shoes.overlays += perp.shoes.blood_overlay
|
||||
perp.update_inv_shoes(1,1)
|
||||
perp.shoes.blood_DNA |= blood_DNA.Copy()
|
||||
else if (hasfeet)//Or feet
|
||||
perp.track_blood_green = max(amount,perp.track_blood_green) //Or feet
|
||||
if(!perp.feet_blood_DNA)
|
||||
perp.feet_blood_DNA = list()
|
||||
perp.feet_blood_DNA |= blood_DNA.Copy()
|
||||
else if (perp.buckled && istype(perp.buckled, /obj/structure/stool/bed/chair/wheelchair))
|
||||
var/obj/structure/stool/bed/chair/wheelchair/W = perp.buckled
|
||||
W.bloodiness = 4
|
||||
|
||||
amount--
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip/green
|
||||
name = "drips of blood"
|
||||
desc = "It's green."
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/drip.dmi'
|
||||
icon_state = "g1"
|
||||
amount = 0
|
||||
|
||||
// The idea is to have 4 bits for coming and 4 for going.
|
||||
#define TRACKS_COMING_NORTH 1
|
||||
#define TRACKS_COMING_SOUTH 2
|
||||
#define TRACKS_COMING_EAST 4
|
||||
#define TRACKS_COMING_WEST 8
|
||||
#define TRACKS_GOING_NORTH 16
|
||||
#define TRACKS_GOING_SOUTH 32
|
||||
#define TRACKS_GOING_EAST 64
|
||||
#define TRACKS_GOING_WEST 128
|
||||
// 5 seconds
|
||||
#define TRACKS_CRUSTIFY_TIME 50
|
||||
|
||||
// Footprints, tire trails...
|
||||
/obj/effect/decal/cleanable/blood/tracks
|
||||
amount = 0
|
||||
random_icon_states = null
|
||||
var/dirs=0
|
||||
icon='icons/effects/footprints.dmi'
|
||||
var/coming_state="blood1"
|
||||
var/going_state="blood2"
|
||||
|
||||
|
||||
var/newtracks=0 // Cleared after every icon_update
|
||||
var/crustytracks=0 // Cleared after every icon_update
|
||||
|
||||
// dir = last wetting
|
||||
var/list/wet=list(
|
||||
"1"=0,
|
||||
"2"=0,
|
||||
"4"=0,
|
||||
"8"=0,
|
||||
"16"=0,
|
||||
"32"=0,
|
||||
"64"=0,
|
||||
"128"=0
|
||||
)
|
||||
|
||||
/**
|
||||
* Add tracks to an existing trail.
|
||||
*
|
||||
* @param DNA bloodDNA to add to collection.
|
||||
* @param comingdir Direction tracks come from, or 0.
|
||||
* @param goingdir Direction tracks are going to (or 0).
|
||||
*/
|
||||
proc/AddTracks(var/mob/living/carbon/human/H, var/list/DNA, var/comingdir, var/goingdir,var/typepath)
|
||||
if(typepath == /obj/effect/decal/cleanable/blood/tracks/footprints)
|
||||
if(H.species.bodyflags & FEET_CLAWS)
|
||||
coming_state="bloodclaw1"
|
||||
going_state="bloodclaw2"
|
||||
if(H.species.bodyflags & FEET_PADDED)
|
||||
coming_state="bloodpaw1"
|
||||
going_state="bloodpaw2"
|
||||
if(typepath == /obj/effect/decal/cleanable/blood/tracks/footprints/green)
|
||||
if(H.species.bodyflags & FEET_CLAWS)
|
||||
coming_state="xenoclaw1"
|
||||
going_state="xenoclaw2"
|
||||
if(H.species.bodyflags & FEET_PADDED)
|
||||
coming_state="xenopaw1"
|
||||
going_state="xenopaw2"
|
||||
else
|
||||
coming_state="xeno1"
|
||||
going_state="xeno2"
|
||||
|
||||
|
||||
var/updated=0
|
||||
// Shift our goingdir 4 spaces to the left so it's in the GOING bitblock.
|
||||
var/realgoing=goingdir<<4
|
||||
|
||||
// Current bit
|
||||
var/b=0
|
||||
|
||||
// When tracks will start to dry out
|
||||
var/t=world.time + TRACKS_CRUSTIFY_TIME
|
||||
|
||||
// Process 4 bits
|
||||
for(var/bi=0;bi<4;bi++)
|
||||
b=1<<bi
|
||||
// COMING BIT
|
||||
if(comingdir&b && wet["[b]"]!=t)
|
||||
if(!(dirs&b))
|
||||
newtracks|=b
|
||||
wet["[b]"]=t
|
||||
updated=1
|
||||
else
|
||||
if(wet["[b]"]<world.time && !(crustytracks&b))
|
||||
updated=1
|
||||
|
||||
// GOING BIT (shift up 4)
|
||||
b=b<<4
|
||||
if(realgoing&b && wet["[b]"]!=t)
|
||||
if(!(dirs&b))
|
||||
newtracks|=b
|
||||
wet["[b]"]=t
|
||||
updated=1
|
||||
else
|
||||
if(wet["[b]"]<world.time && !(crustytracks&b))
|
||||
updated=1
|
||||
|
||||
dirs |= comingdir|realgoing
|
||||
blood_DNA |= DNA.Copy()
|
||||
if(updated)
|
||||
update_icon()
|
||||
|
||||
process()
|
||||
return PROCESS_KILL // Do not process us or we'll lag like hell.
|
||||
|
||||
update_icon()
|
||||
// Clear everything.
|
||||
//overlays.Cut()
|
||||
var/b=0
|
||||
|
||||
var/t=world.time
|
||||
var/crusty=0
|
||||
// Clear out any images that have been wetted or have crustified.
|
||||
for(var/image/overlay in overlays)
|
||||
b=overlay.dir
|
||||
if(overlay.icon_state==going_state)
|
||||
b=b<<4
|
||||
if(wet["[b]"]<t && !(crustytracks&b)) // NEW crusty ones get special treatment
|
||||
crusty|=b
|
||||
if(wet["[b]"]>t || crusty&b) // Wet or crusty? Nuke'em either way.
|
||||
overlays.Remove(overlay)
|
||||
newtracks |= b // Mark as needing an update.
|
||||
|
||||
// Update ONLY the overlays that have changed.
|
||||
for(var/bi=0;bi<4;bi++)
|
||||
// COMING
|
||||
b=1<<bi
|
||||
// New or crusty
|
||||
if(newtracks&b)
|
||||
var/icon/I= new /icon(icon, icon_state=coming_state, dir=num2dir(b))
|
||||
// If crusty, make them look crusty.
|
||||
if(crusty&b)
|
||||
I.SetIntensity(0.7)
|
||||
crustytracks |= b // Crusty? Don't update unless wetted again.
|
||||
else
|
||||
crustytracks &= ~b // Unmark as crusty.
|
||||
// Add to overlays
|
||||
overlays += I
|
||||
// GOING
|
||||
b=b<<4
|
||||
if(newtracks&b)
|
||||
var/icon/I= new /icon(icon, icon_state=going_state, dir=num2dir(b>>4))
|
||||
if(crusty&b)
|
||||
I.SetIntensity(0.7)
|
||||
crustytracks |= b // Crusty? Don't update unless wetted again.
|
||||
else
|
||||
crustytracks &= ~b // Unmark as crusty.
|
||||
overlays += I
|
||||
newtracks=0 // Clear our memory of updated tracks.
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/footprints
|
||||
name = "bloody footprints"
|
||||
desc = "Whoops..."
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/footprints/green
|
||||
name = "bloody green footprints"
|
||||
desc = "Whoops..."
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/wheels
|
||||
icon_state = "tracks"
|
||||
desc = "They look like tracks left by wheels."
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
gender = PLURAL
|
||||
random_icon_states = null
|
||||
amount = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip
|
||||
name = "drips of blood"
|
||||
desc = "It's red."
|
||||
gender = PLURAL
|
||||
icon = 'icons/effects/drip.dmi'
|
||||
icon_state = "1"
|
||||
amount = 0
|
||||
/obj/effect/decal/cleanable/blood/writing/examine(mob/user)
|
||||
..(user)
|
||||
user << "It reads: <font color='[basecolor]'>\"[message]\"<font>"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs
|
||||
name = "gibs"
|
||||
@@ -344,6 +159,22 @@
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "gibbl5"
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6")
|
||||
var/fleshcolor = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/update_icon()
|
||||
|
||||
var/image/giblets = new(base_icon, "[icon_state]_flesh", dir)
|
||||
if(!fleshcolor || fleshcolor == "rainbow")
|
||||
fleshcolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
|
||||
giblets.color = fleshcolor
|
||||
|
||||
var/icon/blood = new(base_icon,"[icon_state]",dir)
|
||||
if(basecolor == "rainbow") basecolor = "#[pick(list("FF0000","FF7F00","FFFF00","00FF00","0000FF","4B0082","8F00FF"))]"
|
||||
blood.Blend(basecolor,ICON_MULTIPLY)
|
||||
|
||||
icon = blood
|
||||
overlays.Cut()
|
||||
overlays += giblets
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/up
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
|
||||
@@ -362,15 +193,20 @@
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
new /obj/effect/decal/cleanable/blood/splatter(src.loc)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
|
||||
b.basecolor = src.basecolor
|
||||
b.update_icon()
|
||||
for(var/datum/disease2/disease/D in src.viruses)
|
||||
var/datum/disease2/disease/ND = D.getcopy()
|
||||
b.viruses += ND
|
||||
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/mucus
|
||||
@@ -383,6 +219,7 @@
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "mucus"
|
||||
random_icon_states = list("mucus")
|
||||
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
var/dry=0 // Keeps the lag down
|
||||
|
||||
@@ -396,29 +233,4 @@
|
||||
// basecolor="#030303"
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "floor1"
|
||||
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
||||
|
||||
/obj/effect/decal/cleanable/blood/old
|
||||
name = "dried blood"
|
||||
desc = "Looks like it's been here a while. Eew."
|
||||
|
||||
/obj/effect/decal/cleanable/blood/old/New()
|
||||
..()
|
||||
icon_state += "-old"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/old
|
||||
name = "old rotting gibs"
|
||||
desc = "Oh god, why didn't anyone clean this up? It smells terrible."
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/old/New()
|
||||
..()
|
||||
icon_state += "-old"
|
||||
dir = pick(1,2,4,8)
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/old
|
||||
name = "crusty dried vomit"
|
||||
desc = "You try not to look at the chunks, and fail."
|
||||
|
||||
/obj/effect/decal/cleanable/vomit/old/New()
|
||||
..()
|
||||
icon_state += "-old"
|
||||
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
||||
@@ -1,25 +1,26 @@
|
||||
// Note: BYOND is object oriented. There is no reason for this to be copy/pasted blood code.
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot
|
||||
name = "robot debris"
|
||||
desc = "It's a useless heap of junk... <i>or is it?</i>"
|
||||
gender = PLURAL
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 2
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "gib1"
|
||||
basecolor="#030303"
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/proc/streak(var/list/directions)
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
|
||||
color = "#FFFFFF"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
|
||||
spawn (0)
|
||||
var/direction = pick(directions)
|
||||
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
|
||||
sleep(3)
|
||||
if (i > 0)
|
||||
if (prob(40))
|
||||
/*var/obj/effect/decal/cleanable/oil/o =*/
|
||||
new /obj/effect/decal/cleanable/oil/streak(src.loc)
|
||||
var/obj/effect/decal/cleanable/blood/oil/streak = new(src.loc)
|
||||
streak.update_icon()
|
||||
else if (prob(10))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
@@ -27,26 +28,23 @@
|
||||
if (step_to(src, get_step(src, direction), 0))
|
||||
break
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/limb
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/limb
|
||||
random_icon_states = list("gibarm", "gibleg")
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/up
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/up
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibup1","gibup1") //2:7 is close enough to 1:4
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/down
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/down
|
||||
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7","gibdown1","gibdown1") //2:7 is close enough to 1:4
|
||||
|
||||
/obj/effect/decal/cleanable/oil
|
||||
/obj/effect/decal/cleanable/blood/oil
|
||||
name = "motor oil"
|
||||
desc = "It's black and greasy. Looks like Beepsky made another mess."
|
||||
gender = PLURAL
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 2
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "floor1"
|
||||
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
|
||||
basecolor="#030303"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/oil/streak
|
||||
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
|
||||
/obj/effect/decal/cleanable/blood/oil/streak
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
@@ -0,0 +1,165 @@
|
||||
// Stolen en masse from N3X15 of /vg/station with much gratitude.
|
||||
|
||||
// The idea is to have 4 bits for coming and 4 for going.
|
||||
#define TRACKS_COMING_NORTH 1
|
||||
#define TRACKS_COMING_SOUTH 2
|
||||
#define TRACKS_COMING_EAST 4
|
||||
#define TRACKS_COMING_WEST 8
|
||||
#define TRACKS_GOING_NORTH 16
|
||||
#define TRACKS_GOING_SOUTH 32
|
||||
#define TRACKS_GOING_EAST 64
|
||||
#define TRACKS_GOING_WEST 128
|
||||
|
||||
// 5 seconds
|
||||
#define TRACKS_CRUSTIFY_TIME 50
|
||||
|
||||
// color-dir-dry
|
||||
var/global/list/image/fluidtrack_cache=list()
|
||||
|
||||
/datum/fluidtrack
|
||||
var/direction=0
|
||||
var/basecolor="#A10808"
|
||||
var/wet=0
|
||||
var/fresh=1
|
||||
var/crusty=0
|
||||
var/image/overlay
|
||||
|
||||
New(_direction,_color,_wet)
|
||||
src.direction=_direction
|
||||
src.basecolor=_color
|
||||
src.wet=_wet
|
||||
|
||||
// Footprints, tire trails...
|
||||
/obj/effect/decal/cleanable/blood/tracks
|
||||
amount = 0
|
||||
random_icon_states = null
|
||||
var/dirs=0
|
||||
icon = 'icons/effects/fluidtracks.dmi'
|
||||
icon_state = ""
|
||||
var/coming_state="blood1"
|
||||
var/going_state="blood2"
|
||||
var/updatedtracks=0
|
||||
|
||||
// dir = id in stack
|
||||
var/list/setdirs=list(
|
||||
"1"=0,
|
||||
"2"=0,
|
||||
"4"=0,
|
||||
"8"=0,
|
||||
"16"=0,
|
||||
"32"=0,
|
||||
"64"=0,
|
||||
"128"=0
|
||||
)
|
||||
|
||||
// List of laid tracks and their colors.
|
||||
var/list/datum/fluidtrack/stack=list()
|
||||
|
||||
/**
|
||||
* Add tracks to an existing trail.
|
||||
*
|
||||
* @param DNA bloodDNA to add to collection.
|
||||
* @param comingdir Direction tracks come from, or 0.
|
||||
* @param goingdir Direction tracks are going to (or 0).
|
||||
* @param bloodcolor Color of the blood when wet.
|
||||
*/
|
||||
proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808")
|
||||
var/updated=0
|
||||
// Shift our goingdir 4 spaces to the left so it's in the GOING bitblock.
|
||||
var/realgoing=goingdir<<4
|
||||
|
||||
// Current bit
|
||||
var/b=0
|
||||
|
||||
// When tracks will start to dry out
|
||||
var/t=world.time + TRACKS_CRUSTIFY_TIME
|
||||
|
||||
var/datum/fluidtrack/track
|
||||
|
||||
// Process 4 bits
|
||||
for(var/bi=0;bi<4;bi++)
|
||||
b=1<<bi
|
||||
// COMING BIT
|
||||
// If setting
|
||||
if(comingdir&b)
|
||||
// If not wet or not set
|
||||
if(dirs&b)
|
||||
var/sid=setdirs["[b]"]
|
||||
track=stack[sid]
|
||||
if(track.wet==t && track.basecolor==bloodcolor)
|
||||
continue
|
||||
// Remove existing stack entry
|
||||
stack.Remove(track)
|
||||
track=new /datum/fluidtrack(b,bloodcolor,t)
|
||||
stack.Add(track)
|
||||
setdirs["[b]"]=stack.Find(track)
|
||||
updatedtracks |= b
|
||||
updated=1
|
||||
|
||||
// GOING BIT (shift up 4)
|
||||
b=b<<4
|
||||
if(realgoing&b)
|
||||
// If not wet or not set
|
||||
if(dirs&b)
|
||||
var/sid=setdirs["[b]"]
|
||||
track=stack[sid]
|
||||
if(track.wet==t && track.basecolor==bloodcolor)
|
||||
continue
|
||||
// Remove existing stack entry
|
||||
stack.Remove(track)
|
||||
track=new /datum/fluidtrack(b,bloodcolor,t)
|
||||
stack.Add(track)
|
||||
setdirs["[b]"]=stack.Find(track)
|
||||
updatedtracks |= b
|
||||
updated=1
|
||||
|
||||
dirs |= comingdir|realgoing
|
||||
blood_DNA |= DNA.Copy()
|
||||
if(updated)
|
||||
update_icon()
|
||||
|
||||
update_icon()
|
||||
overlays.Cut()
|
||||
color = "#FFFFFF"
|
||||
var/truedir=0
|
||||
|
||||
// Update ONLY the overlays that have changed.
|
||||
for(var/datum/fluidtrack/track in stack)
|
||||
var/stack_idx=setdirs["[track.direction]"]
|
||||
var/state=coming_state
|
||||
truedir=track.direction
|
||||
if(truedir&240) // Check if we're in the GOING block
|
||||
state=going_state
|
||||
truedir=truedir>>4
|
||||
|
||||
if(track.overlay)
|
||||
track.overlay=null
|
||||
var/image/I = image(icon, icon_state=state, dir=num2dir(truedir))
|
||||
I.color = track.basecolor
|
||||
|
||||
track.fresh=0
|
||||
track.overlay=I
|
||||
stack[stack_idx]=track
|
||||
overlays += I
|
||||
updatedtracks=0 // Clear our memory of updated tracks.
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/footprints
|
||||
name = "wet footprints"
|
||||
dryname = "dried footprints"
|
||||
desc = "Whoops..."
|
||||
drydesc = "Whoops..."
|
||||
coming_state = "human1"
|
||||
going_state = "human2"
|
||||
amount = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/wheels
|
||||
name = "wet tracks"
|
||||
dryname = "dried tracks"
|
||||
desc = "Whoops..."
|
||||
drydesc = "Whoops..."
|
||||
coming_state = "wheels"
|
||||
going_state = ""
|
||||
desc = "They look like tracks left by wheels."
|
||||
gender = PLURAL
|
||||
random_icon_states = null
|
||||
amount = 0
|
||||
@@ -17,7 +17,7 @@
|
||||
..()
|
||||
|
||||
xeno
|
||||
gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/up,/obj/effect/decal/cleanable/xenoblood/xgibs/down,/obj/effect/decal/cleanable/xenoblood/xgibs,/obj/effect/decal/cleanable/xenoblood/xgibs,/obj/effect/decal/cleanable/xenoblood/xgibs/body,/obj/effect/decal/cleanable/xenoblood/xgibs/limb,/obj/effect/decal/cleanable/xenoblood/xgibs/core)
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/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)
|
||||
|
||||
New()
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
robot
|
||||
sparks = 1
|
||||
gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up,/obj/effect/decal/cleanable/robot_debris/down,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris,/obj/effect/decal/cleanable/robot_debris/limb)
|
||||
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)
|
||||
|
||||
New()
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
icon = 'icons/obj/items.dmi'
|
||||
var/discrete = 0 // used in item_attack.dm to make an item not show an attack message to viewers
|
||||
var/no_embed = 0 // For use in item_attack.dm
|
||||
var/icon/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
|
||||
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
|
||||
var/blood_overlay_color = null
|
||||
var/item_state = null
|
||||
var/r_speed = 1.0
|
||||
@@ -675,35 +675,29 @@
|
||||
|
||||
//if we haven't made our blood_overlay already
|
||||
if( !blood_overlay )
|
||||
if(M.species.bloodflags & BLOOD_GREEN)
|
||||
generate_blood_overlay(1)
|
||||
else
|
||||
generate_blood_overlay()
|
||||
generate_blood_overlay()
|
||||
|
||||
//apply the blood-splatter overlay if it isn't already in there
|
||||
if(!blood_DNA.len)
|
||||
blood_overlay.color = blood_color
|
||||
overlays += blood_overlay
|
||||
|
||||
//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.
|
||||
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
if(istype(M))
|
||||
if(blood_DNA[M.dna.unique_enzymes])
|
||||
return 0 //already bloodied with this blood. Cannot add more.
|
||||
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
return 1 //we applied blood to the item
|
||||
|
||||
/obj/item/proc/generate_blood_overlay(blood_overlay_color)
|
||||
/obj/item/proc/generate_blood_overlay()
|
||||
if(blood_overlay)
|
||||
return
|
||||
|
||||
var/icon/I = new /icon(icon, icon_state)
|
||||
I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent)
|
||||
if (blood_overlay_color == 1)
|
||||
I.Blend(new /icon('icons/effects/blood.dmi', "xitemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
|
||||
else
|
||||
I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
|
||||
I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
|
||||
|
||||
//not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made.
|
||||
for(var/obj/item/A in world)
|
||||
if(A.type == type && !A.blood_overlay)
|
||||
A.blood_overlay = image(I)
|
||||
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
if(wet_overlay)
|
||||
overlays -= wet_overlay
|
||||
|
||||
/turf/simulated/proc/AddTracks(var/typepath,var/mob,var/bloodDNA,var/comingdir,var/goingdir)
|
||||
/turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808")
|
||||
var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src
|
||||
if(!tracks)
|
||||
tracks = new typepath(src)
|
||||
tracks.AddTracks(mob,bloodDNA,comingdir,goingdir,typepath)
|
||||
tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor)
|
||||
|
||||
/turf/simulated/Entered(atom/A, atom/OL)
|
||||
|
||||
@@ -77,40 +77,29 @@
|
||||
else
|
||||
playsound(src, "jackboot", 20, 1)
|
||||
|
||||
|
||||
// Tracking blood
|
||||
var/list/bloodDNA = null
|
||||
var/bloodcolor=""
|
||||
if(H.shoes)
|
||||
var/obj/item/clothing/shoes/S = H.shoes
|
||||
if(S.track_blood && S.blood_DNA)
|
||||
bloodDNA = S.blood_DNA
|
||||
bloodcolor=S.blood_color
|
||||
S.track_blood--
|
||||
src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,H,bloodDNA,H.dir,0) // Coming
|
||||
var/turf/simulated/from = get_step(H,reverse_direction(H.dir))
|
||||
if(from && istype(from, /turf/simulated))
|
||||
from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,H,bloodDNA,0,H.dir) // Going
|
||||
|
||||
if(S.track_blood_green && S.blood_DNA)
|
||||
bloodDNA = S.blood_DNA
|
||||
S.track_blood_green--
|
||||
src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/green,H,bloodDNA,H.dir,0) // Coming
|
||||
var/turf/simulated/from = get_step(H,reverse_direction(H.dir))
|
||||
if(from && istype(from, /turf/simulated))
|
||||
from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/green,H,bloodDNA,0,H.dir) // Going
|
||||
else
|
||||
if(H.track_blood && H.feet_blood_DNA)
|
||||
bloodDNA = H.feet_blood_DNA
|
||||
bloodcolor=H.feet_blood_color
|
||||
H.track_blood--
|
||||
src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,H,bloodDNA,H.dir,0) // Coming
|
||||
var/turf/simulated/from = get_step(H,reverse_direction(H.dir))
|
||||
if(from && istype(from, /turf/simulated))
|
||||
from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,H,bloodDNA,0,H.dir) // Going
|
||||
if(H.track_blood_green && H.feet_blood_DNA)
|
||||
bloodDNA = H.feet_blood_DNA
|
||||
H.track_blood_green--
|
||||
src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/green,H,bloodDNA,H.dir,0) // Coming
|
||||
var/turf/simulated/from = get_step(H,reverse_direction(H.dir))
|
||||
if(from && istype(from, /turf/simulated))
|
||||
from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/green,H,bloodDNA,0,H.dir) // Going
|
||||
bloodDNA = null
|
||||
|
||||
if (bloodDNA)
|
||||
src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,H.dir,0,bloodcolor) // Coming
|
||||
var/turf/simulated/from = get_step(H,reverse_direction(H.dir))
|
||||
if(istype(from) && from)
|
||||
from.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,0,H.dir,bloodcolor) // Going
|
||||
|
||||
bloodDNA = null
|
||||
|
||||
var/noslip = 0
|
||||
for (var/obj/structure/stool/bed/chair/C in loc)
|
||||
@@ -187,53 +176,23 @@
|
||||
if (!..())
|
||||
return 0
|
||||
|
||||
for(var/obj/effect/decal/cleanable/blood/B in contents)
|
||||
if(!B.blood_DNA[M.dna.unique_enzymes])
|
||||
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
B.virus2 = virus_copylist(M.virus2)
|
||||
if(istype(M))
|
||||
for(var/obj/effect/decal/cleanable/blood/B in contents)
|
||||
if(!B.blood_DNA[M.dna.unique_enzymes])
|
||||
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
B.virus2 = virus_copylist(M.virus2)
|
||||
return 1 //we bloodied the floor
|
||||
blood_splatter(src,M.get_blood(M.vessel),1)
|
||||
return 1 //we bloodied the floor
|
||||
|
||||
|
||||
|
||||
//if there isn't a blood decal already, make one.
|
||||
if(M.species.bloodflags &BLOOD_GREEN)
|
||||
var/obj/effect/decal/cleanable/blood/green/newblood = new /obj/effect/decal/cleanable/blood/green(src)
|
||||
newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
newblood.virus2 = virus_copylist(M.virus2)
|
||||
newblood.update_icon()
|
||||
else
|
||||
var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(src)
|
||||
newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
newblood.virus2 = virus_copylist(M.virus2)
|
||||
newblood.update_icon()
|
||||
|
||||
return 1 //we bloodied the floor
|
||||
|
||||
return 0
|
||||
|
||||
// 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/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.species.bloodflags &BLOOD_GREEN)
|
||||
var/obj/effect/decal/cleanable/blood/green/this = new /obj/effect/decal/cleanable/blood/green(src)
|
||||
this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
if (M.virus2.len)
|
||||
this.virus2 = virus_copylist(M.virus2)
|
||||
else
|
||||
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src)
|
||||
this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
if (M.virus2.len)
|
||||
this.virus2 = virus_copylist(M.virus2)
|
||||
if(istype(M, /mob/living/carbon/monkey))
|
||||
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src)
|
||||
this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
if (M.virus2.len)
|
||||
this.virus2 = virus_copylist(M.virus2)
|
||||
|
||||
blood_splatter(src,M,1)
|
||||
else if( istype(M, /mob/living/carbon/alien ))
|
||||
var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(src)
|
||||
var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src)
|
||||
this.blood_DNA["UNKNOWN BLOOD"] = "X*"
|
||||
|
||||
else if( istype(M, /mob/living/silicon/robot ))
|
||||
new /obj/effect/decal/cleanable/oil(src)
|
||||
new /obj/effect/decal/cleanable/blood/oil(src)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
var/track_blood = 0
|
||||
var/list/feet_blood_DNA
|
||||
var/track_blood_type
|
||||
var/track_blood_green = 0
|
||||
var/feet_blood_color
|
||||
|
||||
/obj/item/clothing/gloves
|
||||
var/transfer_blood = 0
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
/obj/item/clothing/shoes/
|
||||
var/track_blood = 0
|
||||
var/track_blood_green = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag
|
||||
name = "damp rag"
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
)
|
||||
fluffitems = list(
|
||||
/obj/effect/decal/remains/human = 5,
|
||||
/obj/effect/decal/cleanable/xenoblood = 5,
|
||||
/obj/effect/decal/cleanable/blood/xeno = 5,
|
||||
/obj/effect/decal/mecha_wreckage/ripley = 1
|
||||
)
|
||||
complex_max_size=6
|
||||
|
||||
@@ -20,12 +20,12 @@
|
||||
if(prob(100 - E.get_damage()))
|
||||
// Override the current limb status and don't cause an explosion
|
||||
E.droplimb(1,1)
|
||||
|
||||
|
||||
if(!(species.flags & IS_SYNTHETIC))
|
||||
flick("gibbed-h", animation)
|
||||
hgibs(loc, viruses, dna)
|
||||
else
|
||||
new /obj/effect/decal/cleanable/robot_debris(src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
@@ -115,7 +115,7 @@
|
||||
if(ticker && ticker.mode)
|
||||
if(istype(ticker.mode,/datum/game_mode/heist))
|
||||
vox_kills++ //Bad vox. Shouldn't be killing humans.
|
||||
|
||||
|
||||
if(ishuman(LAssailant))
|
||||
var/mob/living/carbon/human/H=LAssailant
|
||||
if(H.mind)
|
||||
|
||||
@@ -1254,16 +1254,15 @@
|
||||
if(blood_DNA[M.dna.unique_enzymes])
|
||||
return 0 //already bloodied with this blood. Cannot add more.
|
||||
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
if(M.species.bloodflags & BLOOD_GREEN)
|
||||
src.update_inv_gloves(1,1) //handles bloody hands overlays and updating
|
||||
else
|
||||
src.update_inv_gloves(1,0)
|
||||
hand_blood_color = blood_color
|
||||
src.update_inv_gloves()
|
||||
verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
return 1 //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)
|
||||
feet_blood_color = null
|
||||
del(feet_blood_DNA)
|
||||
update_inv_shoes(1)
|
||||
return 1
|
||||
|
||||
@@ -50,9 +50,9 @@
|
||||
|
||||
var/icon/stand_icon = null
|
||||
var/icon/lying_icon = null
|
||||
|
||||
|
||||
var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life()
|
||||
|
||||
|
||||
var/speech_problem_flag = 0
|
||||
|
||||
var/miming = null //Toggle for the mime's abilities.
|
||||
@@ -64,6 +64,8 @@
|
||||
var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
|
||||
var/list/bad_external_organs = list()// organs we check until they are good.
|
||||
|
||||
var/hand_blood_color
|
||||
|
||||
var/xylophone = 0 //For the spoooooooky xylophone cooldown
|
||||
|
||||
var/mob/remoteview_target = null
|
||||
|
||||
@@ -610,10 +610,9 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
standing.icon = w_uniform.sprite_sheets[species.name]
|
||||
|
||||
if(w_uniform.blood_DNA)
|
||||
if(green==1)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "xuniformblood")
|
||||
else
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood")
|
||||
bloodsies.color = w_uniform.blood_color
|
||||
standing.overlays += bloodsies
|
||||
|
||||
if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE.
|
||||
for(var/obj/item/clothing/accessory/A in w_uniform:accessories)
|
||||
@@ -666,18 +665,16 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]")
|
||||
|
||||
if(gloves.blood_DNA)
|
||||
if(green==1)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "xbloodyhands")
|
||||
else
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
bloodsies.color = gloves.blood_color
|
||||
standing.overlays += bloodsies
|
||||
gloves.screen_loc = ui_gloves
|
||||
overlays_standing[GLOVES_LAYER] = standing
|
||||
else
|
||||
if(blood_DNA)
|
||||
if (green)
|
||||
overlays_standing[GLOVES_LAYER] = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "xbloodyhands")
|
||||
else
|
||||
overlays_standing[GLOVES_LAYER] = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "bloodyhands")
|
||||
bloodsies.color = hand_blood_color
|
||||
overlays_standing[GLOVES_LAYER] = bloodsies
|
||||
else
|
||||
overlays_standing[GLOVES_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
@@ -738,14 +735,19 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
else
|
||||
standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]")
|
||||
|
||||
|
||||
if(shoes.blood_DNA)
|
||||
if(green==1)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "xshoeblood")
|
||||
else
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
|
||||
overlays_standing[SHOES_LAYER] = standing
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
|
||||
bloodsies.color = shoes.blood_color
|
||||
standing.overlays += bloodsies
|
||||
overlays_standing[SHOES_LAYER] = standing
|
||||
else
|
||||
overlays_standing[SHOES_LAYER] = null
|
||||
if(feet_blood_DNA)
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "shoeblood")
|
||||
bloodsies.color = feet_blood_color
|
||||
overlays_standing[SHOES_LAYER] = bloodsies
|
||||
else
|
||||
overlays_standing[SHOES_LAYER] = null
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/update_inv_s_store(var/update_icons=1)
|
||||
@@ -778,10 +780,9 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
|
||||
|
||||
if(head.blood_DNA)
|
||||
if(green==1)
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "xhelmetblood")
|
||||
else
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood")
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "helmetblood")
|
||||
bloodsies.color = head.blood_color
|
||||
standing.overlays += bloodsies
|
||||
overlays_standing[HEAD_LAYER] = standing
|
||||
|
||||
|
||||
@@ -831,19 +832,12 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
drop_l_hand()
|
||||
drop_r_hand()
|
||||
|
||||
if(wear_suit.blood_DNA)
|
||||
var/t_state
|
||||
if( istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/wcoat) )
|
||||
t_state = "armor"
|
||||
else if( istype(wear_suit, /obj/item/clothing/suit/storage/det_suit || /obj/item/clothing/suit/storage/labcoat) )
|
||||
t_state = "coat"
|
||||
else
|
||||
t_state = "suit"
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_state]blood")
|
||||
|
||||
if(wear_suit.blood_DNA)
|
||||
var/obj/item/clothing/suit/S = wear_suit
|
||||
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood")
|
||||
if(wear_suit.blood_DNA)
|
||||
var/obj/item/clothing/suit/S = wear_suit
|
||||
var/image/bloodsies = image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[S.blood_overlay_type]blood")
|
||||
bloodsies.color = wear_suit.blood_color
|
||||
standing.overlays += bloodsies
|
||||
|
||||
|
||||
overlays_standing[SUIT_LAYER] = standing
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
//Used in icon caching.
|
||||
var/race_key = 0
|
||||
var/icon/icon_template
|
||||
|
||||
|
||||
// Language/culture vars.
|
||||
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
|
||||
var/language = "Galactic Common" // Default racial language, if any.
|
||||
@@ -71,7 +71,7 @@
|
||||
/datum/species/proc/get_random_name(var/gender)
|
||||
var/datum/language/species_language = all_languages[language]
|
||||
return species_language.get_random_name(gender)
|
||||
|
||||
|
||||
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
|
||||
//This is a basic humanoid limb setup.
|
||||
H.organs = list()
|
||||
@@ -255,7 +255,7 @@
|
||||
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
|
||||
handle_dna(C)
|
||||
return
|
||||
|
||||
|
||||
/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init.
|
||||
return
|
||||
|
||||
@@ -273,7 +273,7 @@
|
||||
|
||||
/datum/species/proc/equip(var/mob/living/carbon/human/H)
|
||||
return
|
||||
|
||||
|
||||
/datum/species/proc/can_understand(var/mob/other)
|
||||
return
|
||||
|
||||
@@ -303,7 +303,7 @@
|
||||
unarmed_type = /datum/unarmed_attack/claws
|
||||
primitive = /mob/living/carbon/monkey/unathi
|
||||
darksight = 3
|
||||
|
||||
|
||||
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
|
||||
Uuosa-Eso system, which roughly translates to 'burning mother'.<br/><br/>Coming from a harsh, radioactive \
|
||||
desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \
|
||||
@@ -336,7 +336,7 @@
|
||||
tail = "tajtail"
|
||||
unarmed_type = /datum/unarmed_attack/claws
|
||||
darksight = 8
|
||||
|
||||
|
||||
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
|
||||
S'randarr system. They have been brought up into the space age by the Humans and Skrell, and have been \
|
||||
influenced heavily by their long history of Slavemaster rule. They have a structured, clan-influenced way \
|
||||
@@ -372,7 +372,7 @@
|
||||
language = "Skrellian"
|
||||
primitive = /mob/living/carbon/monkey/skrell
|
||||
unarmed_type = /datum/unarmed_attack/punch
|
||||
|
||||
|
||||
blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
|
||||
the royals' or 'Light of the Crown'.<br/><br/>Skrell are a highly advanced and logical race who live under the rule \
|
||||
of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
|
||||
@@ -384,7 +384,7 @@
|
||||
bodyflags = HAS_SKIN_COLOR
|
||||
|
||||
flesh_color = "#8CD7A3"
|
||||
|
||||
blood_color = "#1D2CBF"
|
||||
reagent_tag = IS_SKRELL
|
||||
|
||||
/datum/species/vox
|
||||
@@ -392,14 +392,14 @@
|
||||
icobase = 'icons/mob/human_races/r_vox.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_vox.dmi'
|
||||
path = /mob/living/carbon/human/vox
|
||||
|
||||
|
||||
default_language = "Galactic Common"
|
||||
language = "Vox-pidgin"
|
||||
language = "Vox-pidgin"
|
||||
speech_sounds = list('sound/voice/shriek1.ogg')
|
||||
speech_chance = 20
|
||||
|
||||
|
||||
unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too.
|
||||
|
||||
|
||||
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
|
||||
scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \
|
||||
alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \
|
||||
@@ -421,6 +421,7 @@
|
||||
|
||||
flags = NO_SCAN | IS_WHITELISTED
|
||||
|
||||
blood_color = "#2299FC"
|
||||
flesh_color = "#808D11"
|
||||
|
||||
reagent_tag = IS_VOX
|
||||
@@ -549,13 +550,13 @@
|
||||
eyes = "grey_eyes_s"
|
||||
|
||||
brute_mod = 1.25 //greys are fragile
|
||||
|
||||
|
||||
default_genes = list(REMOTE_TALK)
|
||||
|
||||
primitive = /mob/living/carbon/monkey // TODO
|
||||
|
||||
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
|
||||
|
||||
|
||||
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
|
||||
if(!remove)
|
||||
C.dna.SetSEState(REMOTETALKBLOCK,1,1)
|
||||
@@ -588,7 +589,7 @@
|
||||
heat_level_1 = 300
|
||||
heat_level_2 = 350
|
||||
heat_level_3 = 700
|
||||
|
||||
|
||||
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
|
||||
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
|
||||
there is no effective upper limit to the number that can fuse in gestalt, and reports exist of the Epsilon Ursae \
|
||||
@@ -605,7 +606,7 @@
|
||||
flesh_color = "#907E4A"
|
||||
|
||||
reagent_tag = IS_DIONA
|
||||
|
||||
|
||||
/datum/species/diona/can_understand(var/mob/other)
|
||||
var/mob/living/carbon/monkey/diona/D = other
|
||||
if(istype(D))
|
||||
@@ -659,7 +660,7 @@
|
||||
synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC | NO_INTORGANS
|
||||
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#AAAAAA"
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -80,14 +80,14 @@
|
||||
wrapped = thing
|
||||
break
|
||||
|
||||
if(wrapped) //Already have an item.
|
||||
|
||||
if(wrapped) //Already have an item.
|
||||
|
||||
//Temporary put wrapped into user so target's attackby() checks pass.
|
||||
wrapped.loc = user
|
||||
|
||||
|
||||
//Pass the attack on to the target. This might delete/relocate wrapped.
|
||||
target.attackby(wrapped,user, params)
|
||||
|
||||
|
||||
//If wrapped did neither get deleted nor put into target, put it back into the gripper.
|
||||
if(wrapped && user && (wrapped.loc == user))
|
||||
wrapped.loc = src
|
||||
@@ -196,7 +196,7 @@
|
||||
D << "\red You carefully and thoroughly decompile your downed fellow, storing as much of its resources as you can within yourself."
|
||||
|
||||
del(M)
|
||||
new/obj/effect/decal/cleanable/oil(get_turf(src))
|
||||
new/obj/effect/decal/cleanable/blood/oil(get_turf(src))
|
||||
|
||||
stored_comms["metal"] += 15
|
||||
stored_comms["glass"] += 15
|
||||
@@ -233,7 +233,7 @@
|
||||
stored_comms["metal"]++
|
||||
stored_comms["plastic"]++
|
||||
stored_comms["plastic"]++
|
||||
else if(istype(W,/obj/effect/decal/cleanable/robot_debris))
|
||||
else if(istype(W,/obj/effect/decal/cleanable/blood/gibs/robot))
|
||||
stored_comms["metal"]++
|
||||
stored_comms["metal"]++
|
||||
stored_comms["glass"]++
|
||||
|
||||
@@ -562,7 +562,7 @@
|
||||
/mob/living/simple_animal/corgi/Ian/borgi/Die()
|
||||
..()
|
||||
visible_message("<b>[src]</b> blows apart!")
|
||||
new /obj/effect/decal/cleanable/robot_debris(src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
/mob/living/simple_animal/hostile/hivebot/Die()
|
||||
..()
|
||||
visible_message("<b>[src]</b> blows apart!")
|
||||
new /obj/effect/decal/cleanable/robot_debris(src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
@@ -36,8 +36,9 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
/mob/living/carbon/human/proc/fixblood()
|
||||
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_type"=dna.b_type, \
|
||||
B.data = list( "donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \
|
||||
"resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null)
|
||||
B.color = B.data["blood_colour"]
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/proc/handle_blood()
|
||||
@@ -171,30 +172,6 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
vessel.reaction(T, TOUCH, amm)
|
||||
return
|
||||
|
||||
if(src.species.bloodflags &BLOOD_GREEN)
|
||||
var/list/obj/effect/decal/cleanable/blood/drip/green/nums2 = list()
|
||||
iconL = list("g1","g2","g3","g4","g5")
|
||||
|
||||
vessel.remove_reagent("blood",amm)
|
||||
|
||||
for(var/obj/effect/decal/cleanable/blood/drip/green/G in T)
|
||||
nums2 += G
|
||||
iconL.Remove(G.icon_state)
|
||||
|
||||
if (nums2.len < 5)
|
||||
var/obj/effect/decal/cleanable/blood/drip/green/this = new(T)
|
||||
this.icon_state = pick(iconL)
|
||||
this.blood_DNA = list()
|
||||
this.blood_DNA[dna.unique_enzymes] = dna.b_type
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
this.virus2[ID] = V.getcopy()
|
||||
else
|
||||
for(var/obj/effect/decal/cleanable/blood/drip/green/G in nums)
|
||||
del G
|
||||
T.add_blood(src)
|
||||
return
|
||||
|
||||
else
|
||||
vessel.remove_reagent("blood",amm)
|
||||
|
||||
@@ -237,6 +214,13 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
B.data["antibodies"] = src.antibodies
|
||||
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
|
||||
B.data["blood_type"] = copytext(src.dna.b_type,1,0)
|
||||
|
||||
// Putting this here due to return shenanigans.
|
||||
if(istype(src,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
B.data["blood_colour"] = H.species.blood_color
|
||||
B.color = B.data["blood_colour"]
|
||||
|
||||
var/list/temp_chem = list()
|
||||
for(var/datum/reagent/R in src.reagents.reagent_list)
|
||||
temp_chem += R.id
|
||||
@@ -334,4 +318,62 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
if("O")
|
||||
if(donor_antigen != "O") return 1
|
||||
//AB is a universal receiver.
|
||||
return 0
|
||||
return 0
|
||||
|
||||
proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/B
|
||||
var/decal_type = /obj/effect/decal/cleanable/blood/splatter
|
||||
var/turf/T = get_turf(target)
|
||||
|
||||
if(istype(source,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/M = source
|
||||
source = M.get_blood(M.vessel)
|
||||
else if(istype(source,/mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/donor = source
|
||||
if(donor.dna)
|
||||
source = new()
|
||||
source.data["blood_DNA"] = donor.dna.unique_enzymes
|
||||
source.data["blood_type"] = donor.dna.b_type
|
||||
|
||||
// Are we dripping or splattering?
|
||||
var/list/drips = list()
|
||||
// Only a certain number of drips (or one large splatter) can be on a given turf.
|
||||
for(var/obj/effect/decal/cleanable/blood/drip/drop in T)
|
||||
drips |= drop.drips
|
||||
del(drop)
|
||||
if(!large && drips.len < 3)
|
||||
decal_type = /obj/effect/decal/cleanable/blood/drip
|
||||
|
||||
// Find a blood decal or create a new one.
|
||||
B = locate(decal_type) in T
|
||||
if(!B)
|
||||
B = new decal_type(T)
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/drip/drop = B
|
||||
if(istype(drop) && drips && drips.len && !large)
|
||||
drop.overlays |= drips
|
||||
drop.drips |= drips
|
||||
|
||||
// If there's no data to copy, call it quits here.
|
||||
if(!source)
|
||||
return B
|
||||
|
||||
// Update appearance.
|
||||
if(source.data["blood_colour"])
|
||||
B.basecolor = source.data["blood_colour"]
|
||||
B.update_icon()
|
||||
|
||||
// Update blood information.
|
||||
if(source.data["blood_DNA"])
|
||||
B.blood_DNA = list()
|
||||
if(source.data["blood_type"])
|
||||
B.blood_DNA[source.data["blood_DNA"]] = source.data["blood_type"]
|
||||
else
|
||||
B.blood_DNA[source.data["blood_DNA"]] = "O+"
|
||||
|
||||
// Update virus information.
|
||||
if(source.data["virus2"])
|
||||
B.virus2 = virus_copylist(source.data["virus2"])
|
||||
|
||||
return B
|
||||
@@ -43,11 +43,11 @@
|
||||
if(href_list["copy"])
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
|
||||
for(var/i = 0, i < copies, i++)
|
||||
if(toner <= 0)
|
||||
break
|
||||
|
||||
|
||||
if (istype(copyitem, /obj/item/weapon/paper))
|
||||
copy(copyitem)
|
||||
sleep(15)
|
||||
@@ -60,7 +60,7 @@
|
||||
else
|
||||
usr << "<span class='warning'>\The [copyitem] can't be copied by \the [src].</span>"
|
||||
break
|
||||
|
||||
|
||||
use_power(active_power_usage)
|
||||
updateUsrDialog()
|
||||
else if(href_list["remove"])
|
||||
@@ -81,7 +81,7 @@
|
||||
else if(href_list["aipic"])
|
||||
if(!istype(usr,/mob/living/silicon)) return
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
|
||||
|
||||
if(toner >= 5)
|
||||
var/mob/living/silicon/tempAI = usr
|
||||
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
|
||||
@@ -138,12 +138,12 @@
|
||||
del(src)
|
||||
else
|
||||
if(toner > 0)
|
||||
new /obj/effect/decal/cleanable/oil(get_turf(src))
|
||||
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
|
||||
toner = 0
|
||||
else
|
||||
if(prob(50))
|
||||
if(toner > 0)
|
||||
new /obj/effect/decal/cleanable/oil(get_turf(src))
|
||||
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
|
||||
toner = 0
|
||||
return
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
del(src)
|
||||
else
|
||||
if(toner > 0)
|
||||
new /obj/effect/decal/cleanable/oil(get_turf(src))
|
||||
new /obj/effect/decal/cleanable/blood/oil(get_turf(src))
|
||||
toner = 0
|
||||
return
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
toner = 0
|
||||
visible_message("<span class='notice'>A red light on \the [src] flashes, indicating that it is out of toner.</span>")
|
||||
break
|
||||
|
||||
|
||||
if(istype(W, /obj/item/weapon/paper))
|
||||
W = copy(W)
|
||||
else if(istype(W, /obj/item/weapon/photo))
|
||||
|
||||
@@ -92,6 +92,10 @@ datum
|
||||
holder.remove_reagent(src.id, custom_metabolism) //By default it slowly disappears.
|
||||
return
|
||||
|
||||
// Called when two reagents of the same are mixing.
|
||||
on_merge(var/data)
|
||||
return
|
||||
|
||||
on_move(var/mob/M)
|
||||
return
|
||||
|
||||
@@ -115,7 +119,7 @@ datum
|
||||
|
||||
|
||||
blood
|
||||
data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null, "antibodies" = null)
|
||||
data = new/list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"blood_colour"= "#A10808","resistances"=null,"trace_chem"=null, "antibodies" = null)
|
||||
name = "Blood"
|
||||
id = "blood"
|
||||
reagent_state = LIQUID
|
||||
@@ -138,6 +142,15 @@ datum
|
||||
var/mob/living/carbon/C = M
|
||||
C.antibodies |= self.data["antibodies"]
|
||||
|
||||
on_merge(var/data)
|
||||
if(data["blood_colour"])
|
||||
color = data["blood_colour"]
|
||||
return ..()
|
||||
|
||||
on_update(var/atom/A)
|
||||
if(data["blood_colour"])
|
||||
color = data["blood_colour"]
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
@@ -164,7 +177,7 @@ datum
|
||||
blood_prop.blood_DNA["Non-Human DNA"] = "A+"
|
||||
|
||||
else if(istype(self.data["donor"], /mob/living/carbon/alien))
|
||||
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
|
||||
var/obj/effect/decal/cleanable/blood/xeno/blood_prop = locate() in T
|
||||
if(!blood_prop)
|
||||
blood_prop = new(T)
|
||||
blood_prop.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*"
|
||||
|
||||
@@ -465,7 +465,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
new/obj/effect/decal/cleanable/oil(src.loc)
|
||||
new/obj/effect/decal/cleanable/blood/oil(src.loc)
|
||||
src.visible_message("<span class='notice'>The [src.name] has been squashed.</span>","<span class='moderate'>You hear a smack.</span>")
|
||||
src.reagents.reaction(get_turf(hit_atom))
|
||||
for(var/atom/A in get_turf(hit_atom))
|
||||
@@ -691,7 +691,7 @@
|
||||
var/list/turfs = new/list()
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats.
|
||||
new/obj/effect/decal/cleanable/oil(src.loc)
|
||||
new/obj/effect/decal/cleanable/blood/oil(src.loc)
|
||||
src.visible_message("<span class='notice'>The [src.name] has been squashed.</span>","<span class='moderate'>You hear a smack.</span>")
|
||||
del(src)
|
||||
return
|
||||
@@ -728,7 +728,7 @@
|
||||
sleep(1)
|
||||
s.set_up(3, 1, A)
|
||||
s.start()
|
||||
new/obj/effect/decal/cleanable/oil(src.loc)
|
||||
new/obj/effect/decal/cleanable/blood/oil(src.loc)
|
||||
src.visible_message("<span class='notice'>The [src.name] has been squashed, causing a distortion in space-time.</span>","<span class='moderate'>You hear a splat and a crackle.</span>")
|
||||
del(src)
|
||||
return
|
||||
|
||||
@@ -238,7 +238,7 @@
|
||||
return
|
||||
*/
|
||||
interact(user, 0)
|
||||
|
||||
|
||||
// hostile mob escape from disposals
|
||||
attack_animal(var/mob/living/simple_animal/M)
|
||||
if(M.environment_smash)
|
||||
@@ -1368,7 +1368,7 @@
|
||||
|
||||
src.streak(dirs)
|
||||
|
||||
/obj/effect/decal/cleanable/robot_debris/gib/pipe_eject(var/direction)
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/gib/pipe_eject(var/direction)
|
||||
var/list/dirs
|
||||
if(direction)
|
||||
dirs = list( direction, turn(direction, -45), turn(direction, 45))
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
healthcheck()
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/obj/vehicle/emag_act(user as mob)
|
||||
if(!emagged)
|
||||
Emag(user)
|
||||
@@ -108,7 +108,7 @@
|
||||
src.visible_message("\red <B>[M] has [M.attacktext] [src]!</B>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
|
||||
if(prob(10))
|
||||
new /obj/effect/decal/cleanable/oil(src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(src.loc)
|
||||
healthcheck()
|
||||
|
||||
/obj/vehicle/bullet_act(var/obj/item/projectile/Proj)
|
||||
@@ -214,7 +214,7 @@
|
||||
unload()
|
||||
|
||||
new /obj/effect/gibspawner/robot(Tsec)
|
||||
new /obj/effect/decal/cleanable/oil(src.loc)
|
||||
new /obj/effect/decal/cleanable/blood/oil(src.loc)
|
||||
|
||||
del(src)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user