Files
VOREStation/code/game/objects/effects/decals/Cleanable/humans.dm
T
Cameron Lennox 84dc5535dc var/global/list -> GLOB. conversion (#17928)
* These two are easy

* !!!runlevel_flags

the fact it was global.runlevel_flags.len has me a bit...iffy on this.

* !!!json_cache

Same as above. used global.

* player_list & observer_mob_list

* mechas_list

* this wasn't even used

* surgery_steps

* event_triggers

* landmarks_list

* dead_mob_list

* living_mob_list

* ai_list

* cable_list

* cleanbot_reserved_turfs

* listening_objects

* silicon_mob_list

* human_mob_list

* Update global_lists.dm

* joblist

* mob_list

* Update global_lists.dm

* holomap_markers

* mapping_units

* mapping_beacons

* hair_styles_list

* facial_hair_styles_list

* Update global_lists.dm

* facial_hair_styles_male_list

* facial_hair_styles_female_list

* body_marking_styles_list

* body_marking_nopersist_list

* ear_styles_list

* hair_styles_male_list

* tail_styles_list

* wing_styles_list

* escape_list & rune_list & endgame_exits

these were all really small

* endgame_safespawns

* stool_cache

* emotes_by_key

* random_maps & map_count

* item_tf_spawnpoints

* narsie_list

* active_radio_jammers

* unused

* paikeys

* pai_software_by_key & default_pai_software

* plant_seed_sprites

* magazine_icondata_keys  & magazine_icondata_states

* unused

* ashtray_cache

* light_type_cache

* HOLIDAY!!!

this one was annoying

* faction stuff (red?!)

* Update preferences_factions.dm

* vs edit removal

* backbaglist, pdachoicelist, exclude_jobs

* item_digestion_blacklist, edible_tech, blacklisted_artifact_effect, selectable_footstep, hexNums, syndicate_access

* string_slot_flags and hexdigits->hexNums

* possible_changeling_IDs

* vr_mob_tf_options

* vr_mob_spawner_options

* pipe_colors

* vr_mob_spawner_options

* common_tools

* newscaster_standard_feeds

* Update periodic_news.dm

* changeling_fabricated_clothing

* semirandom_mob_spawner_decisions

* id_card_states

* Update syndicate_ids.dm

* overlay_cache & gear_distributed_to

* more

* radio_channels_by_freq

* Update global_lists.dm

* proper

* default_medbay_channels & default_internal_channels

default_internal_channels is weird as it has a mapbased proc() but that proc is never called...

* valid_ringtones

* move this

* possible_plants

* more

* separate these

moves xeno2chemlist from a hook to a new global list.

* tube_dir_list

* valid_bloodreagents & monitor_states

* Junk

* valid_bloodtypes

* breach_burn_descriptors & burn

* more!!

appliance_available_recipes seems uber cursed, re-look at later

* Appliance code is cursed

* wide_chassis & flying_chassis

* allows_eye_color

* all_tooltip_styles

* direction_table

* gun_choices

* severity_to_string

* old event_viruses

* description_icons

* MOVE_KEY_MAPPINGS

* more more

* pai & robot modules

* Update global_lists.dm

* GEOSAMPLES

Also swaps a .len to LAZYLEN()

* shieldgens

* reagent recipies

* global ammo types

* rad collector

* old file and unused global

* nif_look_messages

* FESH

* nifsoft

* chamelion

* the death of sortAtom

* globulins

* lazylen that

* Update global_lists.dm

* LAZY

* Theese too

* quick fix

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-07-14 20:14:31 +02:00

333 lines
9.8 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 = FALSE
anchored = TRUE
plane = BLOOD_PLANE
layer = BLOOD_DECAL_LAYER
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/basecolor="#A10808" // Color when wet.
var/synthblood = 0
var/list/datum/disease/viruses = list()
var/amount = 5
generic_filth = TRUE
persistent = FALSE
var/delete_me = FALSE
/obj/effect/decal/cleanable/blood/reveal_blood()
if(!fluorescent)
fluorescent = 1
basecolor = COLOR_LUMINOL
update_icon()
/obj/effect/decal/cleanable/blood/wash(clean_types)
. = ..()
fluorescent = 0
if(invisibility != INVISIBILITY_MAXIMUM)
invisibility = INVISIBILITY_MAXIMUM
amount = 0
/obj/effect/decal/cleanable/blood/Initialize(mapload)
. = ..()
if(delete_me)
return INITIALIZE_HINT_QDEL
update_icon()
if(istype(src, /obj/effect/decal/cleanable/blood/gibs))
return
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)
if(B != src)
init_forensic_data().merge_blooddna(B.forensic_data)
if(!(B.flags & ATOM_INITIALIZED))
B.delete_me = TRUE
else
qdel(B)
//VOREstation edit - Moved timer call to Init, and made it not call on mapload
/obj/effect/decal/cleanable/blood/Initialize(mapload, var/_age)
. = ..()
if(!mapload)
addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1))
//VOREstation edit end
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = get_random_colour(1)
color = basecolor
if(basecolor == SYNTH_BLOOD_COLOUR)
name = "oil"
desc = "It's quite oily."
else if(synthblood)
name = "synthetic blood"
desc = "It's quite greasy."
else
name = initial(name)
desc = initial(desc)
cut_overlays()
add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
if(perp.is_incorporeal())
return
if(!istype(perp))
return
if(perp.flying || perp.hovering || perp.is_floating) //if the perp isn't on the ground, they shouldn't be affected by the stuff on the floor.
return
if(amount < 1)
return
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(perp.shoes && !perp.buckled)//Adding blood to shoes
var/obj/item/clothing/shoes/S = perp.shoes
if(istype(S))
S.blood_color = basecolor
S.track_blood = max(amount,S.track_blood)
S.update_icon() // Cut previous overlays
if(!S.blood_overlay)
S.generate_blood_overlay()
if(!forensic_data?.has_blooddna())
S.blood_overlay.color = basecolor
S.add_overlay(S.blood_overlay)
if(S.blood_overlay && S.blood_overlay.color != basecolor)
S.blood_overlay.color = basecolor
S.add_overlay(S.blood_overlay)
transfer_blooddna_to(S)
perp.update_inv_shoes()
else if (hasfeet)//Or feet
perp.feet_blood_color = basecolor
perp.track_blood = max(amount,perp.track_blood)
LAZYINITLIST(perp.feet_blood_DNA)
perp.feet_blood_DNA |= init_forensic_data().get_blooddna().Copy()
perp.update_bloodied()
else if (perp.buckled && istype(perp.buckled, /obj/structure/bed/chair/wheelchair))
var/obj/structure/bed/chair/wheelchair/W = perp.buckled
W.bloodiness = 4
if(viruses)
for(var/datum/disease/D in viruses)
if(D.IsSpreadByTouch())
perp.ContractDisease(D, BP_R_FOOT)
amount--
/obj/effect/decal/cleanable/blood/proc/dry()
name = dryname
desc = drydesc
color = adjust_brightness(color, -50)
amount = 0
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
..()
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."))
transfer_blooddna_to(user)
user.bloody_hands += taken
user.hand_blood_color = basecolor
user.update_inv_gloves(1)
add_verb(user, /mob/living/carbon/human/proc/bloody_doodle)
if(viruses)
for(var/datum/disease/D in viruses)
if(D.IsSpreadByTouch())
user.ContractDisease(D, BP_R_HAND)
/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 = list()
/obj/effect/decal/cleanable/blood/drip/Initialize(mapload)
. = ..()
drips |= icon_state
/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(mapload)
. = ..()
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(mob/user)
. = ..()
. += "It reads: <font color='[basecolor]'>\"[message]\"</font>"
/obj/effect/decal/cleanable/blood/gibs
name = "gibs"
desc = "They look bloody and gruesome."
gender = PLURAL
density = FALSE
anchored = TRUE
icon = 'icons/effects/blood.dmi'
icon_state = "gib1"
random_icon_states = list("gib1", "gib2", "gib3", "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 = 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
cut_overlays()
add_overlay(giblets)
add_janitor_hud_overlay()
/obj/effect/decal/cleanable/blood/gibs/up
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1")
/obj/effect/decal/cleanable/blood/gibs/down
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","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)
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()
if (step_to(src, get_step(src, direction), 0))
break
/obj/effect/decal/cleanable/mucus
name = "mucus"
desc = "Disgusting mucus."
gender = PLURAL
density = FALSE
anchored = TRUE
icon = 'icons/effects/blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
var/list/datum/disease/viruses = list()
var/dry = 0 // Keeps the lag down
/obj/effect/decal/cleanable/mucus/mapped/Initialize(mapload)
. = ..()
VARSET_IN(src, dry, TRUE, DRYING_TIME * 2)
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
/obj/effect/decal/cleanable/mucus/mapped/Initialize(mapload)
. = ..()
viruses |= new /datum/disease/advance/random(rand(3, 6), 9, 4, infected = src)
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
viruses.Cut()
return ..()
/obj/effect/decal/cleanable/mucus/Crossed(mob/living/carbon/human/perp)
if(perp.is_incorporeal())
return
if(!istype(perp))
return
if(viruses)
for(var/datum/disease/D in viruses)
if(D.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS))
continue
perp.ContractDisease(D, BP_R_FOOT)
/obj/effect/decal/cleanable/mucus/attack_hand(mob/living/carbon/human/perp)
if(perp.is_incorporeal())
return
if(!istype(perp))
return
if(viruses)
for(var/datum/disease/D in viruses)
if(D.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS))
continue
perp.ContractDisease(D, BP_R_HAND)
/obj/effect/decal/cleanable/vomit/Crossed(mob/living/carbon/human/perp)
if(perp.is_incorporeal())
return
if(!istype(perp))
return
if(viruses)
for(var/datum/disease/D in viruses)
if(D.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS))
continue
perp.ContractDisease(D, BP_R_FOOT)
/obj/effect/decal/cleanable/vomit/attack_hand(mob/living/carbon/human/perp)
if(perp.is_incorporeal())
return
if(!istype(perp))
return
if(viruses)
for(var/datum/disease/D in viruses)
if(D.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS))
continue
perp.ContractDisease(D, BP_R_HAND)
/obj/effect/decal/cleanable/mucus/extrapolator_act(mob/living/user, obj/item/extrapolator/extrapolator, dry_run)
. = ..()
EXTRAPOLATOR_ACT_ADD_DISEASES(., viruses)
/obj/effect/decal/cleanable/vomit/extrapolator_act(mob/living/user, obj/item/extrapolator/extrapolator, dry_run)
. = ..()
EXTRAPOLATOR_ACT_ADD_DISEASES(., viruses)
/obj/effect/decal/cleanable/blood/extrapolator_act(mob/living/user, obj/item/extrapolator/extrapolator, dry_run)
. = ..()
EXTRAPOLATOR_ACT_ADD_DISEASES(., viruses)
#undef DRYING_TIME