Files
Fluffy b8902e2e16 Runtime map now loads in ~11 seconds instead of ~40, sped up various other things (#19957)
Runtime map now has a bunch of new areas / items with often-tested
stuffs, and some hard-to-put-at-runtime stuffs.
Runtime map jobs now are positioned to make it faster to reach the
aforementioned often-tested stuffs.
Runtime map doesn't generate an overmap anymore by default, which speeds
up the process.
Runtime map now loads in ~11 seconds instead of ~40 seconds as it was
before.
Updated the maploader to be faster in parsing maps.
Bapi is not engaged anymore if we're only measuring the map size, which
speeds up the process.
In fastboot we do not generate the codexes anymore, which speeds up the
process.
In fastboot and if exoplanets and away sites are not enabled, we do not
parse the map templates anymore, which speeds up the process.
Updated the icon smoothing to be faster.
Optimized cargo area code.
Other optimizations.
2024-10-06 21:31:01 +00:00

291 lines
8.4 KiB
Plaintext

#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var)
/obj/effect/decal/cleanable/blood
name = "blood"
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
icon = 'icons/effects/blood.dmi'
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()
color = COLOR_HUMAN_BLOOD
var/basecolor = COLOR_HUMAN_BLOOD // Color when wet.
var/list/datum/disease2/disease/virus2 = list()
var/amount = 5
var/drytime
var/dries = TRUE
var/bleed_time
/obj/effect/decal/cleanable/blood/no_dry
dries = FALSE
/obj/effect/decal/cleanable/blood/reveal_blood()
if(!fluorescent)
fluorescent = 1
basecolor = COLOR_LUMINOL
update_icon()
/obj/effect/decal/cleanable/blood/clean_blood()
fluorescent = 0
if(invisibility != 100)
set_invisibility(100)
amount = 0
..(ignore=1)
/obj/effect/decal/cleanable/blood/hide()
return
/obj/effect/decal/cleanable/blood/Initialize(mapload)
. = ..()
fall_to_floor()
update_icon()
if(istype(src, /obj/effect/decal/cleanable/blood/gibs))
return
if(type == /obj/effect/decal/cleanable/blood)
if (isturf(loc))
for(var/obj/effect/decal/cleanable/blood/B in src.loc)
if(B != src)
if (B.blood_DNA)
blood_DNA |= B.blood_DNA.Copy()
QDEL_IN(B, 1 SECOND)
drytime = DRYING_TIME * (amount+1)
bleed_time = world.time
if (dries)
animate(src, color = "#000000", time = drytime, loop = 0, flags = ANIMATION_RELATIVE)
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
/obj/effect/decal/cleanable/blood/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
if(dries && world.time > (bleed_time + drytime))
name = dryname
desc = drydesc
. = ..()
/obj/effect/decal/cleanable/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/gun/energy/rifle/cult))
return TRUE
return ..()
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow")
basecolor = get_random_colour(1)
color = basecolor
/obj/effect/decal/cleanable/blood/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
SIGNAL_HANDLER
if (!istype(arrived, /mob/living/carbon/human))
return
var/mob/living/carbon/human/perp = arrived
if(dries && world.time > (bleed_time + drytime))
amount = 0
if(amount < 1)
return
LAZYINITLIST(blood_DNA)
var/obj/item/organ/external/l_foot = perp.get_organ(BP_L_FOOT)
var/obj/item/organ/external/r_foot = perp.get_organ(BP_R_FOOT)
var/hasfeet = 1
if((!l_foot || l_foot.is_stump()) && (!r_foot || r_foot.is_stump()))
hasfeet = 0
//If thrown (or leap manouvering), the mob is considered flying, so don't dirt its shoes
if(!perp.throwing)
if(perp.shoes && !perp.buckled_to)//Adding blood to shoes
var/obj/item/clothing/shoes/S = perp.shoes
if(istype(S))
if(S.item_flags & ITEM_FLAG_LIGHT_STEP)
return
S.blood_color = basecolor
S.track_footprint = max(amount, S.track_footprint)
if(!S.blood_overlay)
S.generate_blood_overlay()
if(!S.blood_DNA)
S.blood_DNA = list()
S.blood_overlay.color = basecolor
S.AddOverlays(S.blood_overlay)
if(S.blood_overlay && S.blood_overlay.color != basecolor)
S.CutOverlays(S.blood_overlay, ATOM_ICON_CACHE_PROTECTED)
S.blood_overlay.color = basecolor
S.AddOverlays(S.blood_overlay, ATOM_ICON_CACHE_PROTECTED)
if(blood_DNA)
S.blood_DNA |= blood_DNA.Copy()
else if(hasfeet) //Or feet
perp.footprint_color = basecolor
perp.track_footprint = max(amount,perp.track_footprint)
LAZYINITLIST(perp.feet_blood_DNA)
if(blood_DNA)
perp.feet_blood_DNA |= blood_DNA.Copy()
else if(perp.buckled_to && istype(perp.buckled_to, /obj/structure/bed/stool/chair/office/wheelchair))
var/obj/structure/bed/stool/chair/office/wheelchair/W = perp.buckled_to
W.bloodiness = 4
perp.update_inv_shoes(1)
amount--
//Point and laugh
if(amount > 2 && prob(perp.slip_chance(perp.m_intent == M_RUN ? 20 : 5)))
perp.slip(src, 4)
if(perp.throwing)
amount--
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
..()
if(dries && world.time > (bleed_time + drytime))
amount = 0
if (amount && istype(user))
add_fingerprint(user)
if (user.gloves)
return
var/taken = rand(1,amount)
amount -= taken
to_chat(user, SPAN_NOTICE("You get some of \the [src] on your hands."))
LAZYINITLIST(user.blood_DNA)
if (blood_DNA)
user.blood_DNA |= blood_DNA.Copy()
user.bloody_hands = taken
user.hand_blood_color = basecolor
user.update_inv_gloves(1)
add_verb(user, /mob/living/carbon/human/proc/bloody_doodle)
/obj/effect/decal/cleanable/blood/splatter
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
/obj/effect/decal/cleanable/blood/drip/New()
..()
drips = list(icon_state)
/obj/effect/decal/cleanable/blood/drip/Destroy()
drips = null
. = ..()
/obj/effect/decal/cleanable/blood/writing
icon_state = "tracks"
desc = "It looks like a writing in blood."
gender = NEUTER
random_icon_states = list("writing1","writing2","writing3","writing4","writing5")
amount = 0
var/message
/obj/effect/decal/cleanable/blood/writing/Initialize()
. = ..()
if(LAZYLEN(random_icon_states))
for(var/obj/effect/decal/cleanable/blood/writing/W in loc)
random_icon_states -= W.icon_state
icon_state = pick(random_icon_states)
else
icon_state = "writing1"
/obj/effect/decal/cleanable/blood/writing/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
. += "It reads: <font color='[basecolor]'>\"[message]\"</font>"
/obj/effect/decal/cleanable/blood/gibs
name = "gibs"
desc = "They look bloody and gruesome."
gender = PLURAL
density = 0
anchored = 1
icon = 'icons/effects/blood.dmi'
icon_state = "gib1"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5")
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 = get_random_colour(1)
giblets.color = fleshcolor
var/icon/blood = new(base_icon,"[icon_state]",dir)
if(basecolor == "rainbow") basecolor = get_random_colour(1)
blood.Blend(basecolor,ICON_MULTIPLY)
icon = blood
ClearOverlays()
AddOverlays(giblets)
/obj/effect/decal/cleanable/blood/gibs/up
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gibup1","gibup1","gibup1")
/obj/effect/decal/cleanable/blood/gibs/down
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gibdown1","gibdown1","gibdown1")
/obj/effect/decal/cleanable/blood/gibs/body
random_icon_states = list("gibhead", "gibtorso")
/obj/effect/decal/cleanable/blood/gibs/limb
random_icon_states = list("gibleg", "gibarm")
/obj/effect/decal/cleanable/blood/gibs/core
random_icon_states = list("gibmid1", "gibmid2", "gibmid3")
/obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions)
set waitfor = FALSE
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()
if (step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/blood/proc/fall_to_floor()
if (isopenturf(loc))
anchored = FALSE
ADD_FALLING_ATOM(src)
/obj/effect/decal/cleanable/blood/fall_impact()
. = ..()
anchored = initial(anchored)
/obj/effect/decal/cleanable/mucus
name = "mucus"
desc = "Disgusting mucus."
gender = PLURAL
density = 0
anchored = 1
icon = 'icons/effects/blood.dmi'
icon_state = "mucus"
random_icon_states = null
var/list/datum/disease2/disease/virus2 = list()
/obj/effect/decal/cleanable/mucus/Initialize()
. = ..()
animate(src, color = "#000000", time = DRYING_TIME * 2, loop = 0, flags = ANIMATION_RELATIVE)
#undef DRYING_TIME