From cc265934637d3eac839121a009f2830f113127f4 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 23 Oct 2019 20:54:55 -0400 Subject: [PATCH] Merge pull request #9047 from Poojawa/syntheticbloods RGB Blood Reworks + Blood generator --- .../LavaRuins/lavaland_surface_alien_nest.dmm | 8 +- _maps/RandomRuins/SpaceRuins/bigderelict1.dmm | 4 +- _maps/RandomZLevels/Academy.dmm | 2 +- _maps/RandomZLevels/caves.dmm | 6 +- _maps/RandomZLevels/moonoutpost19.dmm | 6 +- code/__DEFINES/citadel_defines.dm | 5 - code/__DEFINES/cleaning.dm | 5 - code/__DEFINES/components.dm | 5 +- code/__DEFINES/footsteps.dm | 9 + code/__DEFINES/forensics.dm | 2 - code/__DEFINES/is_helpers.dm | 11 + code/__DEFINES/misc.dm | 14 +- code/__HELPERS/unsorted.dm | 1 - code/_globalvars/lists/mobs.dm | 60 + code/datums/components/_component.dm | 25 +- code/datums/components/decal.dm | 2 +- code/datums/components/decals/blood.dm | 28 +- code/datums/components/forensics.dm | 159 --- code/datums/components/lockon_aiming.dm | 3 - code/datums/components/mirage_border.dm | 1 + code/datums/components/rotation.dm | 35 +- .../components/storage/concrete/_concrete.dm | 1 + code/datums/components/wet_floor.dm | 17 +- code/datums/elements/cleaning.dm | 32 +- code/datums/mutable_appearance.dm | 3 +- code/game/atoms.dm | 132 ++- code/game/gamemodes/meteor/meteors.dm | 2 +- code/game/machinery/bloodbankgen.dm | 361 ++++++ code/game/machinery/doors/door.dm | 2 +- code/game/machinery/iv_drip.dm | 21 +- code/game/machinery/suit_storage_unit.dm | 2 + code/game/machinery/washing_machine.dm | 10 +- code/game/objects/effects/decals/cleanable.dm | 9 +- .../effects/decals/cleanable/aliens.dm | 82 +- .../objects/effects/decals/cleanable/gibs.dm | 233 ++++ .../effects/decals/cleanable/humans.dm | 179 ++- .../effects/decals/cleanable/robots.dm | 5 + .../objects/effects/spawners/gibspawner.dm | 227 +++- .../temporary_visuals/miscellaneous.dm | 6 +- code/game/objects/items.dm | 11 + .../circuitboards/machine_circuitboards.dm | 9 + code/game/objects/items/devices/scanners.dm | 2 +- code/game/objects/items/mop.dm | 1 + code/game/objects/items/stacks/medical.dm | 1 - code/game/objects/items/stacks/stack.dm | 8 +- code/game/objects/items/storage/toolbox.dm | 4 +- code/game/objects/items/twohanded.dm | 5 +- code/game/objects/structures/watercloset.dm | 21 +- code/game/turfs/open.dm | 1 + .../clockcult/clock_effects/clock_sigils.dm | 2 + .../antagonists/wizard/equipment/artefact.dm | 7 +- code/modules/cargo/packs.dm | 22 +- code/modules/clothing/gloves/_gloves.dm | 13 +- code/modules/clothing/head/_head.dm | 6 +- code/modules/clothing/masks/_masks.dm | 4 +- code/modules/clothing/neck/_neck.dm | 4 +- code/modules/clothing/shoes/_shoes.dm | 29 +- code/modules/clothing/suits/_suits.dm | 13 +- code/modules/clothing/under/_under.dm | 4 +- code/modules/detectivework/detective_work.dm | 180 ++- code/modules/detectivework/evidence.dm | 8 +- code/modules/detectivework/scanner.dm | 43 +- code/modules/mob/living/blood.dm | 144 ++- code/modules/mob/living/bloodcrawl.dm | 6 +- code/modules/mob/living/brain/brain.dm | 7 +- code/modules/mob/living/carbon/alien/alien.dm | 2 +- code/modules/mob/living/carbon/alien/death.dm | 2 +- .../mob/living/carbon/alien/larva/death.dm | 2 +- .../modules/mob/living/carbon/alien/organs.dm | 2 + .../mob/living/carbon/carbon_defines.dm | 1 + .../modules/mob/living/carbon/damage_procs.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 30 +- .../mob/living/carbon/human/examine.dm | 9 +- code/modules/mob/living/carbon/human/human.dm | 35 +- .../mob/living/carbon/human/human_defines.dm | 3 + .../mob/living/carbon/human/human_helpers.dm | 7 + .../mob/living/carbon/human/human_movement.dm | 23 +- .../mob/living/carbon/human/species.dm | 15 +- .../carbon/human/species_types/flypeople.dm | 1 + .../carbon/human/species_types/jellypeople.dm | 8 +- .../carbon/human/species_types/mothmen.dm | 3 +- .../mob/living/carbon/human/update_icons.dm | 28 +- .../modules/mob/living/carbon/update_icons.dm | 1054 +++++++++++------ .../mob/living/simple_animal/bot/cleanbot.dm | 1 - .../mob/living/simple_animal/bot/mulebot.dm | 4 +- .../mob/living/simple_animal/hostile/alien.dm | 3 +- .../hostile/mining_mobs/gutlunch.dm | 2 +- code/modules/mob/mob_helpers.dm | 20 + code/modules/paperwork/pen.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/projectiles/projectile.dm | 13 +- .../projectiles/projectile/bullets/smg.dm | 45 +- .../reagents/chemistry/machinery/pandemic.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 243 +++- .../reagents/chemistry/recipes/medicine.dm | 6 + code/modules/reagents/reagent_containers.dm | 2 +- .../reagents/reagent_containers/blood_pack.dm | 20 +- .../machine_designs_medical.dm | 8 + code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/surgery/bodyparts/bodyparts.dm | 4 + code/modules/surgery/bodyparts/helpers.dm | 21 + code/modules/surgery/organs/heart.dm | 21 +- icons/effects/blood.dmi | Bin 115954 -> 98423 bytes icons/effects/fluidtracks.dmi | Bin 0 -> 13833 bytes icons/effects/footprints.dmi | Bin 4164 -> 17233 bytes icons/mob/dam_mob.dmi | Bin 16165 -> 16184 bytes icons/obj/bloodbank.dmi | Bin 0 -> 1832 bytes .../objects/items/melee/eutactic_blades.dm | 2 +- .../modules/mob/living/carbon/human/human.dm | 15 - .../carbon/human/species_types/furrypeople.dm | 2 +- .../living/carbon/human/species_types/ipc.dm | 4 +- .../chemistry/reagents/other_reagents.dm | 8 - .../reagents/chemistry/recipes/fermi.dm | 4 +- .../modules/reagents/reagents/cit_reagents.dm | 9 +- modular_citadel/icons/mob/64x32_effects.dmi | Bin 35318 -> 39945 bytes tgstation.dme | 5 +- tools/mapmerge2/dmi.py | 4 +- tools/mapmerge2/dmm.py | 20 +- tools/mapmerge2/update_paths.py | 2 +- 119 files changed, 2818 insertions(+), 1175 deletions(-) delete mode 100644 code/__DEFINES/forensics.dm delete mode 100644 code/datums/components/forensics.dm create mode 100644 code/game/machinery/bloodbankgen.dm create mode 100644 code/game/objects/effects/decals/cleanable/gibs.dm create mode 100644 icons/effects/fluidtracks.dmi create mode 100644 icons/obj/bloodbank.dmi diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm index d80e3759..97dd5564 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_alien_nest.dmm @@ -167,7 +167,7 @@ /area/ruin/unpowered/xenonest) "aM" = ( /obj/structure/alien/weeds, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/xenonest) "aQ" = ( @@ -260,7 +260,7 @@ /obj/structure/stone_tile/cracked{ dir = 1 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/indestructible/boss, /area/ruin/unpowered/xenonest) "be" = ( @@ -381,7 +381,7 @@ /obj/structure/stone_tile{ dir = 1 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/indestructible/boss, /area/ruin/unpowered/xenonest) "bs" = ( @@ -439,7 +439,7 @@ /obj/structure/stone_tile{ dir = 8 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/indestructible/boss, /area/ruin/unpowered/xenonest) "by" = ( diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index f1a3005c..9c273f4d 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -1288,7 +1288,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cV" = ( -/obj/effect/decal/cleanable/xenoblood/xsplatter, +/obj/effect/decal/cleanable/blood/splatter/xeno, /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cW" = ( @@ -1525,7 +1525,7 @@ /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/cargobay) "dq" = ( -/obj/effect/decal/cleanable/xenoblood/xsplatter, +/obj/effect/decal/cleanable/blood/splatter/xeno, /obj/structure/alien/weeds{ color = "#4BAE56"; desc = "A thick gelatinous surface covers the floor. Someone get the golashes."; diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 29bd7d05..2f08d9a2 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -3830,7 +3830,7 @@ /turf/open/floor/engine/cult, /area/awaymission/academy/academycellar) "kY" = ( -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/engine/cult, /area/awaymission/academy/academycellar) "kZ" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 66ab3e60..92373463 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -873,7 +873,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14" }, @@ -945,7 +945,7 @@ /area/awaymission/caves/research) "cN" = ( /obj/machinery/door/window/eastleft, -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/gibs/xeno, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14" }, @@ -1015,7 +1015,7 @@ }, /area/awaymission/caves/BMP_asteroid/level_two) "cV" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/gibs/xeno, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14" }, diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 7edc7b45..c251a338 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -5597,8 +5597,8 @@ }, /area/awaymission/moonoutpost19/arrivals) "kK" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/decal/cleanable/xenoblood/xgibs, +/obj/effect/decal/cleanable/blood/xeno, +/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -5608,7 +5608,7 @@ }, /area/awaymission/moonoutpost19/arrivals) "kL" = ( -/obj/effect/decal/cleanable/xenoblood, +/obj/effect/decal/cleanable/blood/xeno, /obj/effect/decal/remains/xeno{ desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated." }, diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 8662d19f..7c2250ea 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -111,11 +111,6 @@ #define isgenital(A) (istype(A, /obj/item/organ/genital)) #define isborer(A) (istype(A, /mob/living/simple_animal/borer)) -#define isipcperson(A) (is_species(A, /datum/species/ipc)) -#define ismammal(A) (is_species(A, /datum/species/mammal)) -#define isavian(A) (is_species(A, /datum/species/avian)) -#define isaquatic(A) (is_species(A, /datum/species/aquatic)) -#define isxenoperson(A) (is_species(A, /datum/species/xeno)) #define CITADEL_MENTOR_OOC_COLOUR "#224724" diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index c4db590e..6049fd79 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -5,8 +5,3 @@ #define CLEAN_STRONG 4 // Industrial strength #define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud #define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure - -//How strong things have to be to wipe forensic evidence... -#define CLEAN_STRENGTH_FINGERPRINTS CLEAN_IMPRESSIVE -#define CLEAN_STRENGTH_BLOOD CLEAN_WEAK -#define CLEAN_STRENGTH_FIBERS CLEAN_IMPRESSIVE diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 4979823a..1058587d 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -7,6 +7,7 @@ #define GET_COMPONENT(varname, path) GET_COMPONENT_FROM(varname, path, src) #define COMPONENT_INCOMPATIBLE 1 +#define COMPONENT_NOTRANSFER 2 // How multiple components of the exact same type are handled in the same datum @@ -101,4 +102,6 @@ * The arguments are the same when the text and number values are the same and all other values have the same ref */ #define ELEMENT_BESPOKE (1 << 1) -#define COMSIG_MOVABLE_UPDATE_GLIDE_SIZE "movable_glide_size" //Called when the movable's glide size is updated: (new_glide_size) \ No newline at end of file +#define COMSIG_MOVABLE_UPDATE_GLIDE_SIZE "movable_glide_size" //Called when the movable's glide size is updated: (new_glide_size) +//Blood color +#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index ef96b83c..16d76360 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -15,6 +15,15 @@ //misc footstep sounds #define FOOTSTEP_GENERIC_HEAVY "heavy" +#define FOOTPRINT_SHOE "shoe" +#define FOOTPRINT_FOOT "foot" +#define FOOTPRINT_PAW "paw" +#define FOOTPRINT_CLAW "claw" +#define FOOTPRINT_WHEEL "wheels" +#define FOOTPRINT_TRAIL "trails_" +#define FOOTPRINT_SNAKE "snake" +#define FOOTPRINT_DRAG "drag" + /* id = list( diff --git a/code/__DEFINES/forensics.dm b/code/__DEFINES/forensics.dm deleted file mode 100644 index 657c69b8..00000000 --- a/code/__DEFINES/forensics.dm +++ /dev/null @@ -1,2 +0,0 @@ -#define IF_HAS_BLOOD_DNA(__thing) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA)) -#define IF_HAS_BLOOD_DNA_AND(__thing, __conditions...) GET_COMPONENT_FROM(__FR##__thing, /datum/component/forensics, __thing); if(__FR##__thing && length(__FR##__thing.blood_DNA) && (##__conditions)) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 70c7bb40..5f047e79 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -78,6 +78,15 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isvampire(A) (is_species(A,/datum/species/vampire)) +// Citadel specific species +#define isipcperson(A) (is_species(A, /datum/species/ipc)) +#define ismammal(A) (is_species(A, /datum/species/mammal)) +#define isavian(A) (is_species(A, /datum/species/avian)) +#define isaquatic(A) (is_species(A, /datum/species/aquatic)) +#define isinsect(A) (is_species(A, /datum/species/insect)) +#define isxenoperson(A) (is_species(A, /datum/species/xeno)) +#define isstartjelly(A) (is_species(A, /datum/species/jelly/roundstartslime)) + //more carbon mobs #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) @@ -193,6 +202,8 @@ GLOBAL_LIST_INIT(heavyfootmob, typecacheof(list( #define iscameramob(A) (istype(A, /mob/camera)) +#define isaicamera(A) (istype(A, /mob/camera/aiEye)) + #define iseminence(A) (istype(A, /mob/camera/eminence)) //Footstep helpers diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 616ffaae..752e4e56 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -147,12 +147,22 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define BLOOD_LOSS_IN_SPREAD 20 //Bloody shoe blood states -#define BLOOD_STATE_HUMAN "blood" -#define BLOOD_STATE_XENO "xeno" +#define BLOOD_STATE_BLOOD "blood" #define BLOOD_STATE_OIL "oil" #define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" #define BLOOD_AMOUNT_PER_DECAL 20 +//Blood Decal Colors +#define BLOOD_COLOR_HUMAN "#dc0000" +#define BLOOD_COLOR_XENO "#94a83c" +#define BLOOD_COLOR_OIL "#301d02" +#define BLOOD_COLOR_SYNTHETIC "#3f48aa" +#define BLOOD_COLOR_SLIME "#00ff90" +#define BLOOD_COLOR_LIZARD "#db004D" +#define BLOOD_COLOR_UNIVERSAL "#db3300" +#define BLOOD_COLOR_BUG "#a37c0f" + + //suit sensors: sensor_mode defines #define SENSOR_OFF 0 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5f33e4c4..c8ebfa1d 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -761,7 +761,6 @@ Turf and target are separate in case you want to teleport some distance from a t loc = loc.loc return null - //For objects that should embed, but make no sense being is_sharp or is_pointed() //e.g: rods GLOBAL_LIST_INIT(can_embed_types, typecacheof(list( diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index b7ef4528..0a28cdf3 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -58,3 +58,63 @@ GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traito for(var/i in GLOB.mob_list) var/mob/M = i M.update_config_movespeed() + +GLOBAL_LIST_INIT(noodle_taurs, list( + "Naga", + "Tentacle" + )) + +GLOBAL_LIST_INIT(paw_taurs, list( + "Fox", + "Wolf", + "Otie", + "Drake", + "Lab", + "Shepherd", + "Husky", + "Eevee", + "Panther", + "Horse", + "Cow", + "Tiger" + )) + + //blood types +GLOBAL_LIST_INIT(regular_bloods,list( + "O-", + "O+", + "A-", + "A+", + "B-", + "B+", + "AB-", + "AB+" + )) + +GLOBAL_LIST_INIT(all_types_bloods,list( + "O-", + "O+", + "A-", + "A+", + "B-", + "B+", + "AB-", + "AB+", + "SY", + "X*", + "HF", + "L", + "U", + "GEL", + "BUG" + )) + +GLOBAL_LIST_INIT(blood_types, list( + "blood", + "jellyblood" + )) + +GLOBAL_LIST_INIT(blood_id_types, list( + "blood" = /datum/reagent/blood, + "jellyblood" = /datum/reagent/blood/jellyblood + )) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index bc99665f..a836ac95 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -2,6 +2,10 @@ var/dupe_mode = COMPONENT_DUPE_HIGHLANDER var/dupe_type var/datum/parent + //only set to true if you are able to properly transfer this component + //At a minimum RegisterWithParent and UnregisterFromParent should be used + //Make sure you also implement PostTransfer for any post transfer handling + var/can_transfer = FALSE /datum/component/New(datum/P, ...) parent = P @@ -154,7 +158,7 @@ return /datum/component/proc/PostTransfer() - return + return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick @@ -285,10 +289,12 @@ if(target.parent) target.RemoveComponent() target.parent = src - if(target.PostTransfer() == COMPONENT_INCOMPATIBLE) - var/c_type = target.type - qdel(target) - CRASH("Incompatible [c_type] transfer attempt to a [type]!") + var/result = target.PostTransfer() + switch(result) + if(COMPONENT_INCOMPATIBLE) + var/c_type = target.type + qdel(target) + CRASH("Incompatible [c_type] transfer attempt to a [type]!") if(target == AddComponent(target)) target._JoinParent() @@ -298,10 +304,13 @@ return var/comps = dc[/datum/component] if(islist(comps)) - for(var/I in comps) - target.TakeComponent(I) + for(var/datum/component/I in comps) + if(I.can_transfer) + target.TakeComponent(I) else - target.TakeComponent(comps) + var/datum/component/C = comps + if(C.can_transfer) + target.TakeComponent(comps) /datum/component/ui_host() return parent diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index 5300493a..641dbdb1 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -1,6 +1,6 @@ /datum/component/decal dupe_mode = COMPONENT_DUPE_ALLOWED - + can_transfer = TRUE var/cleanable var/description var/mutable_appearance/pic diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm index 3114ddb2..c8be6251 100644 --- a/code/datums/components/decals/blood.dm +++ b/code/datums/components/decals/blood.dm @@ -7,33 +7,7 @@ . = ..() RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name) -/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color) - var/obj/item/I = parent - if(!_icon) - _icon = 'icons/effects/blood.dmi' - if(!_icon_state) - _icon_state = "itemblood" - var/icon = initial(I.icon) - var/icon_state = initial(I.icon_state) - if(!icon || !icon_state) - // It's something which takes on the look of other items, probably - icon = I.icon - icon_state = I.icon_state - var/static/list/blood_splatter_appearances = list() - //try to find a pre-processed blood-splatter. otherwise, make a new one - var/index = "[REF(icon)]-[icon_state]" - pic = blood_splatter_appearances[index] - - if(!pic) - var/icon/blood_splatter_icon = icon(initial(I.icon), initial(I.icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(icon(_icon, _icon_state), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - pic = mutable_appearance(blood_splatter_icon, initial(I.icon_state)) - blood_splatter_appearances[index] = pic - return TRUE - /datum/component/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) var/atom/A = parent - override[EXAMINE_POSITION_ARTICLE] = A.gender == PLURAL? "some" : "a" - override[EXAMINE_POSITION_BEFORE] = " blood-stained " + return COMPONENT_EXNAME_CHANGED diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm deleted file mode 100644 index cdfe89cf..00000000 --- a/code/datums/components/forensics.dm +++ /dev/null @@ -1,159 +0,0 @@ -/datum/component/forensics - dupe_mode = COMPONENT_DUPE_UNIQUE - var/list/fingerprints //assoc print = print - var/list/hiddenprints //assoc ckey = realname/gloves/ckey - var/list/blood_DNA //assoc dna = bloodtype - var/list/fibers //assoc print = print - -/datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL. - fingerprints = fingerprints | F.fingerprints - hiddenprints = hiddenprints | F.hiddenprints - blood_DNA = blood_DNA | F.blood_DNA - fibers = fibers | F.fibers - check_blood() - return ..() - -/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - fingerprints = new_fingerprints - hiddenprints = new_hiddenprints - blood_DNA = new_blood_DNA - fibers = new_fibers - check_blood() - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act) - -/datum/component/forensics/proc/wipe_fingerprints() - fingerprints = null - return TRUE - -/datum/component/forensics/proc/wipe_hiddenprints() - return //no. - -/datum/component/forensics/proc/wipe_blood_DNA() - blood_DNA = null - if(isitem(parent)) - qdel(parent.GetComponent(/datum/component/decal/blood)) - return TRUE - -/datum/component/forensics/proc/wipe_fibers() - fibers = null - return TRUE - -/datum/component/forensics/proc/clean_act(datum/source, strength) - if(strength >= CLEAN_STRENGTH_FINGERPRINTS) - wipe_fingerprints() - if(strength >= CLEAN_STRENGTH_BLOOD) - wipe_blood_DNA() - if(strength >= CLEAN_STRENGTH_FIBERS) - wipe_fibers() - -/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text) - if(!length(_fingerprints)) - return - LAZYINITLIST(fingerprints) - for(var/i in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. - fingerprints[i] = i - return TRUE - -/datum/component/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE) - if(!M) - return - add_hiddenprint(M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - add_fibers(H) - if(H.gloves) //Check if the gloves (if any) hide fingerprints - var/obj/item/clothing/gloves/G = H.gloves - if(G.transfer_prints) - ignoregloves = TRUE - if(!ignoregloves) - H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop. - return - var/full_print = md5(H.dna.uni_identity) - LAZYSET(fingerprints, full_print, full_print) - return TRUE - -/datum/component/forensics/proc/add_fiber_list(list/_fibertext) //list(text) - if(!length(_fibertext)) - return - LAZYINITLIST(fibers) - for(var/i in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours. - fibers[i] = i - return TRUE - -/datum/component/forensics/proc/add_fibers(mob/living/carbon/human/M) - var/fibertext - var/item_multiplier = isitem(src)?1.2:1 - if(M.wear_suit) - fibertext = "Material from \a [M.wear_suit]." - if(prob(10*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - if(!(M.wear_suit.body_parts_covered & CHEST)) - if(M.w_uniform) - fibertext = "Fibers from \a [M.w_uniform]." - if(prob(12*item_multiplier) && !LAZYACCESS(fibers, fibertext)) //Wearing a suit means less of the uniform exposed. - LAZYSET(fibers, fibertext, fibertext) - if(!(M.wear_suit.body_parts_covered & HANDS)) - if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - else if(M.w_uniform) - fibertext = "Fibers from \a [M.w_uniform]." - if(prob(15*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - // "Added fibertext: [fibertext]" - LAZYSET(fibers, fibertext, fibertext) - if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - else if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - return TRUE - -/datum/component/forensics/proc/add_hiddenprint_list(list/_hiddenprints) //list(ckey = text) - if(!length(_hiddenprints)) - return - LAZYINITLIST(hiddenprints) - for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. - hiddenprints[i] = _hiddenprints[i] - return TRUE - -/datum/component/forensics/proc/add_hiddenprint(mob/living/M) - if(!M || !M.key) - return - var/hasgloves = "" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.gloves) - hasgloves = "(gloves)" - var/current_time = TIME_STAMP("hh:mm:ss", FALSE) - if(!LAZYACCESS(hiddenprints, M.key)) - LAZYSET(hiddenprints, M.key, "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]") - else - var/laststamppos = findtext(LAZYACCESS(hiddenprints, M.key), " Last: ") - if(laststamppos) - LAZYSET(hiddenprints, M.key, copytext(hiddenprints[M.key], 1, laststamppos)) - hiddenprints[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else - var/atom/A = parent - A.fingerprintslast = M.ckey - return TRUE - -/datum/component/forensics/proc/add_blood_DNA(list/dna) //list(dna_enzymes = type) - if(!length(dna)) - return - LAZYINITLIST(blood_DNA) - for(var/i in dna) - blood_DNA[i] = dna[i] - check_blood() - return TRUE - -/datum/component/forensics/proc/check_blood() - if(!isitem(parent)) - return - if(!length(blood_DNA)) - return - parent.LoadComponent(/datum/component/decal/blood) diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index ffeae38f..1cf42496 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -237,6 +237,3 @@ LOCKON_RANGING_BREAK_CHECK cd++ CHECK_TICK - -/datum/component/lockon_aiming/PostTransfer(datum/new_parent) - return COMPONENT_INCOMPATIBLE diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm index 2e6f8f79..20e3b317 100644 --- a/code/datums/components/mirage_border.dm +++ b/code/datums/components/mirage_border.dm @@ -1,4 +1,5 @@ /datum/component/mirage_border + can_transfer = TRUE var/obj/effect/abstract/mirage_holder/holder /datum/component/mirage_border/Initialize(turf/target, direction, range=world.view) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 72bf1c36..112915a2 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -44,19 +44,21 @@ if(src.rotation_flags & ROTATION_CLOCKWISE) default_rotation_direction = ROTATION_CLOCKWISE - if(src.rotation_flags & ROTATION_ALTCLICK) +/datum/component/simple_rotation/proc/add_signals() + if(rotation_flags & ROTATION_ALTCLICK) RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/HandRot) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage) - if(src.rotation_flags & ROTATION_WRENCH) + if(rotation_flags & ROTATION_WRENCH) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot) - if(src.rotation_flags & ROTATION_VERBS) +/datum/component/simple_rotation/proc/add_verbs() + if(rotation_flags & ROTATION_VERBS) var/atom/movable/AM = parent - if(src.rotation_flags & ROTATION_FLIP) + if(rotation_flags & ROTATION_FLIP) AM.verbs += /atom/movable/proc/simple_rotate_flip - if(src.rotation_flags & ROTATION_CLOCKWISE) + if(rotation_flags & ROTATION_CLOCKWISE) AM.verbs += /atom/movable/proc/simple_rotate_clockwise - if(src.rotation_flags & ROTATION_COUNTERCLOCKWISE) + if(rotation_flags & ROTATION_COUNTERCLOCKWISE) AM.verbs += /atom/movable/proc/simple_rotate_counterclockwise /datum/component/simple_rotation/proc/remove_verbs() @@ -66,11 +68,30 @@ AM.verbs -= /atom/movable/proc/simple_rotate_clockwise AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise -/datum/component/simple_rotation/Destroy() +/datum/component/simple_rotation/proc/remove_signals() + UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY)) + +/datum/component/simple_rotation/RegisterWithParent() + add_verbs() + add_signals() + . = ..() + +/datum/component/simple_rotation/PostTransfer() + //Because of the callbacks which we don't track cleanly we can't transfer this + //item cleanly, better to let the new of the new item create a new rotation datum + //instead (there's no real state worth transferring) + return COMPONENT_NOTRANSFER + +/datum/component/simple_rotation/UnregisterFromParent() remove_verbs() + remove_signals() + . = ..() + +/datum/component/simple_rotation/Destroy() QDEL_NULL(can_user_rotate) QDEL_NULL(can_be_rotated) QDEL_NULL(after_rotation) + //Signals + verbs removed via UnRegister . = ..() /datum/component/simple_rotation/RemoveComponent() diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 4d1ed323..ec22b6b7 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -4,6 +4,7 @@ // /mob/living/Move() in /modules/mob/living/living.dm - hiding storage boxes on mob movement /datum/component/storage/concrete + can_transfer = TRUE var/drop_all_on_deconstruct = TRUE var/drop_all_on_destroy = FALSE var/drop_all_on_break = FALSE diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 60640c6d..526d482e 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -1,5 +1,6 @@ /datum/component/wet_floor dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + can_transfer = TRUE var/highest_strength = TURF_DRY var/lube_flags = NONE //why do we have this? var/list/time_left_list //In deciseconds. @@ -26,14 +27,19 @@ if(!isopenturf(parent)) return COMPONENT_INCOMPATIBLE add_wet(strength, duration_minimum, duration_add, duration_maximum) - RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet) - RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry) permanent = _permanent if(!permanent) START_PROCESSING(SSwet_floors, src) addtimer(CALLBACK(src, .proc/gc, TRUE), 1) //GC after initialization. last_process = world.time +/datum/component/wet_floor/RegisterWithParent() + RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet) + RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry) + +/datum/component/wet_floor/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_TURF_IS_WET, COMSIG_TURF_MAKE_DRY)) + /datum/component/wet_floor/Destroy() STOP_PROCESSING(SSwet_floors, src) var/turf/T = parent @@ -138,12 +144,19 @@ /datum/component/wet_floor/PreTransfer() var/turf/O = parent O.cut_overlay(current_overlay) + //That turf is no longer slippery, we're out of here + //Slippery components don't transfer due to callbacks + qdel(O.GetComponent(/datum/component/slippery)) /datum/component/wet_floor/PostTransfer() if(!isopenturf(parent)) return COMPONENT_INCOMPATIBLE var/turf/T = parent T.add_overlay(current_overlay) + //Make sure to add/update any slippery component on the new turf (update_flags calls LoadComponent) + update_flags() + + //NB it's possible we get deleted after this, due to inherit /datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME, _permanent = FALSE) var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST) diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index 3e0c60ad..e4fb3edd 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -15,24 +15,34 @@ for(var/A in T) if(is_cleanable(A)) qdel(A) - else if(istype(A, /obj/item)) - var/obj/item/I = A - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(ismob(I.loc)) - var/mob/M = I.loc + else if(isitem(A)) + var/obj/item/cleaned_item = A + SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_item.clean_blood() + if(ismob(cleaned_item.loc)) + var/mob/M = cleaned_item.loc M.regenerate_icons() else if(ishuman(A)) var/mob/living/carbon/human/cleaned_human = A if(cleaned_human.lying) if(cleaned_human.head) - SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.head.clean_blood() + cleaned_human.update_inv_head() if(cleaned_human.wear_suit) - SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.wear_suit.clean_blood() + cleaned_human.update_inv_wear_suit() else if(cleaned_human.w_uniform) - SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_uniform.clean_blood() + cleaned_human.update_inv_w_uniform() if(cleaned_human.shoes) - SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.shoes.clean_blood() + cleaned_human.update_inv_shoes() + SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.clean_blood() cleaned_human.wash_cream() cleaned_human.regenerate_icons() - to_chat(cleaned_human, "[AM] cleans your face!") + to_chat(cleaned_human, "[src] cleans your face!") diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 1b095c55..31023b3f 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,10 +10,11 @@ // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE) +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF") var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state MA.layer = layer MA.plane = plane + MA.color = color return MA diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 551a977a..3e7fc722 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -43,6 +43,12 @@ var/rad_flags = NONE // Will move to flags_1 when i can be arsed to var/rad_insulation = RAD_NO_INSULATION + var/icon/blood_splatter_icon + var/list/fingerprints + var/list/fingerprintshidden + var/list/blood_DNA + var/list/suit_fibers + /atom/New(loc, ...) //atom creation method that preloads variables at creation if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() @@ -231,7 +237,7 @@ return FALSE /atom/proc/CheckExit() - return 1 + return TRUE /atom/proc/HasProximity(atom/movable/AM as mob|obj) return @@ -298,6 +304,18 @@ /atom/proc/examine(mob/user) . = list("[get_examine_string(user, TRUE)].") + + //This reformat names to get a/an properly working on item descriptions when they are bloody + var/f_name = "\a [src]." + if(src.blood_DNA && !istype(src, /obj/effect/decal)) + if(gender == PLURAL) + f_name = "some " + else + f_name = "a " + f_name += "blood-stained [name]!" + + to_chat(user, "[icon2html(src, user)] That's [f_name]") + if(desc) . += desc @@ -360,12 +378,14 @@ //returns the mob's dna info as a list, to be inserted in an object's blood_DNA list /mob/living/proc/get_blood_dna_list() - if(get_blood_id() != "blood") + var/blood_id = get_blood_id() + if(!(blood_id =="blood" || blood_id == "jellyblood")) return return list("ANIMAL DNA" = "Y-") /mob/living/carbon/get_blood_dna_list() - if(get_blood_id() != "blood") + var/blood_id = get_blood_id() + if(!(blood_id =="blood" || blood_id == "jellyblood")) return var/list/blood_dna = list() if(dna) @@ -383,18 +403,116 @@ var/new_blood_dna = L.get_blood_dna_list() if(!new_blood_dna) return FALSE - var/old_length = blood_DNA_length() - add_blood_DNA(new_blood_dna) - if(blood_DNA_length() == old_length) + LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it. + var/old_length = blood_DNA.len + blood_DNA |= new_blood_dna + if(blood_DNA.len == old_length) return FALSE return TRUE +//to add blood dna info to the object's blood_DNA list +/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases) + LAZYINITLIST(blood_DNA) + var/old_length = blood_DNA.len + blood_DNA |= blood_dna + if(blood_DNA.len > old_length) + return TRUE + //some new blood DNA was added + //to add blood from a mob onto something, and transfer their dna info /atom/proc/add_mob_blood(mob/living/M) var/list/blood_dna = M.get_blood_dna_list() if(!blood_dna) return FALSE - return add_blood_DNA(blood_dna) + return add_blood_DNA(blood_dna, M.diseases) + +//to add blood onto something, with blood dna info to include. +/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return FALSE + +/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return transfer_blood_dna(blood_dna, diseases) + +/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + if(!.) + return + add_blood_overlay() + +/obj/item/proc/add_blood_overlay() + if(!blood_DNA.len) + return + if(initial(icon) && initial(icon_state)) + blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) + add_overlay(blood_splatter_icon) + +/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + transfer_blood = rand(2, 4) + +/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) + B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal. + return TRUE //we bloodied the floor + +/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + if(head) + head.add_blood_DNA(blood_dna, diseases) + update_inv_head() + else if(wear_mask) + wear_mask.add_blood_DNA(blood_dna, diseases) + update_inv_wear_mask() + if(wear_neck) + wear_neck.add_blood_DNA(blood_dna, diseases) + update_inv_neck() + if(wear_suit) + wear_suit.add_blood_DNA(blood_dna, diseases) + update_inv_wear_suit() + else if(w_uniform) + w_uniform.add_blood_DNA(blood_dna, diseases) + update_inv_w_uniform() + if(gloves) + var/obj/item/clothing/gloves/G = gloves + G.add_blood_DNA(blood_dna, diseases) + else + transfer_blood_dna(blood_dna, diseases) + bloody_hands = rand(2, 4) + update_inv_gloves() //handles bloody hands overlays and updating + return TRUE + +/atom/proc/blood_DNA_to_color() + var/list/colors = list()//first we make a list of all bloodtypes present + for(var/bloop in blood_DNA) + if(colors[blood_DNA[bloop]]) + colors[blood_DNA[bloop]]++ + else + colors[blood_DNA[bloop]] = 1 + + var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up + + if(colors.len) + var/sum = 0 //this is all shitcode, but it works; trust me + final_rgb = bloodtype_to_color(colors[1]) + sum = colors[colors[1]] + if(colors.len > 1) + var/i = 2 + while(i <= colors.len) + var/tmp = colors[colors[i]] + final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum)) + sum += tmp + i++ + + return final_rgb + +/atom/proc/clean_blood() + if(islist(blood_DNA)) + blood_DNA = null + return TRUE /atom/proc/wash_cream() return TRUE diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 78d79ea7..6d681f81 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -317,7 +317,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/meaty/xeno/ram_turf(turf/T) if(!isspaceturf(T)) - new /obj/effect/decal/cleanable/xenoblood(T) + new /obj/effect/decal/cleanable/blood/xeno(T) //Station buster Tunguska /obj/effect/meteor/tunguska diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm new file mode 100644 index 00000000..c489f6c9 --- /dev/null +++ b/code/game/machinery/bloodbankgen.dm @@ -0,0 +1,361 @@ +/obj/machinery/bloodbankgen + name = "blood bank generator" + desc = "Generates universally applicable synthetics for all blood types. Add regular blood to convert." + icon = 'icons/obj/bloodbank.dmi' + icon_state = "bloodbank-off" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 80 + circuit = /obj/item/circuitboard/machine/bloodbankgen + interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_ALLOW_SILICON + var/draining = FALSE + var/filling = FALSE + var/obj/item/reagent_containers/blood/bag = null + var/obj/item/reagent_containers/blood/outbag = null + var/bloodstored = 0 + var/maxbloodstored = 1000 + var/menustat = "menu" + var/efficiency = 0 + var/productivity = 0 + +/obj/machinery/bloodbankgen/Initialize() + . = ..() + create_reagents(1000) + update_icon() + +/obj/machinery/bloodbankgen/Destroy() + QDEL_NULL(bag) + QDEL_NULL(outbag) + return ..() + +/obj/machinery/bloodbankgen/contents_explosion(severity, target) + ..() + if(bag) + bag.ex_act(severity, target) + if(outbag) + outbag.ex_act(severity, target) + +/obj/machinery/bloodbankgen/handle_atom_del(atom/A) + ..() + if(A == bag) + bag = null + update_icon() + updateUsrDialog() + if(A == outbag) + outbag = null + update_icon() + updateUsrDialog() + +/obj/machinery/bloodbankgen/RefreshParts() + var/E = 0 + var/P = 0 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + E += M.rating + efficiency = E + productivity = P + +/obj/machinery/bloodbankgen/update_icon() + cut_overlays() + if(is_operational()) + icon_state = "bloodbank-on" + + if(panel_open) + add_overlay("bloodbank-panel") + + if(src.bag) + add_overlay("bloodbag-input") + if(bag.reagents.total_volume) + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "input-reagent") + + var/percent = round((bag.reagents.total_volume / bag.volume) * 100) + switch(percent) + if(0 to 9) + filling_overlay.icon_state = "input-reagent0" + if(10 to 24) + filling_overlay.icon_state = "input-reagent10" + if(25 to 49) + filling_overlay.icon_state = "input-reagent25" + if(50 to 74) + filling_overlay.icon_state = "input-reagent50" + if(75 to 79) + filling_overlay.icon_state = "input-reagent75" + if(80 to 90) + filling_overlay.icon_state = "input-reagent80" + if(91 to INFINITY) + filling_overlay.icon_state = "input-reagent100" + + filling_overlay.color = list(mix_color_from_reagents(bag.reagents.reagent_list)) + add_overlay(filling_overlay) + + if(src.outbag) + add_overlay("bloodbag-output") + if(outbag.reagents.total_volume) + var/mutable_appearance/filling_overlay = mutable_appearance(icon, "output-reagent") + + var/percent = round((outbag.reagents.total_volume / outbag.volume) * 100) + switch(percent) + if(0 to 9) + filling_overlay.icon_state = "output-reagent0" + if(10 to 24) + filling_overlay.icon_state = "output-reagent10" + if(25 to 49) + filling_overlay.icon_state = "output-reagent25" + if(50 to 74) + filling_overlay.icon_state = "output-reagent50" + if(75 to 79) + filling_overlay.icon_state = "output-reagent75" + if(80 to 90) + filling_overlay.icon_state = "output-reagent80" + if(91 to INFINITY) + filling_overlay.icon_state = "output-reagent100" + + filling_overlay.color = list(mix_color_from_reagents(outbag.reagents.reagent_list)) + add_overlay(filling_overlay) + return + +/obj/machinery/bloodbankgen/process() + if(!is_operational()) + return PROCESS_KILL + + bloodstored = reagents.total_volume + + var/transfer_amount = 20 + + if(draining) + if(reagents.total_volume >= reagents.maximum_volume) + draining = FALSE + return + + if(bag) + if(bag.reagents.total_volume) + var/datum/reagent/blood/B = bag.reagents.has_reagent("blood") + if(B) + var/amount = reagents.maximum_volume - reagents.total_volume //monitor the machine's internal storage + amount = min(amount, transfer_amount) + if(!amount) + draining = FALSE + updateUsrDialog() + visible_message("[src] beeps loudly.") + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + return + + if(bag.blood_type == "SY") //no infinite loops using synthetics. + reagents.add_reagent("syntheticblood", amount) + else + reagents.add_reagent("syntheticblood", (amount+(5*efficiency))) + + if(bag.reagents.total_volume >= amount) + bag.reagents.remove_reagent("blood", amount) + else + visible_message("[src] beeps loudly.") + playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) + draining = FALSE + + bag.update_icon() + update_icon() + updateUsrDialog() + else + draining = FALSE + updateUsrDialog() + return + + if(filling) + if(!reagents || !reagents.total_volume) + filling = FALSE //there ain't anything in the machine yo. + return + if(outbag && outbag.reagents.total_volume < outbag.reagents.maximum_volume) + var/amount = outbag.reagents.maximum_volume - outbag.reagents.total_volume //monitor the output bag's internal storage + amount = min(amount, transfer_amount) + if(!amount) + filling = FALSE + visible_message("[src] pings.") + playsound(loc, 'sound/machines/beep.ogg', 50, 1) + updateUsrDialog() + return + + reagents.trans_to(outbag, amount) + outbag.update_icon() + update_icon() + updateUsrDialog() + else + visible_message("[src] pings.") + playsound(loc, 'sound/machines/beep.ogg', 50, 1) + filling = FALSE + updateUsrDialog() + return + +/obj/machinery/bloodbankgen/attackby(obj/item/O, mob/user, params) + if(user.a_intent == INTENT_HARM) + return ..() + + if(default_deconstruction_screwdriver(user, "bloodbank-off", "bloodbank-off", O)) + if(bag) + var/obj/item/reagent_containers/blood/B = bag + B.forceMove(drop_location()) + bag = null + if(outbag) + var/obj/item/reagent_containers/blood/B = outbag + B.forceMove(drop_location()) + outbag = null + update_icon() + return + + if(default_deconstruction_crowbar(O)) + return + + if(istype(O, /obj/item/reagent_containers/blood)) + . = 1 //no afterattack + if(!panel_open) + if(bag && outbag) + to_chat(user, "This machine already has bags attached.") + + if(!bag && !outbag) + var/choice = alert(user, "Choose where to place [O]", "", "Input", "Cancel", "Output") + switch(choice) + if("Cancel") + return FALSE + if("Input") + attachinput(O, user) + if("Output") + attachoutput(O, user) + else if(!bag) + attachinput(O, user) + else if(!outbag) + attachoutput(O, user) + else + to_chat(user, "Close the maintenance panel first.") + return + + else + to_chat(user, "You cannot put this in [src]!") + +/obj/machinery/bloodbankgen/ui_interact(mob/user) + . = ..() + + if(!is_operational()) + return + + var/dat + switch(menustat) + if("noblood") + dat += "
You do not have enough blood product to create synthetics.
" + menustat = "menu" + if("complete") + dat += "
Operation complete.
" + menustat = "menu" + if("nobagspace") + dat += "
Not enough space left in container. Please replace receptical.
" + menustat = "menu" + + dat+= "
Current Synthetics stockpile: [reagents.total_volume] units.
" + + dat += "
Supply Bag
" + if(bag) + dat += "
Current Capacity: [bag.reagents.total_volume] of [bag.reagents.maximum_volume]" + if(bag.reagents && bag.reagents.total_volume) + dat += "
Drain" + + dat += "
Detach" + + + dat += "

Synthetics Bag
" + if(outbag) + dat += "
Current Capacity:[outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]" + if(!(outbag.reagents.total_volume >= outbag.reagents.maximum_volume)) + dat += "
Fill" + dat += "
Detach" + + if(!bag && !outbag) + dat += "
No containers inside, please insert container.
" + + var/datum/browser/popup = new(user, "bloodbankgen", name, 350, 520) + popup.set_content(dat) + popup.open() + +/obj/machinery/bloodbankgen/proc/activateinput() + if(bag) + draining = TRUE + update_icon() + else + to_chat(usr, "There is no blood bag in the input slot.") + return + +/obj/machinery/bloodbankgen/proc/activateoutput() + if(outbag) + filling = TRUE + update_icon() + else + to_chat(usr, "There is no blood bag in the output slot.") + return + +/obj/machinery/bloodbankgen/proc/check_container_volume(list/reagents, multiplier = 1) + var/sum_reagents = 0 + for(var/R in reagents) + sum_reagents += reagents[R] + sum_reagents *= multiplier + + if(outbag.reagents.total_volume + sum_reagents > outbag.reagents.maximum_volume) + menustat = "nobagspace" + return FALSE + + return TRUE + +/obj/machinery/bloodbankgen/proc/detachinput() + if(bag) + bag.forceMove(drop_location()) + if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) + usr.put_in_hands(bag) + bag = null + update_icon() + +/obj/machinery/bloodbankgen/proc/detachoutput() + if(outbag) + outbag.forceMove(drop_location()) + if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) + usr.put_in_hands(outbag) + outbag = null + update_icon() + +/obj/machinery/bloodbankgen/proc/attachinput(obj/item/O, mob/user) + if(!bag) + if(!user.transferItemToLoc(O, src)) + return + bag = O + to_chat(user, "You add [O] to the machine's input slot.") + update_icon() + updateUsrDialog() + else + to_chat(user, "There is already something in this slot!") + +/obj/machinery/bloodbankgen/proc/attachoutput(obj/item/O, mob/user) + if(!outbag) + if(!user.transferItemToLoc(O, src)) + return + outbag = O + to_chat(user, "You add [O] to the machine's output slot.") + update_icon() + updateUsrDialog() + else + to_chat(user, "There is already something in this slot!") + +/obj/machinery/bloodbankgen/Topic(href, href_list) + if(..() || panel_open) + return + + usr.set_machine(src) + + if(href_list["activateinput"]) + activateinput() + updateUsrDialog() + + else if(href_list["detachinput"]) + detachinput() + updateUsrDialog() + + else if(href_list["activateoutput"]) + activateoutput() + updateUsrDialog() + + else if(href_list["detachoutput"]) + detachoutput() + updateUsrDialog() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a7d62ea6..69363d5a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -329,7 +329,7 @@ else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = get_turf(src) - //add_blood doesn't work for borgs/xenos, but add_blood_floor does. + //add_blood_DNA doesn't work for borgs/xenos, but add_blood_floor does. if(iscarbon(L)) var/mob/living/carbon/C = L C.bleed(DOOR_CRUSH_DAMAGE) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index f03c4bf6..e2a7ba99 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -8,14 +8,14 @@ icon_state = "iv_drip" anchored = FALSE mouse_drag_pointer = MOUSE_ACTIVE_POINTER - var/mob/living/carbon/attached = null + var/mob/living/carbon/attached var/mode = IV_INJECTING - var/obj/item/reagent_containers/beaker = null + var/obj/item/reagent_containers/beaker var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood, /obj/item/reagent_containers/food, /obj/item/reagent_containers/glass, /obj/item/reagent_containers/chem_pack)) -/obj/machinery/iv_drip/Initialize() +/obj/machinery/iv_drip/Initialize(mapload) . = ..() update_icon() @@ -84,6 +84,8 @@ if(Adjacent(target) && usr.Adjacent(target)) if(beaker) usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") + log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])") + add_fingerprint(usr) attached = target START_PROCESSING(SSmachines, src) update_icon() @@ -100,6 +102,8 @@ return beaker = W to_chat(user, "You attach [W] to [src].") + user.log_message("attached a [W] to [src] at [AREACOORD(src)] containing ([beaker.reagents.log_list()])", LOG_ATTACK) + add_fingerprint(user) update_icon() return else @@ -142,10 +146,11 @@ if(!amount) if(prob(5)) visible_message("[src] pings.") + playsound(loc, 'sound/machines/beep.ogg', 50, 1) return // If the human is losing too much blood, beep. - if(attached.blood_volume < ( (BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) ) ) + if(attached.blood_volume < ((BLOOD_VOLUME_SAFE*attached.blood_ratio) && prob(5) && ishuman(attached))) //really couldn't care less about monkeys visible_message("[src] beeps loudly.") playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) attached.transfer_blood_to(beaker, amount) @@ -178,9 +183,10 @@ if(usr.incapacitated()) return - if(beaker) - beaker.forceMove(drop_location()) + if(usr && Adjacent(usr) && !issiliconoradminghost(usr)) + if(!usr.put_in_hands(beaker)) + beaker.forceMove(drop_location()) beaker = null update_icon() @@ -195,7 +201,6 @@ if(usr.incapacitated()) return - mode = !mode to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") update_icon() @@ -204,7 +209,9 @@ . = ..() if(get_dist(user, src) > 2) return + . += "[src] is [mode ? "injecting" : "taking blood"].\n" + if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) . += "\tAttached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.\n" diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 85720764..e4e19668 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -265,6 +265,8 @@ things_to_clear += occupant.GetAllContents() for(var/atom/movable/AM in things_to_clear) //Scorches away blood and forensic evidence, although the SSU itself is unaffected SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG) + AM.clean_blood() + AM.fingerprints = list() var/datum/component/radioactive/contamination = AM.GetComponent(/datum/component/radioactive) if(contamination) qdel(contamination) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index acc123b5..5ea822f5 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -11,10 +11,6 @@ var/obj/item/color_source var/max_wash_capacity = 5 -/obj/machinery/washing_machine/ComponentInitialize() - . = ..() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) - /obj/machinery/washing_machine/examine(mob/user) . = ..() . += "Alt-click it to start a wash cycle." @@ -59,7 +55,8 @@ M.Translate(rand(-3, 3), rand(-1, 3)) animate(src, transform=M, time=2) -/obj/machinery/washing_machine/proc/clean_blood() +/obj/machinery/washing_machine/clean_blood() + ..() if(!busy) bloody_mess = FALSE update_icon() @@ -67,7 +64,8 @@ /obj/machinery/washing_machine/proc/wash_cycle() for(var/X in contents) var/atom/movable/AM = X - SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(AM, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + AM.clean_blood() AM.machine_wash(src) busy = FALSE diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 44bd9643..b200dc03 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -10,6 +10,7 @@ /obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases) . = ..() + LAZYINITLIST(blood_DNA) //Kinda needed if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0) icon_state = pick(random_icon_states) create_reagents(300) @@ -29,7 +30,7 @@ /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal if(mergeable_decal) - return TRUE + qdel(C) /obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) @@ -83,7 +84,9 @@ add_blood = bloodiness bloodiness -= add_blood S.bloody_shoes[blood_state] = min(MAX_SHOE_BLOODINESS,S.bloody_shoes[blood_state]+add_blood) - S.add_blood_DNA(return_blood_DNA()) + if(blood_DNA && blood_DNA.len) + S.add_blood_DNA(blood_DNA) + S.add_blood_overlay() S.blood_state = blood_state update_icon() H.update_inv_shoes() @@ -92,4 +95,4 @@ if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) return bloodiness else - return 0 + return FALSE diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 663707de..4301709f 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -1,71 +1,73 @@ // 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... blood?" - icon = 'icons/effects/blood.dmi' - icon_state = "xfloor1" - random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - bloodiness = BLOOD_AMOUNT_PER_DECAL - blood_state = BLOOD_STATE_XENO + color = BLOOD_COLOR_XENO -/obj/effect/decal/cleanable/xenoblood/Initialize() +/obj/effect/decal/cleanable/blood/splatter/xeno + color = BLOOD_COLOR_XENO + +/obj/effect/decal/cleanable/blood/gibs/xeno + color = BLOOD_COLOR_XENO + gibs_reagent_id = "liquidxenogibs" + gibs_bloodtype = "X*" + +/obj/effect/decal/cleanable/blood/gibs/xeno/Initialize(mapload, list/datum/disease/diseases) . = ..() - add_blood_DNA(list("UNKNOWN DNA" = "X*")) + update_icon() -/obj/effect/decal/cleanable/xenoblood/xsplatter - random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5") +/obj/effect/decal/cleanable/blood/gibs/xeno/update_icon() + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]x_flesh") + flesh.appearance_flags = RESET_COLOR + flesh.color = body_colors + add_overlay(flesh) -/obj/effect/decal/cleanable/xenoblood/xgibs - name = "xeno gibs" - desc = "Gnarly..." - icon = 'icons/effects/blood.dmi' - icon_state = "xgib1" - layer = LOW_OBJ_LAYER - random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6") - mergeable_decal = FALSE - -/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions) +/obj/effect/decal/cleanable/blood/gibs/xeno/streak(list/directions) set waitfor = 0 var/direction = pick(directions) for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) sleep(2) if(i > 0) - new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) + var/list/datum/disease/diseases + GET_COMPONENT(infective, /datum/component/infective) + if(infective) + diseases = infective.diseases + var/obj/effect/decal/cleanable/blood/splatter/xeno/splat = new /obj/effect/decal/cleanable/blood/splatter/xeno(loc, diseases) + splat.transfer_blood_dna(blood_DNA, diseases) if(!step_to(src, get_step(src, direction), 0)) break -/obj/effect/decal/cleanable/xenoblood/xgibs/ex_act() - return +/obj/effect/decal/cleanable/blood/gibs/xeno/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") -/obj/effect/decal/cleanable/xenoblood/xgibs/up - random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibup1","xgibup1","xgibup1") +/obj/effect/decal/cleanable/blood/gibs/xeno/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") -/obj/effect/decal/cleanable/xenoblood/xgibs/down - random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6","xgibdown1","xgibdown1","xgibdown1") +/obj/effect/decal/cleanable/blood/gibs/xeno/body + random_icon_states = list("gibhead", "gibtorso") -/obj/effect/decal/cleanable/xenoblood/xgibs/body - random_icon_states = list("xgibhead", "xgibtorso") +/obj/effect/decal/cleanable/blood/gibs/xeno/torso + random_icon_states = list("gibtorso") -/obj/effect/decal/cleanable/xenoblood/xgibs/torso - random_icon_states = list("xgibtorso") +/obj/effect/decal/cleanable/blood/gibs/xeno/limb + random_icon_states = list("gibleg", "gibarm") -/obj/effect/decal/cleanable/xenoblood/xgibs/limb - random_icon_states = list("xgibleg", "xgibarm") +/obj/effect/decal/cleanable/blood/gibs/xeno/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") -/obj/effect/decal/cleanable/xenoblood/xgibs/core - random_icon_states = list("xgibmid1", "xgibmid2", "xgibmid3") - -/obj/effect/decal/cleanable/xenoblood/xgibs/larva +/obj/effect/decal/cleanable/blood/gibs/xeno/larva random_icon_states = list("xgiblarva1", "xgiblarva2") -/obj/effect/decal/cleanable/xenoblood/xgibs/larva/body +/obj/effect/decal/cleanable/blood/gibs/xeno/larva/body random_icon_states = list("xgiblarvahead", "xgiblarvatorso") /obj/effect/decal/cleanable/blood/xtracks - icon_state = "xtracks" + icon_state = "tracks" random_icon_states = null /obj/effect/decal/cleanable/blood/xtracks/Initialize() + add_blood_DNA(list("UNKNOWN DNA" = "X*")) . = ..() - add_blood_DNA(list("Unknown DNA" = "X*")) diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm new file mode 100644 index 00000000..e5d38d3e --- /dev/null +++ b/code/game/objects/effects/decals/cleanable/gibs.dm @@ -0,0 +1,233 @@ +/obj/effect/decal/cleanable/blood/gibs + name = "gibs" + desc = "They look bloody and gruesome." + icon_state = "gibbl5" + layer = LOW_OBJ_LAYER + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") + mergeable_decal = FALSE + var/body_colors = "#e3ba84" //a default color just in case. + var/gibs_reagent_id = "liquidgibs" + var/gibs_bloodtype = "A+" + +/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) + . = ..() + if(random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0) + icon_state = pick(random_icon_states) + if(gibs_reagent_id) + reagents.add_reagent(gibs_reagent_id, 5) + if(gibs_bloodtype) + add_blood_DNA(list("Non-human DNA" = gibs_bloodtype, diseases)) + update_icon() + + +/obj/effect/decal/cleanable/blood/gibs/update_icon() + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]_guts") + guts.appearance_flags = RESET_COLOR + add_overlay(guts) + var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]_flesh") + flesh.appearance_flags = RESET_COLOR + flesh.color = body_colors + add_overlay(flesh) + +/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) + return + +/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L) + if(istype(L) && has_gravity(loc)) + playsound(loc, 'sound/effects/gib_step.ogg', !HAS_TRAIT(L,TRAIT_LIGHT_STEP) ? 20 : 50, 1) + . = ..() + +/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) + set waitfor = 0 + var/direction = pick(directions) + for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) + sleep(2) + if(i > 0) + var/list/datum/disease/diseases + GET_COMPONENT(infective, /datum/component/infective) + if(infective) + diseases = infective.diseases + var/obj/effect/decal/cleanable/blood/splatter/splat = new /obj/effect/decal/cleanable/blood/splatter(loc, diseases) + splat.transfer_blood_dna(blood_DNA, diseases) + if(!step_to(src, get_step(src, direction), 0)) + break + +/obj/effect/decal/cleanable/blood/gibs/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/torso + random_icon_states = list("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/old + name = "old rotting gibs" + desc = "Space Jesus, why didn't anyone clean this up? It smells terrible." + bloodiness = 0 + +/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases) + . = ..() + setDir(pick(GLOB.cardinals)) + icon_state += "-old" + update_icon() + +/obj/effect/decal/cleanable/blood/drip + name = "drips of blood" + desc = "It's gooey." + icon_state = "1" + random_icon_states = list("drip1","drip2","drip3","drip4","drip5") + bloodiness = 0 + var/drips = 1 + +/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() + return TRUE + +/obj/effect/decal/cleanable/blood/gibs/human + +/obj/effect/decal/cleanable/blood/gibs/human/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/human/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/human/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/human/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/human/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + + +//Lizards +/obj/effect/decal/cleanable/blood/gibs/human/lizard + body_colors = "117720" + gibs_reagent_id = "liquidgibs" + gibs_bloodtype = "L" + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/human/lizard/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + +// Slime Gibs +/obj/effect/decal/cleanable/blood/gibs/slime + desc = "They look gooey and gruesome." + gibs_reagent_id = "liquidslimegibs" + gibs_bloodtype = "GEL" + +/obj/effect/decal/cleanable/blood/gibs/slime/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/slime/update_icon() + add_atom_colour(body_colors, FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]s_guts") + guts.appearance_flags = RESET_COLOR + guts.color = body_colors + add_overlay(guts) + var/mutable_appearance/flesh = mutable_appearance(icon, "[icon_state]_flesh") + flesh.appearance_flags = RESET_COLOR + flesh.color = body_colors + add_overlay(flesh) + +/obj/effect/decal/cleanable/blood/gibs/slime/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/slime/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/slime/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/slime/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/slime/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/slime/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") + +/obj/effect/decal/cleanable/blood/gibs/synth + desc = "They look sludgy and disgusting." + gibs_reagent_id = "liquidsyntheticgibs" + gibs_bloodtype = "SY" + +/obj/effect/decal/cleanable/blood/gibs/synth/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +//IPCs +/obj/effect/decal/cleanable/blood/gibs/ipc + desc = "They look sharp yet oozing." + body_colors = "00ff00" + gibs_reagent_id = "liquidoilgibs" + gibs_bloodtype = "HF" + +/obj/effect/decal/cleanable/blood/gibs/ipc/Initialize(mapload, list/datum/disease/diseases) + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/gibs/ipc/update_icon() + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + cut_overlays() + var/mutable_appearance/guts = mutable_appearance(icon, "[icon_state]r-overlay") + guts.appearance_flags = RESET_COLOR + add_overlay(guts) + +/obj/effect/decal/cleanable/blood/gibs/ipc/up + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + +/obj/effect/decal/cleanable/blood/gibs/ipc/down + random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + +/obj/effect/decal/cleanable/blood/gibs/ipc/body + random_icon_states = list("gibhead", "gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/ipc/torso + random_icon_states = list("gibtorso") + +/obj/effect/decal/cleanable/blood/gibs/ipc/limb + random_icon_states = list("gibleg", "gibarm") + +/obj/effect/decal/cleanable/blood/gibs/ipc/core + random_icon_states = list("gibmid1", "gibmid2", "gibmid3") diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 439ae734..80169778 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -1,31 +1,45 @@ /obj/effect/decal/cleanable/blood name = "blood" - desc = "It's red and gooey. Perhaps it's the chef's cooking?" + desc = "It's gooey. Perhaps it's the chef's cooking?" icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") - blood_state = BLOOD_STATE_HUMAN - bloodiness = BLOOD_AMOUNT_PER_DECAL + blood_state = BLOOD_STATE_BLOOD + bloodiness = MAX_SHOE_BLOODINESS + color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) - C.add_blood_DNA(return_blood_DNA()) - if (bloodiness) - if (C.bloodiness < MAX_SHOE_BLOODINESS) - C.bloodiness += bloodiness - return ..() + if (C.blood_DNA) + blood_DNA |= C.blood_DNA.Copy() + update_icon() + ..() + +/obj/effect/decal/cleanable/blood/transfer_blood_dna() + ..() + update_icon() + +/obj/effect/decal/cleanable/blood/transfer_mob_blood_dna() + . = ..() + update_icon() + +/obj/effect/decal/cleanable/blood/update_icon() + color = blood_DNA_to_color() /obj/effect/decal/cleanable/blood/old name = "dried blood" - desc = "Looks like it's been here a while. Eew." + desc = "Looks like it's been here a while. Eew." bloodiness = 0 /obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases) - icon_state += "-old" //This IS necessary because the parent /blood type uses icon randomization. - add_blood_DNA(list("Non-human DNA" = "A+")) // Needs to happen before ..() - return ..() + ..() + icon_state += "-old" + add_blood_DNA(list("Non-human DNA" = "A+")) + +/obj/effect/decal/cleanable/blood/splats + random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") /obj/effect/decal/cleanable/blood/splatter - random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + random_icon_states = list("splatter1", "splatter2", "splatter3", "splatter4", "splatter5") /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" @@ -39,84 +53,27 @@ random_icon_states = null var/list/existing_dirs = list() -/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() - return TRUE +/obj/effect/decal/cleanable/trail_holder/update_icon() + color = blood_DNA_to_color() -/obj/effect/decal/cleanable/blood/gibs - name = "gibs" - desc = "They look bloody and gruesome." - icon = 'icons/effects/blood.dmi' - icon_state = "gibbl5" - layer = LOW_OBJ_LAYER - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") - mergeable_decal = FALSE - -/obj/effect/decal/cleanable/blood/gibs/Initialize(mapload, list/datum/disease/diseases) +/obj/effect/cleanable/trail_holder/Initialize() . = ..() - reagents.add_reagent("liquidgibs", 5) + update_icon() /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return -/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L) - if(istype(L) && has_gravity(loc)) - playsound(loc, 'sound/effects/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, 1) - . = ..() - -/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) - set waitfor = 0 - var/direction = pick(directions) - for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) - sleep(2) - if(i > 0) - var/list/datum/disease/diseases - GET_COMPONENT(infective, /datum/component/infective) - if(infective) - diseases = infective.diseases - new /obj/effect/decal/cleanable/blood/splatter(loc, diseases) - if(!step_to(src, get_step(src, direction), 0)) - break - -/obj/effect/decal/cleanable/blood/gibs/up - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") - -/obj/effect/decal/cleanable/blood/gibs/down - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") - -/obj/effect/decal/cleanable/blood/gibs/body - random_icon_states = list("gibhead", "gibtorso") - -/obj/effect/decal/cleanable/blood/gibs/torso - random_icon_states = list("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/old - name = "old rotting gibs" - desc = "Space Jesus, why didn't anyone clean this up? It smells terrible." - bloodiness = 0 - -/obj/effect/decal/cleanable/blood/gibs/old/Initialize(mapload, list/datum/disease/diseases) - . = ..() - setDir(pick(1,2,4,8)) - icon_state += "-old" - add_blood_DNA(list("Non-human DNA" = "A+")) - -/obj/effect/decal/cleanable/blood/drip - name = "drips of blood" - desc = "It's red." - icon_state = "1" - random_icon_states = list("drip1","drip2","drip3","drip4","drip5") - bloodiness = 0 - var/drips = 1 - -/obj/effect/decal/cleanable/blood/drip/can_bloodcrawl_in() +/obj/effect/decal/cleanable/trail_holder/can_bloodcrawl_in() return TRUE +/obj/effect/decal/cleanable/trail_holder/transfer_blood_dna() + ..() + update_icon() + +/obj/effect/decal/cleanable/trail_holder/transfer_mob_blood_dna() + . = ..() + update_icon() + //BLOODY FOOTPRINTS /obj/effect/decal/cleanable/blood/footprints @@ -127,15 +84,16 @@ random_icon_states = null var/entered_dirs = 0 var/exited_dirs = 0 - blood_state = BLOOD_STATE_HUMAN //the icon state to load images from + blood_state = BLOOD_STATE_BLOOD //the icon state to load images from var/list/shoe_types = list() /obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) - ..() if(ishuman(O)) var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes if(S && S.bloody_shoes[blood_state]) + if(color != bloodtype_to_color(S.last_bloodtype)) + return S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) shoe_types |= S.type if (!(entered_dirs & H.dir)) @@ -143,11 +101,12 @@ update_icon() /obj/effect/decal/cleanable/blood/footprints/Uncrossed(atom/movable/O) - ..() if(ishuman(O)) var/mob/living/carbon/human/H = O var/obj/item/clothing/shoes/S = H.shoes if(S && S.bloody_shoes[blood_state]) + if(color != bloodtype_to_color(S.last_bloodtype))//last entry - we check its color + return S.bloody_shoes[blood_state] = max(S.bloody_shoes[blood_state] - BLOOD_LOSS_PER_STEP, 0) shoe_types |= S.type if (!(exited_dirs & H.dir)) @@ -156,8 +115,8 @@ /obj/effect/decal/cleanable/blood/footprints/update_icon() + ..() cut_overlays() - for(var/Ddir in GLOB.cardinals) if(entered_dirs & Ddir) var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] @@ -170,7 +129,7 @@ GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) add_overlay(bloodstep_overlay) - alpha = BLOODY_FOOTPRINT_BASE_ALPHA+bloodiness + alpha = BLOODY_FOOTPRINT_BASE_ALPHA + bloodiness /obj/effect/decal/cleanable/blood/footprints/examine(mob/user) @@ -184,9 +143,49 @@ /obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) if(blood_state != C.blood_state) //We only replace footprints of the same type as us return + if(color != C.color) + return ..() /obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) - return 1 - return 0 + return TRUE + return FALSE + +/* Eventually TODO: make snowflake trails like baycode's +/obj/effect/decal/cleanable/blood/footprints/tracks/shoe + name = "footprints" + desc = "They look like tracks left by footwear." + icon_state = FOOTPRINT_SHOE + print_state = FOOTPRINT_SHOE +/obj/effect/decal/cleanable/blood/footprints/tracks/foot + name = "footprints" + desc = "They look like tracks left by a bare foot." + icon_state = FOOTPRINT_FOOT + print_state = FOOTPRINT_FOOT +/obj/effect/decal/cleanable/blood/footprints/tracks/snake + name = "tracks" + desc = "They look like tracks left by a giant snake." + icon_state = FOOTPRINT_SNAKE + print_state = FOOTPRINT_SNAKE +/obj/effect/decal/cleanable/blood/footprints/tracks/paw + name = "footprints" + desc = "They look like tracks left by paws." + icon_state = FOOTPRINT_PAW + print_state = FOOTPRINT_PAW +/obj/effect/decal/cleanable/blood/footprints/tracks/claw + name = "footprints" + desc = "They look like tracks left by claws." + icon_state = FOOTPRINT_CLAW + print_state = FOOTPRINT_CLAW +/obj/effect/decal/cleanable/blood/footprints/tracks/wheels + name = "tracks" + desc = "They look like tracks left by wheels." + gender = PLURAL + icon_state = FOOTPRINT_WHEEL + print_state = FOOTPRINT_WHEEL +/obj/effect/decal/cleanable/blood/footprints/tracks/body + name = "trails" + desc = "A trail left by something being dragged." + icon_state = FOOTPRINT_DRAG + print_state = FOOTPRINT_DRAG */ diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 833b89e6..cd208d33 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -11,6 +11,10 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL mergeable_decal = FALSE +/obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases) + . = ..() + reagents.add_reagent("liquidoilgibs", 5) + /obj/effect/decal/cleanable/robot_debris/proc/streak(list/directions) set waitfor = 0 var/direction = pick(directions) @@ -50,6 +54,7 @@ /obj/effect/decal/cleanable/oil/Initialize() . = ..() reagents.add_reagent("oil", 30) + reagents.add_reagent("liquidoilgibs", 5) /obj/effect/decal/cleanable/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index d4f440c3..baec60a8 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -1,25 +1,68 @@ - /obj/effect/gibspawner - var/sparks = 0 //whether sparks spread + var/sparks = FALSE //whether sparks spread var/virusProb = 20 //the chance for viruses to spread on the gibs + var/gib_mob_type //generate a fake mob to transfer DNA from if we weren't passed a mob. + var/gib_mob_species //We'll want to nip-pick their species for blood type stuff + var/sound_to_play = 'sound/effects/blobattack.ogg' + var/sound_vol = 60 var/list/gibtypes = list() //typepaths of the gib decals to spawn var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn. var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards. -/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA, list/datum/disease/diseases) +/obj/effect/gibspawner/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases) . = ..() - - if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) - to_chat(world, "Gib list length mismatch!") + if(gibtypes.len != gibamounts.len) + stack_trace("Gib list amount length mismatch!") + return + if(gibamounts.len != gibdirections.len) + stack_trace("Gib list dir length mismatch!") return var/obj/effect/decal/cleanable/blood/gibs/gib = null + if(sound_to_play && isnum(sound_vol)) + playsound(src, sound_to_play, sound_vol, TRUE) + if(sparks) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(2, 1, loc) s.start() + var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling. + var/body_coloring = "" + if(source_mob) + dna_to_add = source_mob.get_blood_dna_list() //ez pz + if(ishuman(source_mob)) + var/mob/living/carbon/human/H = source_mob + if(H.dna.species.use_skintones) + body_coloring = "#[skintone2hex(H.skin_tone)]" + else + body_coloring = "#[H.dna.features["mcolor"]]" + + else if(gib_mob_type) + var/mob/living/temp_mob = new gib_mob_type(src) //generate a fake mob so that we pull the right type of DNA for the gibs. + if(gib_mob_species) + if(ishuman(temp_mob)) + var/mob/living/carbon/human/H = temp_mob + H.set_species(gib_mob_species) + dna_to_add = temp_mob.get_blood_dna_list() + if(H.dna.species.use_skintones) + body_coloring = "#[skintone2hex(H.skin_tone)]" + else + body_coloring = "#[H.dna.features["mcolor"]]" + qdel(H) + else + dna_to_add = temp_mob.get_blood_dna_list() + qdel(temp_mob) + else if(!issilicon(temp_mob)) + dna_to_add = temp_mob.get_blood_dna_list() + qdel(temp_mob) + else + qdel(temp_mob) + else + dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it. + + for(var/i = 1, i<= gibtypes.len, i++) if(gibamounts[i]) for(var/j = 1, j<= gibamounts[i], j++) @@ -29,10 +72,11 @@ var/mob/living/carbon/digester = loc digester.stomach_contents += gib - if(MobDNA) + if(dna_to_add && dna_to_add.len) + gib.add_blood_DNA(dna_to_add) + gib.body_colors = body_coloring + gib.update_icon() - else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey - gib.add_blood_DNA(list("Non-human DNA" = "A+")) var/list/directions = gibdirections[i] if(isturf(loc)) if(directions.len) @@ -41,80 +85,157 @@ return INITIALIZE_HINT_QDEL - /obj/effect/gibspawner/generic gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core) - gibamounts = list(2,2,1) + gibamounts = list(2, 2, 1) + sound_vol = 40 /obj/effect/gibspawner/generic/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 40, 1) - gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) + return ..() + +/obj/effect/gibspawner/generic/animal + gib_mob_type = /mob/living/simple_animal/pet /obj/effect/gibspawner/human - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core) - gibamounts = list(1,1,1,1,1,1,1) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/up, /obj/effect/decal/cleanable/blood/gibs/human/down, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/body, /obj/effect/decal/cleanable/blood/gibs/human/limb, /obj/effect/decal/cleanable/blood/gibs/human/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human + gib_mob_species = /datum/species/human + sound_vol = 50 /obj/effect/gibspawner/human/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 50, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() - -/obj/effect/gibspawner/humanbodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso) +/obj/effect/gibspawner/human/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/core, /obj/effect/decal/cleanable/blood/gibs/human, /obj/effect/decal/cleanable/blood/gibs/human/torso) gibamounts = list(1, 1, 1, 1, 1, 1) -/obj/effect/gibspawner/humanbodypartless/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 50, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - . = ..() +/obj/effect/gibspawner/human/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() +/obj/effect/gibspawner/lizard + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard/up, /obj/effect/decal/cleanable/blood/gibs/human/lizard/down, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/body, /obj/effect/decal/cleanable/blood/gibs/human/lizard/limb, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human/species/lizard + gib_mob_species = /datum/species/lizard + sound_vol = 50 + +/obj/effect/gibspawner/lizard/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/lizard/bodypartless + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/core, /obj/effect/decal/cleanable/blood/gibs/human/lizard, /obj/effect/decal/cleanable/blood/gibs/human/lizard/torso) + gibamounts = list(1, 1, 1, 1, 1, 1) + +/obj/effect/gibspawner/lizard/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/slime + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime/up, /obj/effect/decal/cleanable/blood/gibs/slime/down, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/body, /obj/effect/decal/cleanable/blood/gibs/slime/limb, /obj/effect/decal/cleanable/blood/gibs/slime/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human/species/roundstartslime + gib_mob_species = /datum/species/jelly/roundstartslime + sound_vol = 50 + +/obj/effect/gibspawner/slime/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/slime/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/core, /obj/effect/decal/cleanable/blood/gibs/slime, /obj/effect/decal/cleanable/blood/gibs/slime/torso) + gibamounts = list(1, 1, 1, 1, 1, 1) + +/obj/effect/gibspawner/slime/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/ipc + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc/up, /obj/effect/decal/cleanable/blood/gibs/ipc/down, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/body, /obj/effect/decal/cleanable/blood/gibs/ipc/limb, /obj/effect/decal/cleanable/blood/gibs/ipc/core) + gibamounts = list(1, 1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/human/species/ipc + gib_mob_species = /datum/species/ipc + sound_vol = 50 + sparks = TRUE + sound_to_play = 'sound/effects/bang.ogg' + +/obj/effect/gibspawner/ipc/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() + +/obj/effect/gibspawner/ipc/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/core, /obj/effect/decal/cleanable/blood/gibs/ipc, /obj/effect/decal/cleanable/blood/gibs/ipc/torso) + gibamounts = list(1, 1, 1, 1, 1, 1) + +/obj/effect/gibspawner/ipc/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() /obj/effect/gibspawner/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) - gibamounts = list(1,1,1,1,1,1,1) + 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) + gib_mob_type = /mob/living/carbon/alien /obj/effect/gibspawner/xeno/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) + return ..() - -/obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso). - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/core, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/xenoblood/xgibs/torso) +/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso). + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/torso) gibamounts = list(1, 1, 1, 1, 1, 1) +/obj/effect/gibspawner/xeno/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) + return ..() -/obj/effect/gibspawner/xenobodypartless/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - . = ..() +/obj/effect/gibspawner/xeno/xenoperson + gib_mob_type = /mob/living/carbon/human/species/xeno + gib_mob_species = /datum/species/xeno + +/obj/effect/gibspawner/xeno/xenoperson/bodypartless /obj/effect/gibspawner/larva - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body) gibamounts = list(1, 1, 1, 1) + gib_mob_type = /mob/living/carbon/alien/larva /obj/effect/gibspawner/larva/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) + return ..() -/obj/effect/gibspawner/larvabodypartless - gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva) +/obj/effect/gibspawner/larva/bodypartless + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva) gibamounts = list(1, 1, 1) -/obj/effect/gibspawner/larvabodypartless/Initialize() - playsound(src, 'sound/effects/blobattack.ogg', 60, 1) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) - . = ..() +/obj/effect/gibspawner/larva/bodypartless/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) + return ..() /obj/effect/gibspawner/robot - sparks = 1 + sparks = TRUE 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) - gibamounts = list(1,1,1,1,1,1) + gibamounts = list(1, 1, 1, 1, 1, 1) + gib_mob_type = /mob/living/silicon/robot /obj/effect/gibspawner/robot/Initialize() - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) - gibamounts[6] = pick(0,1,2) - . = ..() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) + gibamounts[6] = pick(0, 1, 2) + return ..() diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index dd7267c5..296112a4 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -6,7 +6,9 @@ layer = BELOW_MOB_LAYER var/splatter_type = "splatter" -/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir) +/obj/effect/temp_visual/dir_setting/bloodsplatter/Initialize(mapload, set_dir, new_color) + if(new_color) + color = new_color if(set_dir in GLOB.diagonals) icon_state = "[splatter_type][pick(1, 2, 6)]" else @@ -41,7 +43,7 @@ animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration) /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter - splatter_type = "xsplatter" + color = BLOOD_COLOR_XENO /obj/effect/temp_visual/dir_setting/speedbike_trail name = "speedbike trails" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ecae0d85..30fec05d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -543,6 +543,17 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) M.become_blind(EYE_DAMAGE) to_chat(M, "You go blind!") +/obj/item/clean_blood() + . = ..() + if(.) + if(blood_splatter_icon) + cut_overlay(blood_splatter_icon) + +/obj/item/clothing/gloves/clean_blood() + . = ..() + if(.) + transfer_blood = 0 + /obj/item/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FOUR) diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index b9cc55de..04243ae7 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -43,6 +43,15 @@ /obj/item/stock_parts/manipulator = 1, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/bloodbankgen + name = "Blood Bank Generator (Machine Board)" + build_path = /obj/machinery/bloodbankgen + req_components = list( + /obj/item/stock_parts/matter_bin = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/sheet/glass = 1) + /obj/item/circuitboard/machine/clonepod name = "Clone Pod (Machine Board)" build_path = /obj/machinery/clonepod diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 22d2a2f8..a27526ba 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -422,7 +422,7 @@ GENE SCANNER msg += "Subject is bleeding!\n" var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type - if(blood_id != "blood")//special blood substance + if(blood_id != ("blood" || "jellyblood"))//special blood substance var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] if(R) blood_type = R.name diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index ac1e2848..5d384a93 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -27,6 +27,7 @@ /obj/item/mop/proc/clean(turf/A) if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1)) SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + A.clean_blood() for(var/obj/effect/O in A) if(is_cleanable(O)) qdel(O) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index af6f02cd..caab2855 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -18,7 +18,6 @@ var/fix_bone= 0 /obj/item/stack/medical/attack(mob/living/M, mob/user) - if(M.stat == DEAD && !stop_bleeding) var/t_him = "it" if(M.gender == MALE) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 52064e05..db4fea47 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -390,9 +390,9 @@ . = ..() /obj/item/stack/proc/copy_evidences(obj/item/stack/from) - add_blood_DNA(from.return_blood_DNA()) - add_fingerprint_list(from.return_fingerprints()) - add_hiddenprint_list(from.return_hiddenprints()) + blood_DNA = from.blood_DNA + fingerprints = from.fingerprints + fingerprintshidden = from.fingerprintshidden fingerprintslast = from.fingerprintslast //TODO bloody overlay @@ -437,4 +437,4 @@ /datum/stack_recipe_list/New(title, recipes) src.title = title - src.recipes = recipes + src.recipes = recipes \ No newline at end of file diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 0e768094..8cdd4f08 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -34,6 +34,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/update_icon() ..() cut_overlays() + if(blood_DNA && blood_DNA.len) + add_blood_overlay() if(has_latches) var/icon/I = icon('icons/obj/storage.dmi', latches) add_overlay(I) @@ -312,4 +314,4 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) generate_rubber_toolbox_icon() icon = GLOB.rubber_toolbox_icons[icon_state] . = ..() - AddComponent(/datum/component/bouncy) \ No newline at end of file + AddComponent(/datum/component/bouncy) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 46c1506f..360e9943 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -346,7 +346,8 @@ icon_state = "dualsaber[item_color][wielded]" else icon_state = "dualsaber0" - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + + clean_blood() /obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user) if(user.has_dna()) @@ -881,4 +882,4 @@ var/client/C = user.client C.change_view(CONFIG_GET(string/default_view)) user.client.pixel_x = 0 - user.client.pixel_y = 0 + user.client.pixel_y = 0 \ No newline at end of file diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 186fb6da..92d9e550 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -319,6 +319,7 @@ /obj/machinery/shower/proc/wash_obj(obj/O) . = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + . = O.clean_blood() O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) if(isitem(O)) var/obj/item/I = O @@ -329,8 +330,9 @@ /obj/machinery/shower/proc/wash_turf() if(isturf(loc)) var/turf/tile = loc - SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) tile.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + tile.clean_blood() + SEND_SIGNAL(tile, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) for(var/obj/effect/E in tile) if(is_cleanable(E)) qdel(E) @@ -382,7 +384,8 @@ else if(H.w_uniform && wash_obj(H.w_uniform)) H.update_inv_w_uniform() if(washgloves) - SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + H.clean_blood() + SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) if(H.shoes && washshoes && wash_obj(H.shoes)) H.update_inv_shoes() if(H.wear_mask && washmask && wash_obj(H.wear_mask)) @@ -399,9 +402,11 @@ else if(M.wear_mask && wash_obj(M.wear_mask)) M.update_inv_wear_mask(0) - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + M.clean_blood() + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) else - SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + L.clean_blood() + SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) /obj/machinery/shower/proc/contamination_cleanse(atom/movable/thing) var/datum/component/radioactive/healthy_green_glow = thing.GetComponent(/datum/component/radioactive) @@ -499,7 +504,8 @@ H.regenerate_icons() user.drowsyness = max(user.drowsyness - rand(2,3), 0) //Washing your face wakes you up if you're falling asleep else - SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(user, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + user.clean_blood() /obj/structure/sink/attackby(obj/item/O, mob/living/user, params) if(busy) @@ -555,7 +561,8 @@ busy = FALSE return 1 busy = FALSE - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + O.clean_blood() O.acid_level = 0 create_reagents(5) reagents.add_reagent(dispensedreagent, 5) @@ -676,4 +683,4 @@ else playsound(loc, 'sound/weapons/tap.ogg', 50, 1) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 80, 1) + playsound(loc, 'sound/items/welder.ogg', 80, 1) \ No newline at end of file diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 1f03b222..1730a2ec 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -238,6 +238,7 @@ M.apply_water() SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + clean_blood() for(var/obj/effect/O in src) if(is_cleanable(O)) qdel(O) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index b05fcad6..a399c91e 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -372,6 +372,8 @@ break if(!GLOB.ratvar_awakens) + if(GLOB.clockwork_vitality <= 0) + break GLOB.clockwork_vitality -= vitality_used sleep(2) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index d4b05440..98f95a7c 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -333,14 +333,11 @@ cooldown = world.time + cooldown_time /obj/item/voodoo/proc/update_targets() - possible = list() + LAZYINITLIST(possible) if(!voodoo_link) return - var/list/prints = voodoo_link.return_fingerprints() - if(!length(prints)) - return FALSE for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(prints[md5(H.dna.uni_identity)]) + if(md5(H.dna.uni_identity) in voodoo_link.fingerprints) possible |= H /obj/item/voodoo/proc/GiveHint(mob/victim,force=0) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 9d47a6cf..13d08dd5 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1381,17 +1381,31 @@ /datum/supply_pack/medical/bloodpacks name = "Blood Pack Variety Crate" - desc = "Contains eight different blood packs for reintroducing blood to patients." + desc = "Contains ten different blood packs for reintroducing blood to patients." cost = 3000 - contains = list(/obj/item/reagent_containers/blood, - /obj/item/reagent_containers/blood, + contains = list(/obj/item/reagent_containers/blood/random, + /obj/item/reagent_containers/blood/random, /obj/item/reagent_containers/blood/APlus, /obj/item/reagent_containers/blood/AMinus, /obj/item/reagent_containers/blood/BPlus, /obj/item/reagent_containers/blood/BMinus, /obj/item/reagent_containers/blood/OPlus, /obj/item/reagent_containers/blood/OMinus, - /obj/item/reagent_containers/blood/lizard) + /obj/item/reagent_containers/blood/lizard, + /obj/item/reagent_containers/blood/jellyblood, + /obj/item/reagent_containers/blood/insect) + crate_name = "blood freezer" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/medical/bloodpackssynth + name = "Synthetics Blood Pack Crate" + desc = "Contains five synthetics blood packs for reintroducing blood to patients." + cost = 3000 + contains = list(/obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics, + /obj/item/reagent_containers/blood/synthetics) crate_name = "blood freezer" crate_type = /obj/structure/closet/crate/freezer diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 988a0510..00cb9b1e 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -14,11 +14,10 @@ /obj/item/clothing/gloves/ComponentInitialize() . = ..() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) + AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, /obj/item/clothing/gloves/clean_blood))) -/obj/item/clothing/gloves/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return +/obj/item/clothing/gloves/clean_blood(datum/source, strength) + . = ..() transfer_blood = 0 /obj/item/clothing/gloves/suicide_act(mob/living/carbon/user) @@ -30,8 +29,8 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands", color = blood_DNA_to_color()) /obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE) ..() @@ -41,4 +40,4 @@ // Called just before an attack_hand(), in mob/UnarmedAttack() /obj/item/clothing/gloves/proc/Touch(atom/A, proximity) - return 0 // return 1 to cancel attack_hand() \ No newline at end of file + return FALSE // return TRUE to cancel attack_hand() diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index c8116ea4..fc1e78b6 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -46,11 +46,11 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "helmetblood", color = blood_DNA_to_color()) /obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE) ..() if(ismob(loc)) var/mob/M = loc - M.update_inv_head() \ No newline at end of file + M.update_inv_head() diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 7f7cc60f..337bd4a5 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -59,8 +59,8 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "maskblood") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color()) /obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE) ..() diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index dd3ff919..94472f79 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -12,8 +12,8 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "maskblood") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color()) /obj/item/clothing/neck/tie name = "tie" diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 59fba6e5..b420ee67 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -11,17 +11,19 @@ permeability_coefficient = 0.5 slowdown = SHOES_SLOWDOWN var/blood_state = BLOOD_STATE_NOT_BLOODY - var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + var/list/bloody_shoes = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) var/offset = 0 var/equipped_before_drop = FALSE //CITADEL EDIT Enables digitigrade shoe styles var/adjusted = NORMAL_STYLE mutantrace_variation = MUTANTRACE_VARIATION + var/last_bloodtype = "" //used to track the last bloodtype to have graced these shoes; makes for better performing footprint shenanigans + var/last_blood_DNA = "" //same as last one /obj/item/clothing/shoes/ComponentInitialize() . = ..() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) + AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, /obj/item/clothing/shoes/clean_blood))) /obj/item/clothing/shoes/suicide_act(mob/living/carbon/user) if(rand(2)>1) @@ -42,22 +44,28 @@ playsound(user, 'sound/weapons/genhit2.ogg', 50, 1) return(BRUTELOSS) +/obj/item/clothing/shoes/transfer_blood_dna(list/blood_dna, diseases) + ..() + if(blood_dna.len) + last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works + last_blood_DNA = blood_dna[blood_dna.len] + /obj/item/clothing/shoes/worn_overlays(isinhands = FALSE) . = list() if(!isinhands) var/bloody = FALSE - IF_HAS_BLOOD_DNA(src) + if(blood_DNA) bloody = TRUE else - bloody = bloody_shoes[BLOOD_STATE_HUMAN] + bloody = bloody_shoes[BLOOD_STATE_BLOOD] if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") if(bloody) if(adjusted == NORMAL_STYLE) - . += mutable_appearance('icons/effects/blood.dmi', "shoeblood") + . += mutable_appearance('icons/effects/blood.dmi', "shoeblood", color = blood_DNA_to_color()) else - . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood") + . += mutable_appearance('modular_citadel/icons/mob/digishoes.dmi', "shoeblood", color = blood_DNA_to_color()) /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() @@ -93,14 +101,13 @@ var/mob/M = loc M.update_inv_shoes() -/obj/item/clothing/shoes/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return - bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) +/obj/item/clothing/shoes/clean_blood(datum/source, strength) + . = ..() + bloody_shoes = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) blood_state = BLOOD_STATE_NOT_BLOODY if(ismob(loc)) var/mob/M = loc M.update_inv_shoes() /obj/item/proc/negates_gravity() - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index bd837c14..6e469faa 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -5,6 +5,7 @@ allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) slot_flags = ITEM_SLOT_OCLOTHING + body_parts_covered = CHEST var/blood_overlay_type = "suit" var/togglename = null var/suittoggled = FALSE @@ -30,12 +31,12 @@ adjusted = NORMAL_STYLE if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) - if(H.dna.features["taur"] in list("Naga", "Tentacle")) + if(H.dna.features["taur"] in GLOB.noodle_taurs) taurmode = SNEK_TAURIC if(tauric == TRUE) center = TRUE dimension_x = 64 - else if(H.dna.features["taur"] in list("Fox","Wolf","Otie","Drake","Lab","Shepherd","Husky","Eevee","Panther","Horse","Cow","Tiger","Deer")) + else if(H.dna.features["taur"] in GLOB.paw_taurs) taurmode = PAW_TAURIC if(tauric == TRUE) center = TRUE @@ -53,11 +54,11 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") - IF_HAS_BLOOD_DNA(src) - if(taurmode >= SNEK_TAURIC) - . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood") + if(blood_DNA) + if(tauric) + . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color()) else - . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") + . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood", color = blood_DNA_to_color()) var/mob/living/carbon/human/M = loc if(ishuman(M) && M.w_uniform) var/obj/item/clothing/under/U = M.w_uniform diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 422be6e3..2889242c 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -22,8 +22,8 @@ if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") - IF_HAS_BLOOD_DNA(src) - . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") + if(blood_DNA) + . += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color()) if(accessory_overlay) . += accessory_overlay diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 17396093..0f3b6532 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -1,111 +1,107 @@ //CONTAINS: Suit fibers and Detective's Scanning Computer -/atom/proc/return_fingerprints() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.fingerprints +/atom/proc/add_fibers(mob/living/carbon/human/M) + if(M.gloves && istype(M.gloves, /obj/item/clothing/)) + var/obj/item/clothing/gloves/G = M.gloves + if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects + if(add_blood_DNA(G.blood_DNA)) //only reduces the bloodiness of our gloves if the item wasn't already bloody + G.transfer_blood-- + else if(M.bloody_hands > 1) + if(add_blood_DNA(M.blood_DNA, M.diseases)) + M.bloody_hands-- + if(!suit_fibers) + suit_fibers = list() + var/fibertext + var/item_multiplier = isitem(src)?1.2:1 + if(M.wear_suit) + fibertext = "Material from \a [M.wear_suit]." + if(prob(10*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += fibertext + if(!(M.wear_suit.body_parts_covered & CHEST)) + if(M.w_uniform) + fibertext = "Fibers from \a [M.w_uniform]." + if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed. + suit_fibers += fibertext + if(!(M.wear_suit.body_parts_covered & HANDS)) + if(M.gloves) + fibertext = "Material from a pair of [M.gloves.name]." + if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += fibertext + else if(M.w_uniform) + fibertext = "Fibers from \a [M.w_uniform]." + if(prob(15*item_multiplier) && !(fibertext in suit_fibers)) + // "Added fibertext: [fibertext]" + suit_fibers += fibertext + if(M.gloves) + fibertext = "Material from a pair of [M.gloves.name]." + if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += "Material from a pair of [M.gloves.name]." + else if(M.gloves) + fibertext = "Material from a pair of [M.gloves.name]." + if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) + suit_fibers += "Material from a pair of [M.gloves.name]." -/atom/proc/return_hiddenprints() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.hiddenprints -/atom/proc/return_blood_DNA() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.blood_DNA +/atom/proc/add_hiddenprint(mob/living/M) + if(!M || !M.key) + return -/atom/proc/blood_DNA_length() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = length(D.blood_DNA) + if(!fingerprintshidden) //Add the list if it does not exist + fingerprintshidden = list() -/atom/proc/return_fibers() - GET_COMPONENT(D, /datum/component/forensics) - if(D) - . = D.fibers + var/hasgloves = "" + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.gloves) + hasgloves = "(gloves)" + + var/current_time = TIME_STAMP("hh:mm:ss", FALSE) + if(!fingerprintshidden[M.key]) + fingerprintshidden[M.key] = "First: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" + else + var/laststamppos = findtext(fingerprintshidden[M.key], " Last: ") + if(laststamppos) + fingerprintshidden[M.key] = copytext(fingerprintshidden[M.key], 1, laststamppos) + fingerprintshidden[M.key] += " Last: [M.real_name]\[[current_time]\][hasgloves]. Ckey: [M.ckey]" + + fingerprintslast = M.ckey -/atom/proc/add_fingerprint_list(list/fingerprints) //ASSOC LIST FINGERPRINT = FINGERPRINT - if(length(fingerprints)) - . = AddComponent(/datum/component/forensics, fingerprints) //Set ignoregloves to add prints irrespective of the mob having gloves on. /atom/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE) - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_fingerprint(M, ignoregloves) + if(!M || !M.key) + return -/atom/proc/add_fiber_list(list/fibertext) //ASSOC LIST FIBERTEXT = FIBERTEXT - if(length(fibertext)) - . = AddComponent(/datum/component/forensics, null, null, null, fibertext) + add_hiddenprint(M) -/atom/proc/add_fibers(mob/living/carbon/human/M) - var/old = 0 - if(M.gloves && istype(M.gloves, /obj/item/clothing)) - var/obj/item/clothing/gloves/G = M.gloves - old = length(G.return_blood_DNA()) - if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects - if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody - G.transfer_blood-- - else if(M.bloody_hands > 1) - old = length(M.return_blood_DNA()) - if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old) - M.bloody_hands-- - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_fibers(M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M -/atom/proc/add_hiddenprint_list(list/hiddenprints) //NOTE: THIS IS FOR ADMINISTRATION FINGERPRINTS, YOU MUST CUSTOM SET THIS TO INCLUDE CKEY/REAL NAMES! CHECK FORENSICS.DM - if(length(hiddenprints)) - . = AddComponent(/datum/component/forensics, null, hiddenprints) + add_fibers(H) -/atom/proc/add_hiddenprint(mob/living/M) - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_hiddenprint(M) + if(H.gloves) //Check if the gloves (if any) hide fingerprints + var/obj/item/clothing/gloves/G = H.gloves + if(G.transfer_prints) + ignoregloves = TRUE -/atom/proc/add_blood_DNA(list/dna) //ASSOC LIST DNA = BLOODTYPE - return FALSE + if(!ignoregloves) + H.gloves.add_fingerprint(H, TRUE) //ignoregloves = TRUE to avoid infinite loop. + return -/obj/add_blood_DNA(list/dna) - . = ..() - if(length(dna)) - . = AddComponent(/datum/component/forensics, null, null, dna) - -/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - . = ..() - transfer_blood = rand(2, 4) - -/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src - if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) - B.add_blood_DNA(blood_dna) //give blood info to the blood decal. - return TRUE //we bloodied the floor - -/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - if(wear_suit) - wear_suit.add_blood_DNA(blood_dna) - update_inv_wear_suit() - else if(w_uniform) - w_uniform.add_blood_DNA(blood_dna) - update_inv_w_uniform() - if(gloves) - var/obj/item/clothing/gloves/G = gloves - G.add_blood_DNA(blood_dna) - else if(length(blood_dna)) - AddComponent(/datum/component/forensics, null, null, blood_dna) - bloody_hands = rand(2, 4) - if(head) - head.add_blood_DNA(blood_dna) - update_inv_head() - else if(wear_mask) - wear_mask.add_blood_DNA(blood_dna) - update_inv_wear_mask() - if(wear_neck) - wear_neck.add_blood_DNA(blood_dna) - update_inv_neck() - update_inv_gloves() //handles bloody hands overlays and updating - return TRUE + LAZYINITLIST(fingerprints) //Add the list if it does not exist + var/full_print = md5(H.dna.uni_identity) + fingerprints[full_print] = full_print /atom/proc/transfer_fingerprints_to(atom/A) - A.add_fingerprint_list(return_fingerprints()) - A.add_hiddenprint_list(return_hiddenprints()) + // Make sure everything are lists. + LAZYINITLIST(A.fingerprints) + LAZYINITLIST(A.fingerprintshidden) + LAZYINITLIST(fingerprints) + LAZYINITLIST(fingerprintshidden) + + // Transfer + if(fingerprints) + A.fingerprints |= fingerprints.Copy() //detective + if(fingerprintshidden) + A.fingerprintshidden |= fingerprintshidden.Copy() //admin A.fingerprintslast = fingerprintslast diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 1a4a2d87..60e4b7af 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -16,7 +16,7 @@ /obj/item/evidencebag/attackby(obj/item/I, mob/user, params) if(evidencebagEquip(I, user)) - return 1 + return TRUE /obj/item/evidencebag/handle_atom_del(atom/A) cut_overlays() @@ -25,12 +25,12 @@ desc = initial(desc) /obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user) - if(!istype(I) || I.anchored == 1) + if(!istype(I) || I.anchored == TRUE) return if(istype(I, /obj/item/evidencebag)) to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd.") - return 1 //now this is podracing + return TRUE //now this is podracing if(I.w_class > WEIGHT_CLASS_NORMAL) to_chat(user, "[I] won't fit in [src].") @@ -62,7 +62,7 @@ desc = "An evidence bag containing [I]. [I.desc]" I.forceMove(src) w_class = I.w_class - return 1 + return TRUE /obj/item/evidencebag/attack_self(mob/user) if(contents.len) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index f9cd1256..bff010a3 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -14,7 +14,7 @@ flags_1 = CONDUCT_1 item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT - var/scanning = 0 + var/scanning = FALSE var/list/log = list() var/range = 8 var/view_check = TRUE @@ -30,7 +30,7 @@ /obj/item/detective_scanner/attack_self(mob/user) if(log.len && !scanning) - scanning = 1 + scanning = TRUE to_chat(user, "Printing report, please wait...") addtimer(CALLBACK(src, .proc/PrintReport), 100) else @@ -56,7 +56,7 @@ // Clear the logs log = list() - scanning = 0 + scanning = FALSE /obj/item/detective_scanner/afterattack(atom/A, mob/user, params) . = ..() @@ -70,7 +70,7 @@ if((get_dist(A, user) > range) || (!(A in view(range, user)) && view_check) || (loc != user)) return - scanning = 1 + scanning = TRUE user.visible_message("\The [user] points the [src.name] at \the [A] and performs a forensic scan.") to_chat(user, "You scan \the [A]. The scanner is now analysing the results...") @@ -80,14 +80,20 @@ //Make our lists var/list/fingerprints = list() - var/list/blood = A.return_blood_DNA() - var/list/fibers = A.return_fibers() + var/list/blood = list() + var/list/fibers = list() var/list/reagents = list() var/target_name = A.name // Start gathering + if(A.blood_DNA && A.blood_DNA.len) + blood = A.blood_DNA.Copy() + + if(A.suit_fibers && A.suit_fibers.len) + fibers = A.suit_fibers.Copy() + if(ishuman(A)) var/mob/living/carbon/human/H = A @@ -96,7 +102,8 @@ else if(!ismob(A)) - fingerprints = A.return_fingerprints() + if(A.fingerprints && A.fingerprints.len) + fingerprints = A.fingerprints.Copy() // Only get reagents from non-mobs. if(A.reagents && A.reagents.reagent_list.len) @@ -115,40 +122,40 @@ // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. - var/found_something = 0 + var/found_something = FALSE add_log("[STATION_TIME_TIMESTAMP("hh:mm:ss")][get_timestamp()] - [target_name]", 0) // Fingerprints if(length(fingerprints)) - sleep(30) + sleep(3 SECONDS) add_log("Prints:") for(var/finger in fingerprints) add_log("[finger]") - found_something = 1 + found_something = TRUE // Blood if (length(blood)) - sleep(30) + sleep(3 SECONDS) add_log("Blood:") - found_something = 1 + found_something = TRUE for(var/B in blood) add_log("Type: [blood[B]] DNA: [B]") //Fibers if(length(fibers)) - sleep(30) + sleep(3 SECONDS) add_log("Fibers:") for(var/fiber in fibers) add_log("[fiber]") - found_something = 1 + found_something = TRUE //Reagents if(length(reagents)) - sleep(30) + sleep(3 SECONDS) add_log("Reagents:") for(var/R in reagents) add_log("Reagent: [R] Volume: [reagents[R]]") - found_something = 1 + found_something = TRUE // Get a new user var/mob/holder = null @@ -164,10 +171,10 @@ to_chat(holder, "You finish scanning \the [target_name].") add_log("---------------------------------------------------------", 0) - scanning = 0 + scanning = FALSE return -/obj/item/detective_scanner/proc/add_log(msg, broadcast = 1) +/obj/item/detective_scanner/proc/add_log(msg, broadcast = TRUE) if(scanning) if(broadcast && ismob(loc)) var/mob/M = loc diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ca1a961a..757aadae 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -2,6 +2,9 @@ BLOOD SYSTEM ****************************************************/ +#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations. + + /mob/living/carbon/human/proc/suppress_bloodloss(amount) if(bleedsuppress) return @@ -30,6 +33,9 @@ bleed_rate = 0 return + if(bleed_rate <= 0) + bleed_rate = 0 + if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space @@ -80,6 +86,9 @@ var/obj/item/bodypart/BP = X var/brutedamage = BP.brute_dam + if(BP.status == BODYPART_ROBOTIC) //for the moment, synth limbs won't bleed, but soon, my pretty. + continue + //We want an accurate reading of .len listclearnulls(BP.embedded_objects) temp_bleed += 0.5*BP.embedded_objects.len @@ -87,7 +96,7 @@ if(brutedamage >= 20) temp_bleed += (brutedamage * 0.013) - bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases + bleed_rate = max(bleed_rate - 0.50, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH))) bleed(bleed_rate) @@ -105,9 +114,11 @@ /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod if(!(NOBLOOD in dna.species.species_traits)) - ..() - - + .=..() + if(dna.species.exotic_blood && .) // Do we have exotic blood, and have we left any on the ground? + var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()] + if(istype(R) && isturf(loc)) + R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER) /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) @@ -123,16 +134,16 @@ //Gets blood from mob to a container or other mob, preserving all data in it. /mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) if(!blood_volume || !AM.reagents) - return 0 + return FALSE if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced) - return 0 + return FALSE if(blood_volume < amount) amount = blood_volume var/blood_id = get_blood_id() if(!blood_id) - return 0 + return FALSE blood_volume -= amount @@ -141,29 +152,27 @@ if(iscarbon(AM)) var/mob/living/carbon/C = AM if(blood_id == C.get_blood_id())//both mobs have the same blood substance - if(blood_id == "blood") //normal blood + if(blood_id == "blood" || blood_id == "jellyblood") //normal blood if(blood_data["viruses"]) for(var/thing in blood_data["viruses"]) var/datum/disease/D = thing if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) - if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent("toxin", amount * 0.5) - return 1 + //This used to inject oof ouch results, but since we add the reagent, and the reagent causes oof ouch on mob life... why double dip? C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM) - return 1 + return TRUE AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature) - return 1 + return TRUE /mob/living/proc/get_blood_data(blood_id) return /mob/living/carbon/get_blood_data(blood_id) - if(blood_id == "blood") //actual blood reagent + if(blood_id == "blood" || blood_id == "jellyblood") //actual blood reagent var/blood_data = list() //set the blood data blood_data["donor"] = src @@ -174,6 +183,7 @@ blood_data["viruses"] += D.Copy() blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) + blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type) if(disease_resistances && disease_resistances.len) blood_data["resistances"] = disease_resistances.Copy() var/list/temp_chem = list() @@ -206,21 +216,6 @@ if(istype(ling)) blood_data["changeling_loudness"] = ling.loudfactor return blood_data - if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff. - var/blood_data = list() - if(mind) - blood_data["mind"] = mind - else if(last_mind) - blood_data["mind"] = last_mind - if(ckey) - blood_data["ckey"] = ckey - else if(last_mind) - blood_data["ckey"] = ckey(last_mind.key) - blood_data["gender"] = gender - blood_data["real_name"] = real_name - return blood_data - - //get the id of the substance this mob use as blood. /mob/proc/get_blood_id() @@ -234,12 +229,15 @@ if(!(HAS_TRAIT(src, TRAIT_NOCLONE))) return "blood" -/mob/living/carbon/human/get_blood_id() - if(dna.species.exotic_blood) +/mob/living/carbon/get_blood_id() + if(isjellyperson(src)) + return "jellyblood" + if(dna?.species?.exotic_blood) return dna.species.exotic_blood else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE))) return - return "blood" + else + return "blood" // This is has more potential uses, and is probably faster than the old proc. /proc/get_safe_blood(bloodtype) @@ -248,16 +246,21 @@ return var/static/list/bloodtypes_safe = list( - "A-" = list("A-", "O-"), - "A+" = list("A-", "A+", "O-", "O+"), - "B-" = list("B-", "O-"), - "B+" = list("B-", "B+", "O-", "O+"), - "AB-" = list("A-", "B-", "O-", "AB-"), - "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"), - "O-" = list("O-"), - "O+" = list("O-", "O+"), - "L" = list("L"), - "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U") + "A-" = list("A-", "O-", "SY"), + "A+" = list("A-", "A+", "O-", "O+", "SY"), + "B-" = list("B-", "O-", "SY"), + "B+" = list("B-", "B+", "O-", "O+", "SY"), + "AB-" = list("A-", "B-", "O-", "AB-", "SY"), + "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "SY"), + "O-" = list("O-","SY"), + "O+" = list("O-", "O+","SY"), + "L" = list("L","SY"), + "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U","SY"), + "HF" = list("HF", "SY"), + "X*" = list("X*", "SY"), + "SY" = list("SY"), + "GEL" = list("GEL","SY"), + "BUG" = list("BUG", "SY") ) var/safe = bloodtypes_safe[bloodtype] @@ -266,7 +269,7 @@ //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) - if(get_blood_id() != "blood") + if(get_blood_id() == null) return if(!T) T = get_turf(src) @@ -280,24 +283,27 @@ drop.drips++ drop.add_overlay(pick(drop.random_icon_states)) drop.transfer_mob_blood_dna(src) + drop.update_icon() return else - temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter + temp_blood_DNA = list() + temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter qdel(drop)//the drip is replaced by a bigger splatter else drop = new(T, get_static_viruses()) drop.transfer_mob_blood_dna(src) + drop.update_icon() return // Find a blood decal or create a new one. - var/obj/effect/decal/cleanable/blood/B = locate() in T + var/obj/effect/decal/cleanable/blood/splats/B = locate() in T if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) - if (B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit + B = new /obj/effect/decal/cleanable/blood/splats(T, get_static_viruses()) + if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit B.bloodiness += BLOOD_AMOUNT_PER_DECAL B.transfer_mob_blood_dna(src) //give blood info to the blood decal. if(temp_blood_DNA) - B.add_blood_DNA(temp_blood_DNA) + B.blood_DNA |= temp_blood_DNA /mob/living/carbon/human/add_splatter_floor(turf/T, small_drip) if(!(NOBLOOD in dna.species.species_traits)) @@ -306,10 +312,10 @@ /mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip) if(!T) T = get_turf(src) - var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents if(!B) B = new(T) - B.add_blood_DNA(list("UNKNOWN DNA" = "X*")) + B.blood_DNA["UNKNOWN DNA"] = "X*" /mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip) if(!T) @@ -318,6 +324,44 @@ if(!B) B = new(T) +/mob/living/proc/add_splash_floor(turf/T) + if(get_blood_id() == null) + return + if(!T) + T = get_turf(src) + + var/list/temp_blood_DNA + + // Find a blood decal or create a new one. + var/obj/effect/decal/cleanable/blood/B = locate() in T + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) + if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit + B.bloodiness += BLOOD_AMOUNT_PER_DECAL + B.transfer_mob_blood_dna(src) //give blood info to the blood decal. + src.transfer_blood_to(B, 10) //very heavy bleeding, should logically leave larger pools + if(temp_blood_DNA) + B.blood_DNA |= temp_blood_DNA + +/mob/living/carbon/human/add_splash_floor(turf/T) + if(!(NOBLOOD in dna.species.species_traits)) + ..() + +/mob/living/carbon/alien/add_splash_floor(turf/T) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents + if(!B) + B = new(T) + B.blood_DNA["UNKNOWN DNA"] = "X*" + +/mob/living/silicon/robot/add_splash_floor(turf/T) + if(!T) + T = get_turf(src) + var/obj/effect/decal/cleanable/oil/B = locate() in T.contents + if(!B) + B = new(T) + //This is a terrible way of handling it. /mob/living/proc/ResetBloodVol() if(ishuman(src)) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index cc11c0e8..19500653 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -147,9 +147,9 @@ /mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) //Makes the mob have the color of the blood pool it came out of - var/newcolor = rgb(149, 10, 10) - if(istype(B, /obj/effect/decal/cleanable/xenoblood)) - newcolor = rgb(43, 186, 0) + var/newcolor = BLOOD_COLOR_HUMAN + if(istype(B, /obj/effect/decal/cleanable/blood/xeno)) + newcolor = BLOOD_COLOR_XENO add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY) // but only for a few seconds spawn(30) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 97b29ca4..1b2944c1 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -10,7 +10,10 @@ /mob/living/brain/Initialize() . = ..() create_dna(src) - stored_dna.initialize_dna(random_blood_type()) + if(stored_dna.blood_type) + stored_dna.initialize_dna(stored_dna.blood_type) + else + stored_dna.initialize_dna(random_blood_type()) if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned) var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it. OB.brainmob = src @@ -21,6 +24,8 @@ if(!stored_dna.species) var/rando_race = pick(GLOB.roundstart_races) stored_dna.species = new rando_race() + if(stored_dna.species.exotic_bloodtype) + stored_dna.blood_type = stored_dna.species.exotic_bloodtype /mob/living/brain/Destroy() if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 41732d7f..f7fdd2d3 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -20,7 +20,7 @@ var/heat_protection = 0.5 var/leaping = 0 - gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs + gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno unique_name = 1 var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?") diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index fbae1e89..b48f116f 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -2,7 +2,7 @@ if(with_bodyparts) new /obj/effect/gibspawner/xeno(drop_location()) else - new /obj/effect/gibspawner/xenobodypartless(drop_location()) + new /obj/effect/gibspawner/xeno/bodypartless(drop_location()) /mob/living/carbon/alien/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index f9ed1f9b..febc8d77 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -10,7 +10,7 @@ if(with_bodyparts) new /obj/effect/gibspawner/larva(drop_location()) else - new /obj/effect/gibspawner/larvabodypartless(drop_location()) + new /obj/effect/gibspawner/larva/bodypartless(drop_location()) /mob/living/carbon/alien/larva/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index df1be454..7b696279 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -89,6 +89,8 @@ owner.adjustFireLoss(-heal_amt) owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) + if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL)) + owner.blood_volume += 5 else owner.adjustPlasma(plasma_rate * 0.1) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index f5b00200..16a6b4ed 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -49,6 +49,7 @@ //Gets filled up in create_bodyparts() var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems) + var/list/leg_bodyparts = list() var/icon_render_key = "" var/static/list/limb_icon_cache = list() diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index ada57d67..a78f4574 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -85,7 +85,7 @@ if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(amount > 0) - blood_volume -= 5*amount + blood_volume -= 3*amount // x5 is too much, x3 should be still penalizing enough. else blood_volume -= amount return ..() diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index db54b035..579f9b6c 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -5,10 +5,34 @@ new /obj/effect/temp_visual/dust_animation(loc, "dust-h") /mob/living/carbon/human/spawn_gibs(with_bodyparts) - if(with_bodyparts) - new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses()) + if(isjellyperson(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/slime/bodypartless(drop_location(), dna, get_static_viruses()) + + if(isipcperson(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/ipc(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/ipc/bodypartless(drop_location(), dna, get_static_viruses()) + + if(isxenoperson(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/xeno/xenoperson(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/xeno/xenoperson/bodypartless(drop_location(), dna, get_static_viruses()) + + if(islizard(src)) + if(with_bodyparts) + new /obj/effect/gibspawner/lizard(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/lizard/bodypartless(drop_location(), dna, get_static_viruses()) else - new /obj/effect/gibspawner/humanbodypartless(drop_location(), dna, get_static_viruses()) + if(with_bodyparts) + new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses()) + else + new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses()) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f155ff62..624dc971 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -45,7 +45,7 @@ if(wear_suit) . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." //suit/armor storage - if(s_store) + if(s_store && !(SLOT_S_STORE in obscured)) . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]." //back if(back) @@ -56,11 +56,10 @@ if(!(I.item_flags & ABSTRACT)) . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]." - GET_COMPONENT(FR, /datum/component/forensics) //gloves if(gloves && !(SLOT_GLOVES in obscured)) . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands." - else if(FR && length(FR.blood_DNA)) + else if(length(blood_DNA)) var/hand_number = get_num_arms(FALSE) if(hand_number) . += "[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!" @@ -83,7 +82,7 @@ if(wear_mask && !(SLOT_WEAR_MASK in obscured)) . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face." - if (wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(SLOT_NECK in obscured)) . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." //eyes @@ -147,6 +146,8 @@ var/temp = getBruteLoss() //no need to calculate each of these twice + msg += "" //Everything below gets this span + var/list/msg = list() var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 263e86f0..89765081 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -33,7 +33,7 @@ if(CONFIG_GET(flag/disable_stambuffer)) togglesprint() - AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood))) + AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, /mob/living/carbon/human/clean_blood))) /mob/living/carbon/human/ComponentInitialize() @@ -699,16 +699,17 @@ if(..()) dropItemToGround(I) -/mob/living/carbon/human/proc/clean_blood(datum/source, strength) - if(strength < CLEAN_STRENGTH_BLOOD) - return - if(gloves) - if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) - update_inv_gloves() +/mob/living/carbon/human/clean_blood() + var/mob/living/carbon/human/H = src + if(H.gloves) + if(H.gloves.clean_blood()) + H.update_inv_gloves() else - if(bloody_hands) - bloody_hands = 0 - update_inv_gloves() + ..() // Clear the Blood_DNA list + if(H.bloody_hands) + H.bloody_hands = 0 + H.update_inv_gloves() + update_icons() //apply the now updated overlays to the mob /mob/living/carbon/human/wash_cream() if(creamed) //clean both to prevent a rare bug @@ -1110,6 +1111,20 @@ /mob/living/carbon/human/species/zombie/krokodil_addict race = /datum/species/krokodil_addict +/mob/living/carbon/human/species/mammal + race = /datum/species/mammal + +/mob/living/carbon/human/species/insect + race = /datum/species/insect + +/mob/living/carbon/human/species/xeno + race = /datum/species/xeno + +/mob/living/carbon/human/species/ipc + race = /datum/species/ipc + +/mob/living/carbon/human/species/roundstartslime + race = /datum/species/jelly/roundstartslime //define holder_type on nerds we wanna commit scoop to /* /mob/living/carbon/human var/holder_type = /obj/item/clothing/head/mob_holder/micro diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d0a16ea0..ea25104c 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -49,6 +49,9 @@ var/bleed_rate = 0 //how much are we bleeding var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + var/name_override //For temporary visible name changes var/genital_override = FALSE //Force genitals on things incase of chems diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 5dc4400f..d489c2e3 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -127,3 +127,10 @@ return FALSE return . + +/* +/mob/living/carbon/human/transfer_blood_dna(list/blood_dna) + ..() + if(blood_dna.len) + last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works + last_blood_DNA = blood_dna[blood_dna.len]*/ diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 4dc63308..c6fb6870 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -56,18 +56,17 @@ //Bloody footprints var/turf/T = get_turf(src) if(S.bloody_shoes && S.bloody_shoes[S.blood_state]) - for(var/obj/effect/decal/cleanable/blood/footprints/oldFP in T) - if (oldFP.blood_state == S.blood_state) - return - //No oldFP or they're all a different kind of blood - S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP) - if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD) - var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) - FP.blood_state = S.blood_state - FP.entered_dirs |= dir - FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD - FP.add_blood_DNA(S.return_blood_DNA()) - FP.update_icon() + var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T + if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == bloodtype_to_color(S.last_bloodtype))) + return + S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state]-BLOOD_LOSS_PER_STEP) + var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T) + FP.blood_state = S.blood_state + FP.entered_dirs |= dir + FP.bloodiness = S.bloody_shoes[S.blood_state] + if(S.last_bloodtype) + FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype) + FP.update_icon() update_inv_shoes() //End bloody footprints S.step_action() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index cc2d088d..ac53fa31 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -314,7 +314,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) if(C.dna.species.exotic_bloodtype) - C.dna.blood_type = random_blood_type() + if(!new_species.exotic_bloodtype) + C.dna.blood_type = random_blood_type() + else + C.dna.blood_type = new_species.exotic_bloodtype if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) for(var/X in inherent_traits) @@ -968,6 +971,16 @@ GLOBAL_LIST_EMPTY(roundstart_races) return "TAUR" //END EDIT +/* TODO: Snowflake trail marks +// Impliments different trails for species depending on if they're wearing shoes. +/datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) + if(H.lying) + return /obj/effect/decal/cleanable/blood/footprints/tracks/body + if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))) + var/obj/item/clothing/shoes/shoes = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) ? H.wear_suit : H.shoes // suits take priority over shoes + return shoes.move_trail + else + return move_trail */ /datum/species/proc/spec_life(mob/living/carbon/human/H) if(HAS_TRAIT(H, TRAIT_NOBREATH)) diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 3ef8b0f8..40cbcbab 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -10,6 +10,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly disliked_food = null liked_food = GROSS + exotic_bloodtype = "BUG" /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "pestkiller") diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index fc4b9a4e..5d50394b 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -4,13 +4,15 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR) mutantlungs = /obj/item/organ/lungs/slime + mutant_heart = /obj/item/organ/heart/slime mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur") //CIT CHANGE default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None") //CIT CHANGE inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime - exotic_blood = "slimejelly" + exotic_blood = "jellyblood" + exotic_bloodtype = "GEL" damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs var/datum/action/innate/slime_change/slime_change //CIT CHANGE @@ -121,7 +123,7 @@ name = "Slimeperson" id = "slime" default_color = "00FFFF" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) say_mod = "says" hair_color = "mutcolor" hair_alpha = 150 diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 02825e35..1929d87f 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -14,6 +14,7 @@ liked_food = VEGETABLES | DAIRY| CLOTH disliked_food = FRUIT | GROSS toxic_food = MEAT | RAW + exotic_bloodtype = "BUG" /datum/species/moth/on_species_gain(mob/living/carbon/C) . = ..() @@ -58,4 +59,4 @@ if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off") var/datum/gas_mixture/current = H.loc.return_air() if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e278e7dc..1a75d508 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -186,7 +186,7 @@ There are several things that need to be remembered: inv.update_icon() if(!gloves && bloody_hands) - var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color()) if(get_num_arms() < 2) if(has_left_hand()) bloody_overlay.icon_state = "bloodyhands_left" @@ -276,6 +276,32 @@ There are several things that need to be remembered: if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] inv.update_icon() +/* + if(!shoes && bloody_feet) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(dna.features["taur"] != "None") + if(dna.features["taur"] in GLOB.noodle_taurs) + bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "snekbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "snekbloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "snekbloodyfeet_right" + else if(dna.features["taur"] in GLOB.paw_taurs) + bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "pawbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "pawbloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "pawbloodyfeet_right" + else + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "bloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "bloodyfeet_right" + + overlays_standing[GLOVES_LAYER] = bloody_overlay*/ if(shoes) var/obj/item/clothing/shoes/S = shoes diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 5c67b69a..9c691e1b 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -1,353 +1,733 @@ -//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. -/mob/living/carbon/update_transform() - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - var/final_pixel_y = pixel_y - var/final_dir = dir - var/changed = 0 - - if(lying != lying_prev && rotate_on_lying) - changed++ - ntransform.TurnTo(lying_prev,lying) - if(lying == 0) //Lying to standing - final_pixel_y = get_standard_pixel_y_offset() - if(size_multiplier >= 1) //if its bigger than normal - ntransform.Translate(0,16 * (size_multiplier-1)) - else - if(lying_prev == 90) - ntransform.Translate(16 * (size_multiplier-1),16 * (size_multiplier-1)) - - if(lying_prev == 270) - ntransform.Translate(-16 * (size_multiplier-1),16 * (size_multiplier-1)) - - else //if(lying != 0) - if(lying_prev == 0) //Standing to lying - pixel_y = get_standard_pixel_y_offset() - final_pixel_y = get_standard_pixel_y_offset(lying) - if(lying == 90) //Check the angle of the sprite to offset it accordingly. - ntransform.Translate(-16 * (size_multiplier-1),0) - if(size_multiplier < 1) //if its smaller than normal - ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards - - if(lying == 270) //check the angle of the sprite to offset it accordingly - ntransform.Translate(16 * (size_multiplier-1),0) - if(size_multiplier < 1) //if its smaller than normal - ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards - - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - - if(resize != RESIZE_DEFAULT_SIZE) - changed++ - ntransform.Scale(resize) - resize = RESIZE_DEFAULT_SIZE - - //Apply size multiplier, thank NeverExisted for this - if(size_multiplier != previous_size) - changed++ - //now we offset the sprite - //Scaling affects offset. There's probably a smarter and easier way to do this, but this way it works for sure (?) - //Just to be clear. All this bullshit is needed because someone wanted to store the old transform matrix instead of using a new one each iteration - //Winfre is currently doing a great job at coating my nuts in slobber while i code this - if(!lying) //when standing. People of all sizes are affected equally - ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite - ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly. - ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset - else //when lying. Macros dont get an offset, Micros do. We must also check the cases when a micro becomes a macro and viceversa - if(previous_size <= 1 && size_multiplier <= 1) //micro stays a micro. We modify the side-offset - ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite - ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly - ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset - - if(previous_size <= 1 && size_multiplier > 1) //micro becomes a macro. We remove the side-offset - ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite - ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly - - if(previous_size > 1 && size_multiplier <= 1) //macro becomes a micro. We add an offset - ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly. - ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset - - if(previous_size > 1 && size_multiplier > 1) //macro stays a macro. We just scale the sprite with no offset changes - ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly - - - if(changed) - animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). - -/mob/living/carbon - var/list/overlays_standing[TOTAL_LAYERS] - -/mob/living/carbon/proc/apply_overlay(cache_index) - if((. = overlays_standing[cache_index])) - add_overlay(.) - -/mob/living/carbon/proc/remove_overlay(cache_index) - var/I = overlays_standing[cache_index] - if(I) - cut_overlay(I) - overlays_standing[cache_index] = null - -/mob/living/carbon/regenerate_icons() - if(notransform) - return 1 - update_inv_hands() - update_inv_handcuffed() - update_inv_legcuffed() - update_fire() - - -/mob/living/carbon/update_inv_hands() - remove_overlay(HANDS_LAYER) - if (handcuffed) - drop_all_held_items() - return - - var/list/hands = list() - for(var/obj/item/I in held_items) - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - I.screen_loc = ui_hand_position(get_held_index_of_item(I)) - client.screen += I - if(observers && observers.len) - for(var/M in observers) - var/mob/dead/observe = M - if(observe.client && observe.client.eye == src) - observe.client.screen += I - else - observers -= observe - if(!observers.len) - observers = null - break - - var/t_state = I.item_state - if(!t_state) - t_state = I.icon_state - - var/icon_file = I.lefthand_file - if(get_held_index_of_item(I) % 2 == 0) - icon_file = I.righthand_file - - hands += I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) - - overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) - - -/mob/living/carbon/update_fire(var/fire_icon = "Generic_mob_burning") - remove_overlay(FIRE_LAYER) - if(on_fire) - var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) - new_fire_overlay.appearance_flags = RESET_COLOR - overlays_standing[FIRE_LAYER] = new_fire_overlay - - apply_overlay(FIRE_LAYER) - - - -/mob/living/carbon/update_damage_overlays() - remove_overlay(DAMAGE_LAYER) - - var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER) - overlays_standing[DAMAGE_LAYER] = damage_overlay - - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - if(BP.dmg_overlay_type) - if(BP.brutestate) - damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays - if(BP.burnstate) - damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]") - - apply_overlay(DAMAGE_LAYER) - - -/mob/living/carbon/update_inv_wear_mask() - remove_overlay(FACEMASK_LAYER) - - if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated - return - - if(client && hud_used && hud_used.inv_slots[SLOT_WEAR_MASK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] - inv.update_icon() - - if(wear_mask) - if(!(head && (head.flags_inv & HIDEMASK))) - overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/mask.dmi') - update_hud_wear_mask(wear_mask) - - apply_overlay(FACEMASK_LAYER) - -/mob/living/carbon/update_inv_neck() - remove_overlay(NECK_LAYER) - - if(client && hud_used && hud_used.inv_slots[SLOT_NECK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] - inv.update_icon() - - if(wear_neck) - if(!(head && (head.flags_inv & HIDENECK))) - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi') - update_hud_neck(wear_neck) - - apply_overlay(NECK_LAYER) - -/mob/living/carbon/update_inv_back() - remove_overlay(BACK_LAYER) - - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] - inv.update_icon() - - if(back) - overlays_standing[BACK_LAYER] = back.build_worn_icon(state = back.icon_state, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/back.dmi') - update_hud_back(back) - - apply_overlay(BACK_LAYER) - -/mob/living/carbon/update_inv_head() - remove_overlay(HEAD_LAYER) - - if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated - return - - if(client && hud_used && hud_used.inv_slots[SLOT_BACK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] - inv.update_icon() - - if(head) - overlays_standing[HEAD_LAYER] = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi') - update_hud_head(head) - - apply_overlay(HEAD_LAYER) - - -/mob/living/carbon/update_inv_handcuffed() - remove_overlay(HANDCUFF_LAYER) - if(handcuffed) - var/mutable_appearance/cuffs = mutable_appearance('icons/mob/restraints.dmi', handcuffed.item_state, -HANDCUFF_LAYER) - cuffs.color = handcuffed.color - - overlays_standing[HANDCUFF_LAYER] = cuffs - apply_overlay(HANDCUFF_LAYER) - -/mob/living/carbon/update_inv_legcuffed() - remove_overlay(LEGCUFF_LAYER) - clear_alert("legcuffed") - if(legcuffed) - var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER) - legcuffs.color = legcuffed.color - - overlays_standing[HANDCUFF_LAYER] = legcuffs - apply_overlay(LEGCUFF_LAYER) - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) - -//mob HUD updates for items in our inventory - -//update whether handcuffs appears on our hud. -/mob/living/carbon/proc/update_hud_handcuffed() - if(hud_used) - for(var/hand in hud_used.hand_slots) - var/obj/screen/inventory/hand/H = hud_used.hand_slots[hand] - if(H) - H.update_icon() - -//update whether our head item appears on our hud. -/mob/living/carbon/proc/update_hud_head(obj/item/I) - return - -//update whether our mask item appears on our hud. -/mob/living/carbon/proc/update_hud_wear_mask(obj/item/I) - return - -//update whether our neck item appears on our hud. -/mob/living/carbon/proc/update_hud_neck(obj/item/I) - return - -//update whether our back item appears on our hud. -/mob/living/carbon/proc/update_hud_back(obj/item/I) - return - - - -//Overlays for the worn overlay so you can overlay while you overlay -//eg: ammo counters, primed grenade flashing, etc. -//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file -/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file) - . = list() - - -/mob/living/carbon/update_body() - update_body_parts() - -/mob/living/carbon/proc/update_body_parts() - //CHECK FOR UPDATE - var/oldkey = icon_render_key - icon_render_key = generate_icon_render_key() - if(oldkey == icon_render_key) - return - - remove_overlay(BODYPARTS_LAYER) - - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - BP.update_limb() - - //LOAD ICONS - if(limb_icon_cache[icon_render_key]) - load_limb_from_cache() - return - - //GENERATE NEW LIMBS - var/list/new_limbs = list() - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - new_limbs += BP.get_limb_icon() - if(new_limbs.len) - overlays_standing[BODYPARTS_LAYER] = new_limbs - limb_icon_cache[icon_render_key] = new_limbs - - apply_overlay(BODYPARTS_LAYER) - update_damage_overlays() - - - -///////////////////// -// Limb Icon Cache // -///////////////////// -/* - Called from update_body_parts() these procs handle the limb icon cache. - the limb icon cache adds an icon_render_key to a human mob, it represents: - - skin_tone (if applicable) - - gender - - limbs (stores as the limb name and whether it is removed/fine, organic/robotic) - These procs only store limbs as to increase the number of matching icon_render_keys - This cache exists because drawing 6/7 icons for humans constantly is quite a waste - See RemieRichards on irc.rizon.net #coderbus + /////////////////////// + //UPDATE_ICONS SYSTEM// + /////////////////////// +/* Keep these comments up-to-date if you -insist- on hurting my code-baby ;_; +This system allows you to update individual mob-overlays, without regenerating them all each time. +When we generate overlays we generate the standing version and then rotate the mob as necessary.. +As of the time of writing there are 20 layers within this list. Please try to keep this from increasing. //22 and counting, good job guys + var/overlays_standing[20] //For the standing stance +Most of the time we only wish to update one overlay: + e.g. - we dropped the fireaxe out of our left hand and need to remove its icon from our mob + e.g.2 - our hair colour has changed, so we need to update our hair icons on our mob +In these cases, instead of updating every overlay using the old behaviour (regenerate_icons), we instead call +the appropriate update_X proc. + e.g. - update_l_hand() + e.g.2 - update_hair() +Note: Recent changes by aranclanos+carn: + update_icons() no longer needs to be called. + the system is easier to use. update_icons() should not be called unless you absolutely -know- you need it. + IN ALL OTHER CASES it's better to just call the specific update_X procs. +Note: The defines for layer numbers is now kept exclusvely in __DEFINES/misc.dm instead of being defined there, + then redefined and undefiend everywhere else. If you need to change the layering of sprites (or add a new layer) + that's where you should start. +All of this means that this code is more maintainable, faster and still fairly easy to use. +There are several things that need to be remembered: +> Whenever we do something that should cause an overlay to update (which doesn't use standard procs + ( i.e. you do something like l_hand = /obj/item/something new(src), rather than using the helper procs) + You will need to call the relevant update_inv_* proc + All of these are named after the variable they update from. They are defined at the mob/ level like + update_clothing was, so you won't cause undefined proc runtimes with usr.update_inv_wear_id() if the usr is a + slime etc. Instead, it'll just return without doing any work. So no harm in calling it for slimes and such. +> There are also these special cases: + update_damage_overlays() //handles damage overlays for brute/burn damage + update_body() //Handles updating your mob's body layer and mutant bodyparts + as well as sprite-accessories that didn't really fit elsewhere (underwear, undershirts, socks, lips, eyes) + //NOTE: update_mutantrace() is now merged into this! + update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and + eyes were merged into update_body()) */ -//produces a key based on the mob's limbs +//HAIR OVERLAY +/mob/living/carbon/human/update_hair() + dna.species.handle_hair(src) + +//used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body. +/mob/living/carbon/human/proc/update_mutant_bodyparts() + dna.species.handle_mutant_bodyparts(src) + + +/mob/living/carbon/human/update_body() + remove_overlay(BODY_LAYER) + dna.species.handle_body(src) + ..() + +/mob/living/carbon/human/update_fire() + ..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning") + + +/* --------------------------------------- */ +//For legacy support. +/mob/living/carbon/human/regenerate_icons() + + if(!..()) + icon_render_key = null //invalidate bodyparts cache + update_body() + update_hair() + update_inv_w_uniform() + update_inv_wear_id() + update_inv_gloves() + update_inv_glasses() + update_inv_ears() + update_inv_shoes() + update_inv_s_store() + update_inv_wear_mask() + update_inv_head() + update_inv_belt() + update_inv_back() + update_inv_wear_suit() + update_inv_pockets() + update_inv_neck() + update_transform() + //mutations + update_mutations_overlay() + //damage overlays + update_damage_overlays() + +/* --------------------------------------- */ +//vvvvvv UPDATE_INV PROCS vvvvvv + +/mob/living/carbon/human/update_inv_w_uniform() + remove_overlay(UNIFORM_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + inv.update_icon() + + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = w_uniform + U.screen_loc = ui_iclothing + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += w_uniform + update_observer_view(w_uniform,1) + + if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) + return + + + var/t_color = U.item_color + if(!t_color) + t_color = U.icon_state + if(U.suit_style == NORMAL_SUIT_STYLE) + if(U.adjusted == ALT_STYLE) + t_color = "[t_color]_d" + + var/alt_worn = U.alternate_worn_icon + + if(!U.force_alternate_icon && U.mutantrace_variation && U.suit_style == DIGITIGRADE_SUIT_STYLE) + alt_worn = 'modular_citadel/icons/mob/uniform_digi.dmi' + + var/mutable_appearance/uniform_overlay + + if(dna && dna.species.sexes) + var/G = (gender == FEMALE) ? "f" : "m" + if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = (alt_worn ? alt_worn : 'icons/mob/uniform.dmi'), isinhands = FALSE, femaleuniform = U.fitted) + + if(!uniform_overlay) + uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = (alt_worn ? alt_worn : 'icons/mob/uniform.dmi'), isinhands = FALSE) + + + if(OFFSET_UNIFORM in dna.species.offset_features) + uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1] + uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2] + overlays_standing[UNIFORM_LAYER] = uniform_overlay + + apply_overlay(UNIFORM_LAYER) + update_mutant_bodyparts() + + +/mob/living/carbon/human/update_inv_wear_id() + remove_overlay(ID_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + inv.update_icon() + + var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] + + if(wear_id) + wear_id.screen_loc = ui_id + if(client && hud_used && hud_used.hud_shown) + client.screen += wear_id + update_observer_view(wear_id) + + //TODO: add an icon file for ID slot stuff, so it's less snowflakey + id_overlay = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = ((wear_id.alternate_worn_icon) ? wear_id.alternate_worn_icon : 'icons/mob/mob.dmi')) + if(OFFSET_ID in dna.species.offset_features) + id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1] + id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2] + overlays_standing[ID_LAYER] = id_overlay + apply_overlay(ID_LAYER) + + +/mob/living/carbon/human/update_inv_gloves() + remove_overlay(GLOVES_LAYER) + + if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + inv.update_icon() + + if(!gloves && bloody_hands) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color()) + if(get_num_arms() < 2) + if(has_left_hand()) + bloody_overlay.icon_state = "bloodyhands_left" + else if(has_right_hand()) + bloody_overlay.icon_state = "bloodyhands_right" + + overlays_standing[GLOVES_LAYER] = bloody_overlay + + var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER] + if(gloves) + gloves.screen_loc = ui_gloves + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += gloves + update_observer_view(gloves,1) + var/t_state = gloves.item_state + if(!t_state) + t_state = gloves.icon_state + overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = ((gloves.alternate_worn_icon) ? gloves.alternate_worn_icon : 'icons/mob/hands.dmi')) + gloves_overlay = overlays_standing[GLOVES_LAYER] + if(OFFSET_GLOVES in dna.species.offset_features) + gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1] + gloves_overlay.pixel_y += dna.species.offset_features[OFFSET_GLOVES][2] + overlays_standing[GLOVES_LAYER] = gloves_overlay + apply_overlay(GLOVES_LAYER) + + +/mob/living/carbon/human/update_inv_glasses() + remove_overlay(GLASSES_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + inv.update_icon() + + if(glasses) + glasses.screen_loc = ui_glasses //...draw the item in the inventory screen + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open ... + client.screen += glasses //Either way, add the item to the HUD + update_observer_view(glasses,1) + if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) + overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = ((glasses.alternate_worn_icon) ? glasses.alternate_worn_icon : 'icons/mob/eyes.dmi')) + var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] + if(glasses_overlay) + if(OFFSET_GLASSES in dna.species.offset_features) + glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1] + glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2] + overlays_standing[GLASSES_LAYER] = glasses_overlay + apply_overlay(GLASSES_LAYER) + + +/mob/living/carbon/human/update_inv_ears() + remove_overlay(EARS_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + inv.update_icon() + + if(ears) + ears.screen_loc = ui_ears //move the item to the appropriate screen loc + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open + client.screen += ears //add it to the client's screen + update_observer_view(ears,1) + + overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = ((ears.alternate_worn_icon) ? ears.alternate_worn_icon : 'icons/mob/ears.dmi')) + var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER] + if(OFFSET_EARS in dna.species.offset_features) + ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] + ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2] + overlays_standing[EARS_LAYER] = ears_overlay + apply_overlay(EARS_LAYER) + + +/mob/living/carbon/human/update_inv_shoes() + remove_overlay(SHOES_LAYER) + + if(get_num_legs() <2) + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + inv.update_icon() +/* + if(!shoes && bloody_feet) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(dna.features["taur"] != "None") + if(dna.features["taur"] in GLOB.noodle_taurs) + bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "snekbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "snekbloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "snekbloodyfeet_right" + else if(dna.features["taur"] in GLOB.paw_taurs) + bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "pawbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color()) + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "pawbloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "pawbloodyfeet_right" + else + if(get_num_legs() < 2) + if(has_left_leg()) + bloody_overlay.icon_state = "bloodyfeet_left" + else if(has_right_leg()) + bloody_overlay.icon_state = "bloodyfeet_right" + overlays_standing[GLOVES_LAYER] = bloody_overlay*/ + + if(shoes) + var/obj/item/clothing/shoes/S = shoes + shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open + client.screen += shoes //add it to client's screen + update_observer_view(shoes,1) + if(S.mutantrace_variation) + if(S.adjusted == ALT_STYLE) + S.alternate_worn_icon = 'modular_citadel/icons/mob/digishoes.dmi' + else + S.alternate_worn_icon = null + var/t_state = shoes.item_state + if (!t_state) + t_state = shoes.icon_state + overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = t_state, default_layer = SHOES_LAYER, default_icon_file = ((shoes.alternate_worn_icon) ? shoes.alternate_worn_icon : 'icons/mob/feet.dmi')) + var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER] + if(OFFSET_SHOES in dna.species.offset_features) + shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1] + shoes_overlay.pixel_y += dna.species.offset_features[OFFSET_SHOES][2] + overlays_standing[SHOES_LAYER] = shoes_overlay + apply_overlay(SHOES_LAYER) + +/mob/living/carbon/human/update_inv_s_store() + remove_overlay(SUIT_STORE_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + inv.update_icon() + + if(s_store) + s_store.screen_loc = ui_sstore1 + if(client && hud_used && hud_used.hud_shown) + client.screen += s_store + update_observer_view(s_store) + var/t_state = s_store.item_state + if(!t_state) + t_state = s_store.icon_state + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.alternate_worn_icon) ? s_store.alternate_worn_icon : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) + var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_LAYER] + if(OFFSET_S_STORE in dna.species.offset_features) + s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1] + s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2] + overlays_standing[SUIT_STORE_LAYER] = s_store_overlay + apply_overlay(SUIT_STORE_LAYER) + + +/mob/living/carbon/human/update_inv_head() + ..() + update_mutant_bodyparts() + if(head) + remove_overlay(HEAD_LAYER) + var/obj/item/clothing/head/H = head + if(H.mutantrace_variation) + if(H.muzzle_var == ALT_STYLE) + H.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_helmet.dmi' + else + H.alternate_worn_icon = null + + overlays_standing[HEAD_LAYER] = H.build_worn_icon(state = H.icon_state, default_layer = HEAD_LAYER, default_icon_file = ((head.alternate_worn_icon) ? H.alternate_worn_icon : 'icons/mob/head.dmi')) + var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER] + + if(OFFSET_HEAD in dna.species.offset_features) + head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1] + head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2] + overlays_standing[HEAD_LAYER] = head_overlay + apply_overlay(HEAD_LAYER) + +/mob/living/carbon/human/update_inv_belt() + remove_overlay(BELT_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + inv.update_icon() + + if(belt) + belt.screen_loc = ui_belt + if(client && hud_used && hud_used.hud_shown) + client.screen += belt + update_observer_view(belt) + + var/t_state = belt.item_state + if(!t_state) + t_state = belt.icon_state + + overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = ((belt.alternate_worn_icon) ? belt.alternate_worn_icon : 'icons/mob/belt.dmi')) + var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER] + if(OFFSET_BELT in dna.species.offset_features) + belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1] + belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2] + overlays_standing[BELT_LAYER] = belt_overlay + apply_overlay(BELT_LAYER) + + +/mob/living/carbon/human/update_inv_wear_suit() + remove_overlay(SUIT_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + inv.update_icon() + + if(wear_suit) + var/obj/item/clothing/suit/S = wear_suit + var/no_taur_thanks = FALSE + if(!istype(S)) + no_taur_thanks = TRUE + wear_suit.screen_loc = ui_oclothing + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += wear_suit + update_observer_view(wear_suit,1) + + if(!S.force_alternate_icon) + if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too + if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then. + S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' + else + S.alternate_worn_icon = null + + if(S.tauric == TRUE) //Are we a suit with tauric mode possible? + if(S.taurmode == SNEK_TAURIC) + S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_naga.dmi' + if(S.taurmode == PAW_TAURIC) + S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_canine.dmi' + if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) + S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' + else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE) + S.alternate_worn_icon = null + + overlays_standing[SUIT_LAYER] = S.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = ((wear_suit.alternate_worn_icon) ? S.alternate_worn_icon : 'icons/mob/suit.dmi')) + var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER] + if(OFFSET_SUIT in dna.species.offset_features) + suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] + suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] + if(!no_taur_thanks && S.center) + suit_overlay = center_image(suit_overlay, S.dimension_x, S.dimension_y) + overlays_standing[SUIT_LAYER] = suit_overlay + update_hair() + update_mutant_bodyparts() + + apply_overlay(SUIT_LAYER) + + +/mob/living/carbon/human/update_inv_pockets() + if(client && hud_used) + var/obj/screen/inventory/inv + + inv = hud_used.inv_slots[SLOT_L_STORE] + inv.update_icon() + + inv = hud_used.inv_slots[SLOT_R_STORE] + inv.update_icon() + + if(l_store) + l_store.screen_loc = ui_storage1 + if(hud_used.hud_shown) + client.screen += l_store + update_observer_view(l_store) + + if(r_store) + r_store.screen_loc = ui_storage2 + if(hud_used.hud_shown) + client.screen += r_store + update_observer_view(r_store) + + +/mob/living/carbon/human/update_inv_wear_mask() + ..() + if(wear_mask) + var/obj/item/clothing/mask/M = wear_mask + remove_overlay(FACEMASK_LAYER) + if(M.mutantrace_variation) + if(M.muzzle_var == ALT_STYLE) + M.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_mask.dmi' + else + M.alternate_worn_icon = null + + overlays_standing[FACEMASK_LAYER] = M.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = ((wear_mask.alternate_worn_icon) ? M.alternate_worn_icon : 'icons/mob/mask.dmi')) + var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER] + + if(OFFSET_FACEMASK in dna.species.offset_features) + mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] + mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2] + overlays_standing[FACEMASK_LAYER] = mask_overlay + apply_overlay(FACEMASK_LAYER) + update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout + +/mob/living/carbon/human/update_inv_back() + ..() + var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER] + if(back_overlay) + remove_overlay(BACK_LAYER) + if(OFFSET_BACK in dna.species.offset_features) + back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1] + back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2] + overlays_standing[BACK_LAYER] = back_overlay + apply_overlay(BACK_LAYER) + +/proc/wear_female_version(t_color, icon, layer, type) + var/index = t_color + var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] + if(!female_clothing_icon) //Create standing/laying icons if they don't exist + generate_female_clothing(index,t_color,icon,type) + return mutable_appearance(GLOB.female_clothing_icons[t_color], layer = -layer) + +/mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) + var/list/out = new + for(var/i in 1 to TOTAL_LAYERS) + if(overlays_standing[i]) + if(i in unwantedLayers) + continue + out += overlays_standing[i] + return out + +//human HUD updates for items in our inventory + +//update whether our head item appears on our hud. +/mob/living/carbon/human/update_hud_head(obj/item/I) + I.screen_loc = ui_head + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += I + update_observer_view(I,1) + +//update whether our mask item appears on our hud. +/mob/living/carbon/human/update_hud_wear_mask(obj/item/I) + I.screen_loc = ui_mask + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += I + update_observer_view(I,1) + +//update whether our neck item appears on our hud. +/mob/living/carbon/human/update_hud_neck(obj/item/I) + I.screen_loc = ui_neck + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += I + update_observer_view(I,1) + +//update whether our back item appears on our hud. +/mob/living/carbon/human/update_hud_back(obj/item/I) + I.screen_loc = ui_back + if(client && hud_used && hud_used.hud_shown) + client.screen += I + update_observer_view(I) + + + + +/* +Does everything in relation to building the /mutable_appearance used in the mob's overlays list +covers: + inhands and any other form of worn item + centering large appearances + layering appearances on custom layers + building appearances from custom icon files +By Remie Richards (yes I'm taking credit because this just removed 90% of the copypaste in update_icons()) +state: A string to use as the state, this is FAR too complex to solve in this proc thanks to shitty old code +so it's specified as an argument instead. +default_layer: The layer to draw this on if no other layer is specified +default_icon_file: The icon file to draw states from if no other icon file is specified +isinhands: If true then alternate_worn_icon is skipped so that default_icon_file is used, +in this situation default_icon_file is expected to match either the lefthand_ or righthand_ file var +femalueuniform: A value matching a uniform item's fitted var, if this is anything but NO_FEMALE_UNIFORM, we +generate/load female uniform sprites matching all previously decided variables +*/ +/obj/item/proc/build_worn_icon(var/state = "", var/default_layer = 0, var/default_icon_file = null, var/isinhands = FALSE, var/femaleuniform = NO_FEMALE_UNIFORM) + + //Find a valid icon file from variables+arguments + var/file2use + if(!isinhands && alternate_worn_icon) + file2use = alternate_worn_icon + if(!file2use) + file2use = default_icon_file + + //Find a valid layer from variables+arguments + var/layer2use + if(alternate_worn_layer) + layer2use = alternate_worn_layer + if(!layer2use) + layer2use = default_layer + + var/mutable_appearance/standing + if(femaleuniform) + standing = wear_female_version(state,file2use,layer2use,femaleuniform) + if(!standing) + standing = mutable_appearance(file2use, state, -layer2use) + + //Get the overlays for this item when it's being worn + //eg: ammo counters, primed grenade flashes, etc. + var/list/worn_overlays = worn_overlays(isinhands, file2use) + if(worn_overlays && worn_overlays.len) + standing.overlays.Add(worn_overlays) + + standing = center_image(standing, isinhands ? inhand_x_dimension : worn_x_dimension, isinhands ? inhand_y_dimension : worn_y_dimension) + + //Handle held offsets + var/mob/M = loc + if(istype(M)) + var/list/L = get_held_offsets() + if(L) + standing.pixel_x += L["x"] //+= because of center()ing + standing.pixel_y += L["y"] + + standing.alpha = alpha + standing.color = color + + return standing + + +/obj/item/proc/get_held_offsets() + var/list/L + if(ismob(loc)) + var/mob/M = loc + L = M.get_item_offsets_for_index(M.get_held_index_of_item(src)) + return L + + +//Can't think of a better way to do this, sadly +/mob/proc/get_item_offsets_for_index(i) + switch(i) + if(3) //odd = left hands + return list("x" = 0, "y" = 16) + if(4) //even = right hands + return list("x" = 0, "y" = 16) + else //No offsets or Unwritten number of hands + return list("x" = 0, "y" = 0) + + + +//produces a key based on the human's limbs +/mob/living/carbon/human/generate_icon_render_key() + . = "[dna.species.limbs_id]" + + if(dna.check_mutation(HULK)) + . += "-coloured-hulk" + else if(dna.species.use_skintones) + . += "-coloured-[skin_tone]" + else if(dna.species.fixed_mut_color) + . += "-coloured-[dna.species.fixed_mut_color]" + else if(dna.features["mcolor"]) + . += "-coloured-[dna.features["mcolor"]]-[dna.features["mcolor2"]]-[dna.features["mcolor3"]]" + else + . += "-not_coloured" + + . += "-[gender]" + + + var/is_taur = FALSE + var/mob/living/carbon/human/H = src + if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) + is_taur = TRUE + -/mob/living/carbon/proc/generate_icon_render_key() for(var/X in bodyparts) var/obj/item/bodypart/BP = X + + if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg)) + if(is_taur) + continue + + . += "-[BP.body_zone]" - if(BP.use_digitigrade) - . += "-digitigrade[BP.use_digitigrade]" - if(BP.animal_origin) - . += "-[BP.animal_origin]" if(BP.status == BODYPART_ORGANIC) . += "-organic" else . += "-robotic" + if(BP.use_digitigrade) + . += "-digitigrade[BP.use_digitigrade]" + if(BP.dmg_overlay_type) + . += "-[BP.dmg_overlay_type]" + if(BP.body_markings) + . += "-[BP.body_markings]" + else + . += "-no_marking" if(HAS_TRAIT(src, TRAIT_HUSK)) . += "-husk" +/mob/living/carbon/human/load_limb_from_cache() + ..() + update_hair() -//change the mob's icon to the one matching its key -/mob/living/carbon/proc/load_limb_from_cache() - if(limb_icon_cache[icon_render_key]) - remove_overlay(BODYPARTS_LAYER) - overlays_standing[BODYPARTS_LAYER] = limb_icon_cache[icon_render_key] - apply_overlay(BODYPARTS_LAYER) +/mob/living/carbon/human/proc/update_observer_view(obj/item/I, inventory) + if(observers && observers.len) + for(var/M in observers) + var/mob/dead/observe = M + if(observe.client && observe.client.eye == src) + if(observe.hud_used) + if(inventory && !observe.hud_used.inventory_shown) + continue + observe.client.screen += I + else + observers -= observe + if(!observers.len) + observers = null + break + +// Only renders the head of the human +/mob/living/carbon/human/proc/update_body_parts_head_only() + if (!dna) + return + + if (!dna.species) + return + + var/obj/item/bodypart/HD = get_bodypart("head") + + if (!istype(HD)) + return + + HD.update_limb() + + add_overlay(HD.get_limb_icon()) update_damage_overlays() + + if(HD && !(HAS_TRAIT(src, TRAIT_HUSK))) + // lipstick + if(lip_style && (LIPS in dna.species.species_traits)) + var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER) + lip_overlay.color = lip_color + if(OFFSET_LIPS in dna.species.offset_features) + lip_overlay.pixel_x += dna.species.offset_features[OFFSET_LIPS][1] + lip_overlay.pixel_y += dna.species.offset_features[OFFSET_LIPS][2] + add_overlay(lip_overlay) + + // eyes + if(!(NOEYES in dna.species.species_traits)) + var/has_eyes = getorganslot(ORGAN_SLOT_EYES) + var/mutable_appearance/eye_overlay + if(!has_eyes) + eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER) + else + eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER) + if((EYECOLOR in dna.species.species_traits) && has_eyes) + eye_overlay.color = "#" + eye_color + if(OFFSET_EYES in dna.species.offset_features) + eye_overlay.pixel_x += dna.species.offset_features[OFFSET_EYES][1] + eye_overlay.pixel_y += dna.species.offset_features[OFFSET_EYES][2] + add_overlay(eye_overlay) + + dna.species.handle_hair(src) + + update_inv_head() + update_inv_wear_mask() diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 9e72c22a..8e98e2dd 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -289,7 +289,6 @@ ) if(blood) - target_types += /obj/effect/decal/cleanable/xenoblood target_types += /obj/effect/decal/cleanable/blood target_types += /obj/effect/decal/cleanable/trail_holder diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 7b1fa9c9..8e512fa5 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -474,7 +474,8 @@ if(isturf(next)) if(bloodiness) var/obj/effect/decal/cleanable/blood/tracks/B = new(loc) - B.add_blood_DNA(return_blood_DNA()) + if(blood_DNA && blood_DNA.len) + B.blood_DNA |= blood_DNA.Copy() var/newdir = get_dir(next, loc) if(newdir == dir) B.setDir(newdir) @@ -487,7 +488,6 @@ B.setDir(newdir) bloodiness-- - var/oldloc = loc var/moved = step_towards(src, next) // attempt to move if(cell) diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 79a90132..bb513581 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -177,6 +177,7 @@ qdel(target) return TRUE var/atom/movable/M = target - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + M.clean_blood() visible_message("[src] polishes \the [target].") return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index c2d0a214..910e9c3c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -39,7 +39,7 @@ animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55) - wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/) + wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/) var/obj/item/udder/gutlunch/udder = null /mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index e70d34c2..dc887651 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -487,6 +487,26 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/can_hear() . = TRUE +/proc/bloodtype_to_color(var/type) + . = BLOOD_COLOR_HUMAN + switch(type) + if("U")//Universal blood; a bit orange + . = BLOOD_COLOR_UNIVERSAL + if("SY")//Synthetics blood; blue + . = BLOOD_COLOR_SYNTHETIC + if("L")//lizard, a bit pink/purple + . = BLOOD_COLOR_LIZARD + if("X*")//xeno blood; greenish yellow + . = BLOOD_COLOR_XENO + if("HF")// Oil/Hydraulic blood. something something why not. reee + . = BLOOD_COLOR_OIL + if("GEL")// slimepeople blood, rgb 0, 255, 144 + . = BLOOD_COLOR_SLIME + if("BUG")// yellowish, like, y'know bug guts I guess. + . = BLOOD_COLOR_BUG + //add more stuff to the switch if you have more blood colors for different types + // the defines are in _DEFINES/misc.dm + mob/proc/checkloadappearance() var/mob/living/carbon/human/H = src //This will be where the person gets to select their appearance instead of the random character diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 6acc68cf..acb30365 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -158,7 +158,7 @@ if(..()) if(reagents.total_volume) if(M.reagents) - reagents.trans_to(M, reagents.total_volume) + reagents.reaction(M, INJECT) /obj/item/pen/sleepy/Initialize() diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 31f6b3dd..87ebda89 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -170,7 +170,7 @@ if(iscarbon(user)) var/mob/living/carbon/C = user user_dna = C.dna - B.add_blood_DNA(user_dna) + B.add_blood_DNA(user_dna, C.diseases) var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna)) B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) return(BRUTELOSS) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3cf287d1..27b896c9 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -163,10 +163,19 @@ var/splatter_dir = dir if(starting) splatter_dir = get_dir(starting, target_loca) - if(isalien(L)) + var/obj/item/bodypart/B = L.get_bodypart(def_zone) + if(B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters + do_sparks(2, FALSE, target.loc) + if(prob(25)) + new /obj/effect/decal/cleanable/oil(target_loca) + else if(isalien(L)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color(H.dna.blood_type)) + else + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color()) if(iscarbon(L)) var/mob/living/carbon/C = L C.bleed(damage) diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 4a36ecf9..bcb7397e 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -19,29 +19,40 @@ var/turf/T = get_turf(target) //section shamelessly copypasta'd from the clean component - SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) for(var/A in T) if(is_cleanable(A)) qdel(A) - else if(istype(A, /obj/item)) - var/obj/item/I = A - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(ismob(I.loc)) - var/mob/M = I.loc + else if(isitem(A)) + var/obj/item/cleaned_item = A + SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_item.clean_blood() + if(ismob(cleaned_item.loc)) + var/mob/M = cleaned_item.loc M.regenerate_icons() else if(ishuman(A)) var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.head) - SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(cleaned_human.wear_suit) - SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - else if(cleaned_human.w_uniform) - SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - if(cleaned_human.shoes) - SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - cleaned_human.wash_cream() - cleaned_human.regenerate_icons() + if(cleaned_human.lying) + if(cleaned_human.head) + SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.head.clean_blood() + cleaned_human.update_inv_head() + if(cleaned_human.wear_suit) + SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.wear_suit.clean_blood() + cleaned_human.update_inv_wear_suit() + else if(cleaned_human.w_uniform) + SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_uniform.clean_blood() + cleaned_human.update_inv_w_uniform() + if(cleaned_human.shoes) + SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.shoes.clean_blood() + cleaned_human.update_inv_shoes() + SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.clean_blood() + cleaned_human.wash_cream() + cleaned_human.regenerate_icons() // 4.6x30mm (Autorifles) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 720d411d..5e80c42a 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -188,7 +188,7 @@ to_chat(usr, "ERROR: Cannot replicate virus strain.") return A = A.Copy() - var/list/data = list("viruses" = list(A)) + var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY", "viruses" = list(A)) var/obj/item/reagent_containers/glass/bottle/B = new(drop_location()) B.name = "[A.name] culture bottle" B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium." diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 81d2b87e..d1bca659 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,8 +1,9 @@ /datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) name = "Blood" id = "blood" - color = "#C80000" // rgb: 200, 0, 0 + color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0 + description = "Blood from some creature." metabolization_rate = 5 //fast rate so it disappears fast. taste_description = "iron" taste_mult = 1.3 @@ -27,27 +28,75 @@ if(iscarbon(L)) var/mob/living/carbon/C = L - if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) - if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) - C.reagents.add_reagent("toxin", reac_volume * 0.5) - else - C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM) + var/blood_id = C.get_blood_id() + if((blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) + C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio) + // we don't care about bloodtype here, we're just refilling the mob - if(reac_volume >= 10 && istype(L)) + if(reac_volume >= 10 && istype(L) && method != INJECT) L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino. + var/blood_id = C.get_blood_id() + if((blood_id == "blood" || blood_id == "jellyblood")) + if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be + C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person + ..() + /datum/reagent/blood/reaction_obj(obj/O, volume) if(volume >= 3 && istype(O)) - O.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) + O.add_blood_DNA(data) + +/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place + if(!istype(T)) + return + if(reac_volume < 3) + return + + var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here + if(!B) + B = new(T) + if(data["blood_DNA"]) + B.blood_DNA[data["blood_DNA"]] = data["blood_type"] + if(!B.reagents) + B.reagents.add_reagent(id, reac_volume) + B.update_icon() /datum/reagent/blood/on_new(list/data) if(istype(data)) SetViruses(src, data) + color = bloodtype_to_color(data["blood_type"]) + if(data["blood_type"] == "SY") + name = "Synthetic Blood" + taste_description = "oily" + + if(data["blood_type"] == "X*") + name = "Xenomorph Blood" + taste_description = "acidic heresy" + shot_glass_icon_state = "shotglassgreen" + pH = 2.5 + + if(data["blood_type"] == "HF") + name = "Hydraulic Blood" + taste_description = "burnt oil" + pH = 9.75 + + if(data["blood_type"] == "BUG") + name = "Insect Blood" + taste_description = "greasy" + pH = 7.25 + + if(data["blood_type"] == "L") + name = "Lizard Blood" + taste_description = "spicy" + pH = 6.85 + + /datum/reagent/blood/on_merge(list/mix_data) if(data && mix_data) if(data["blood_DNA"] != mix_data["blood_DNA"]) - data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match. + data["cloneable"] = FALSE //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match. if(data["viruses"] || mix_data["viruses"]) var/list/mix1 = data["viruses"] @@ -77,27 +126,111 @@ var/datum/disease/D = thing . += D -/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place - if(!istype(T)) - return - if(reac_volume < 3) - return +/datum/reagent/blood/synthetics + data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Synthetic Blood" + id = "syntheticblood" + taste_description = "oily" + color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48 - var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here - if(!B) - B = new(T) - if(data["blood_DNA"]) - B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/blood/lizard + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_LIZARD, "blood_type"="L","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Lizard Blood" + id = "lizardblood" + taste_description = "spicy" + color = BLOOD_COLOR_LIZARD // rgb: 11, 7, 48 + pH = 6.85 + +/datum/reagent/blood/jellyblood + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Slime Jelly Blood" + id = "jellyblood" + description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." + color = BLOOD_COLOR_SLIME + taste_description = "slime" + taste_mult = 1.3 + pH = 4 + +/datum/reagent/blood/xenomorph + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Xenomorph Blood" + id = "xenoblood" + taste_description = "acidic heresy" + color = BLOOD_COLOR_XENO // greenish yellow ooze + shot_glass_icon_state = "shotglassgreen" + pH = 2.5 + +/datum/reagent/blood/oil + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Hydraulic Blood" + id = "oilblood" + taste_description = "burnt oil" + color = BLOOD_COLOR_OIL // dark, y'know, expected batman colors. + pH = 9.75 + +/datum/reagent/blood/insect + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_BUG, "blood_type"="BUG","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Insectoid Blood" + id = "bugblood" + taste_description = "waxy" + color = BLOOD_COLOR_BUG // Bug colored, I guess. + pH = 7.25 + + +/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M) + if(prob(10)) + if(M.dna?.species?.exotic_bloodtype != "GEL") + to_chat(M, "Your insides are burning!") + M.adjustToxLoss(rand(20,60)*REM, 0) + . = 1 + else if(prob(40) && isjellyperson(M)) + M.heal_bodypart_damage(2*REM) + . = 1 + ..() /datum/reagent/liquidgibs name = "Liquid gibs" id = "liquidgibs" - color = "#FF9966" + color = BLOOD_COLOR_HUMAN description = "You don't even want to think about what's in here." taste_description = "gross iron" shot_glass_icon_state = "shotglassred" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= "O+","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) pH = 7.45 +/datum/reagent/liquidgibs/xeno + name = "Liquid xeno gibs" + id = "liquidxenogibs" + color = BLOOD_COLOR_XENO + taste_description = "blended heresy" + shot_glass_icon_state = "shotglassgreen" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + pH = 2.5 + +/datum/reagent/liquidgibs/slime + name = "Slime sludge" + id = "liquidslimegibs" + color = BLOOD_COLOR_SLIME + taste_description = "slime" + shot_glass_icon_state = "shotglassgreen" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + pH = 4 + +/datum/reagent/liquidgibs/synth + name = "Synthetic sludge" + id = "liquidsyntheticgibs" + color = BLOOD_COLOR_SYNTHETIC + taste_description = "jellied plastic" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + +/datum/reagent/liquidgibs/oil + name = "Hydraulic sludge" + id = "liquidoilgibs" + color = BLOOD_COLOR_OIL + taste_description = "chunky burnt oil" + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + pH = 9.75 + /datum/reagent/vaccine //data must contain virus type name = "Vaccine" @@ -604,6 +737,30 @@ race = /datum/species/android mutationtext = "The pain subsides. You feel... artificial." +//Citadel Races +/datum/reagent/mutationtoxin/mammal + name = "Mammal Mutation Toxin" + id = "mammalmutationtoxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/mammal + mutationtext = "The pain subsides. You feel... fluffier." + +/datum/reagent/mutationtoxin/insect + name = "Insect Mutation Toxin" + id = "insectmutationtoxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/insect + mutationtext = "The pain subsides. You feel... attracted to dark, moist areas." + +/datum/reagent/mutationtoxin/xenoperson + name = "Xeno-Hybrid Mutation Toxin" + id = "xenopersonmutationtoxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/xeno + mutationtext = "The pain subsides. You feel... oddly longing for the Queen." //sadly, not the British one. //BLACKLISTED RACES /datum/reagent/mutationtoxin/skeleton @@ -966,12 +1123,12 @@ reagent_state = SOLID taste_description = "iron" pH = 6 - + overdose_threshold = 30 color = "#c2391d" /datum/reagent/iron/on_mob_life(mob/living/carbon/C) if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) - C.blood_volume += 0.5 + C.blood_volume += 0.01 //we'll have synthetics from medbay. ..() /datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -980,6 +1137,17 @@ M.reagents.add_reagent("toxin", reac_volume) ..() +/datum/reagent/iron/overdose_start(mob/living/M) + to_chat(M, "You start feeling your guts twisting painfully!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/overdose, name) + +/datum/reagent/iron/overdose_process(mob/living/carbon/C) + if(prob(20)) + var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) + if (istype(L)) + C.applyLiverDamage(2) //mild until the fabled med rework comes out. the organ damage galore + ..() + /datum/reagent/gold name = "Gold" id = "gold" @@ -1096,17 +1264,19 @@ pH = 5.5 /datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume) - if(istype(O, /obj/effect/decal/cleanable)) + if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart)) qdel(O) else if(O) O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + O.clean_blood() /datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume) if(reac_volume >= 1) T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + T.clean_blood() for(var/obj/effect/decal/cleanable/C in T) qdel(C) @@ -1124,26 +1294,33 @@ H.lip_style = null H.update_body() for(var/obj/item/I in C.held_items) - SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + I.clean_blood() if(C.wear_mask) - if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(C.wear_mask.clean_blood()) C.update_inv_wear_mask() if(ishuman(M)) var/mob/living/carbon/human/H = C if(H.head) - if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.head.clean_blood()) H.update_inv_head() if(H.wear_suit) - if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.wear_suit.clean_blood()) H.update_inv_wear_suit() else if(H.w_uniform) - if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.w_uniform.clean_blood()) H.update_inv_w_uniform() if(H.shoes) - if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)) + SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + if(H.shoes.clean_blood()) H.update_inv_shoes() H.wash_cream() - SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) + SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + M.clean_blood() /datum/reagent/space_cleaner/ez_clean name = "EZ Clean" diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index c45a7e44..67070475 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -282,6 +282,12 @@ results = list("regen_jelly" = 2) required_reagents = list("tricordrazine" = 1, "slimejelly" = 1) +/datum/chemical_reaction/jelly_convert + name = "Blood Jelly Conversion" + id = "blood_jelly" + results = list("slimejelly" = 1) + required_reagents = list("toxin" = 1, "jellyblood" = 1) + /datum/chemical_reaction/corazone name = "Corazone" id = "corazone" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 8f0eae2e..3d1c5671 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -27,7 +27,7 @@ create_reagents(volume, reagent_flags) if(spawned_disease) var/datum/disease/F = new spawned_disease() - var/list/data = list("viruses"= list(F)) + var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F)) reagents.add_reagent("blood", disease_amount, data) add_initial_reagents() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 3e555f38..fe35981b 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -4,13 +4,16 @@ icon = 'icons/obj/bloodpack.dmi' icon_state = "bloodpack" volume = 200 + reagent_flags = DRAINABLE var/blood_type = null var/labelled = 0 + var/color_to_apply = "#FFFFFF" + var/mutable_appearance/fill_overlay /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) - reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_colour"=color, "blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/on_reagent_change(changetype) @@ -18,6 +21,7 @@ var/datum/reagent/blood/B = reagents.has_reagent("blood") if(B && B.data && B.data["blood_type"]) blood_type = B.data["blood_type"] + color_to_apply = bloodtype_to_color(blood_type) else blood_type = null update_pack_name() @@ -45,7 +49,7 @@ /obj/item/reagent_containers/blood/random/Initialize() icon_state = "bloodpack" - blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L") + blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "SY", "HF", "GEL", "BUG") return ..() /obj/item/reagent_containers/blood/APlus @@ -72,6 +76,18 @@ /obj/item/reagent_containers/blood/universal blood_type = "U" +/obj/item/reagent_containers/blood/synthetics + blood_type = "SY" + +/obj/item/reagent_containers/blood/oilblood + blood_type = "HF" + +/obj/item/reagent_containers/blood/jellyblood + blood_type = "GEL" + +/obj/item/reagent_containers/blood/insect + blood_type = "BUG" + /obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params) if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon)) if(!user.is_literate()) diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm index 7cb8a460..2e0d769d 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm @@ -105,3 +105,11 @@ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING build_path = /obj/item/circuitboard/machine/clonescanner category = list("Medical Machinery") + +/datum/design/board/bloodbankgen + name = "Machine Design (Blood Bank Generator Board)" + desc = "The circuit board for a blood bank generator." + id = "bloodbankgen" + build_path = /obj/item/circuitboard/machine/bloodbankgen + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + category = list ("Medical Machinery") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 9b97f75e..b4a860c8 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -61,7 +61,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag","genescanner") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "genescanner", "bloodbankgen") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 408133d2..29afcc8c 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -774,6 +774,8 @@ px_y = 12 stam_heal_tick = 2 max_stamina_damage = 50 + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) /obj/item/bodypart/l_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) @@ -838,6 +840,8 @@ px_y = 12 max_stamina_damage = 50 stam_heal_tick = 2 + var/blood_state = BLOOD_STATE_NOT_BLOODY + var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) /obj/item/bodypart/r_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index a2e80179..c6e2da08 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -49,6 +49,27 @@ +/mob/proc/has_left_leg() + return TRUE + +/mob/living/carbon/has_left_leg() + var/obj/item/bodypart/l_leg = get_bodypart(BODY_ZONE_L_LEG) + if(l_leg) + return TRUE + else + return FALSE + +/mob/proc/has_right_leg() + return TRUE + +/mob/living/carbon/has_right_leg() + var/obj/item/bodypart/r_leg = get_bodypart(BODY_ZONE_R_LEG) + if(r_leg) + return TRUE + else + return FALSE + + //Limb numbers /mob/proc/get_num_arms(check_disabled = TRUE) return 2 diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 977a33b8..40e20d60 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -57,7 +57,7 @@ /obj/item/organ/heart/prepare_eat() var/obj/S = ..() - S.icon_state = "heart-off" + S.icon_state = "[icon_base]-off" return S /obj/item/organ/heart/on_life() @@ -90,6 +90,12 @@ owner.set_heartattack(TRUE) failed = TRUE +obj/item/organ/heart/slime + name = "slime heart" + desc = "It seems we've gotten to the slimy core of the matter." + icon_state = "heart-s-on" + icon_base = "heart-s" + /obj/item/organ/heart/cursed name = "cursed heart" desc = "A heart that, when inserted, will force you to pump it manually." @@ -215,6 +221,19 @@ obj/item/organ/heart/cybernetic/upgraded/on_life() desc = "An electronic pump that regulates hydraulic functions, the electronics have EMP shielding." icon_state = "heart-c" +/obj/item/organ/heart/ipc + name = "IPC heart" + desc = "An electronic pump that regulates hydraulic functions, they have an auto-restart after EMPs." + icon_state = "heart-c" + organ_flags = ORGAN_SYNTHETIC + +/obj/item/organ/heart/ipc/emp_act() + . = ..() + if(. & EMP_PROTECT_SELF) + return + Stop() + addtimer(CALLBACK(src, .proc/Restart), 10) + /obj/item/organ/heart/freedom name = "heart of freedom" desc = "This heart pumps with the passion to give... something freedom." diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 6a1a35f326a78541da8c7ea3996331fa0206eb58..5bc30f886c2a1e5e4550eadf0ad0252056599f7f 100644 GIT binary patch literal 98423 zcmb5Vc|26_|2}>OA$uizsDxxU)`XNKTVm|{zVG|qf+CcC7qX2l`EQ0|;N}WJ{#h02gRYY@bPh zDP4FcA8-DKTb)|bktCrexv_(?Og*1_iFv9OzWr8KHY=|?D}FS!YL-1zcVC`8g@^T$ zhu#Kq5Iec}OO3m6w9>FDC1xza3Ad=+$2aMy7s9j`FTpX9NBCgO6kR%j$Xxuzg!lm7 z?5h5t{*Ai?k=i_4g+6F%l5HYfVZJ|__fgIvCO2QOj7qZxJfsU5XMS-y&Z?l@a5u{!nvJcZ6h)qV@tYrBiQe(#CX|766~Md$g~#ML#@d=l;XLax6z_Eykn z?O`hV^IJi?7uQWRNR?Z%$QW@~H=a^ie}TT_Uw1i}y36Um%om9tp41WS-6r1|oA>%W zpCrxQja3TidDq73c{KYgAVO1eb~{WhVb^)liOX3$Nr(EQ=kqEm8@~2G3}(z~n7p2Q zcFRsDb@M@;+s$3##`gLVa~Ho@$-TMo;?B_pD(j_BX5kj+D-eqWwo7C^mQKl^y0n6L znd+kARD-@f+35fJ`g+A3oxzdw9hW`4?;@Sz<(x;?2$g3jc zS7Be#rK)j!E4Oa4_PzYPlgTYRJms4y<!b+N!RbxuJm>I(K|nOr+i9=!d5mV+CR^)JlV);8uoqNR8SF37RO*y z&4S{av+*UWmI1FmzC?M3nnsuNkcVHMddhzZHJdpWGnzRSGxD8F7szz~rNBHIy?S3f z|41~xL;`gqRFD}N9dd)AhI z!FlMlxt}e`q}cVJxy+wP2c<^SB|F+@8MhL5{F2Y3@0oSjR(%r=-gK9FbK%pi^B=p- zKjewY{AkiO<}La0cBa#sIML{3R{M(S*TiQtHZ;CsHJ&}QzH66q3UHXpyXm>}r zR)|6;%3s&7v~wNpVvbvU+VpOIT$}D$T|*tOp7wP8F*Eexa)p1-sfHjpo3?#IdiwNudbV@TxOJk$`N=vJfpZiBi-&Zt-sLAx5sjiVDfqDOWZAao_jrl= zR${M3XU%HGQxL7d}w})LO(EEQ7sX^QpehIJJUL2(At*6c4=SPch$Q! z(>WnqebRUfQ&zQZD&`f^?qxE$&NI7a!Hb69<)kAgA$qF7nM4_wNBrL}{DLoGH~#zJ zvZccLe-5D|w~1hSe0DJSNYUUbY0^LMh@L*y{eM54ZU13{Hw>bpqRQ&{UY)i4GT-0e z>7OvZ=X-XPN%FtzBrKvM)(Pc99Spo3g=|M8M0wr=ec_K1ylwWd(?c)rNu@|L9GNA& z&*V~(0WS2B8-PbDjdSpcZb%VdZ zU3+eO4IF`yDO69(e@x(z_20(w_lHjOo{~XY^c{mW>zmKXXmuz1ufP3P3Wd(h&YEq# zmwT$fD^M%??vwd8W<1wV>JrVoKDQY`HNm@pOGT1M!OSdouI0I)N?BQ+ za4tIX!eU-xK9!4zFVbAM0-rr8AqXrmQ;}|^a;>;_%!VaiI+8{CsV3AZB1Qudi0K5b zbKN~X>E^;r$y_%fsG_1`wy)cpw!a2N9L^h^Dsus4SuzyARR#Kgp;uZ;eC zT3uaj#~jH__HK7?Pa^eErm&Km+tyXcoN4I@d^Gz5-ZrsHKq8ThqUi%6Y&~~Ud#yEy zg|+(rd5S3F?I+xcnIp=)cN6-QB03gD%Ae`lwF-bu8kbeQj;cDKlQqCZkr>P$j`TGM`s`aBwgzV~I^um`QC& zg6VTL>ihRM=jSe#5pJloh%iyj%wjNhmB!5peHm|ZlaPd{$Vm1JBzZziRIb&jv{Y2W zAU<1oqlr*BV__z?Y7Q{VrU(QFRfHnG@THYV0zTqTzC#AB7Ci#S*(*GtVS*tG$dNZf zj0!zUc#)Bjfpy4;vlc@8=Mc1onS!0$kE->Z>m4#|MboG3n7SEZvPAD(t*yDh`aHcx z{@I@|`424ZyAPhS$l)|4zr-*)Uk)GPHKAU-B48Bq#7 zaxHo{;%!w(An)<=il-y7_N-T8VxnB!!e49A!>^Bd-=}DYnVXw)bO|rGHU{Znc4-H6 z!^UFX&?}YpT8l}xw zQ?t3JI!egr6?AiTJx!Yqj?VY@2@4D3b&|WY;%!Jv`uutVS2F++N{CCPg`!gs;>dQR ziphe-_uw{c`cq7K$a-W_y?yig}th5_{wF z^753IuCv8_t$a+s7;P;YK-%NMC?P31drrX~TsfwHabjV|-#Ciq%0=GjM=LF+txTd+=c8E<4{!?d_+wXgCMo{$H`XberHgJnio8j!{Dg53mT_Okq}6+>4pc4w)u` z1XI^GKYjYNWn<;nuBN9ht?1-2S#odOQb31SwcId``SDsHL*? zX7oia6(sb=!NFmel$6vMLO%O6H|v~QMH!*EKOh;YG^8x9ZdJaAI+ayI*GWLPX|Bk; z0O2W#UV&3}Z5uE$M-JaZ|1AK|I=AdYk;853uI)Z7>}Iz6 zn_gtl?77%?FQW+Yn0_}vC1I?-u5NvKYs*cw7%dL5rN=aVJFu6@rUB5cY-ni6p1`%j z7oD%`m@x+6;{v{Ft>rdDOtz_>o}_sOH&xf1xO!`t+^>wHuT)(naCPmfva%pvh8UBo zwWFIW-ZBEw`GoIz_o&p-t>Wsc+VqHv^! z?c6WXV@n;Q@nnr|8!JZeTs{fC%5Urv(_LL8EN9XhDrzlg0f#7ExN~9Iyt0KAO6H4&i_OS0UFI-A*!&6DOPH;FzZx)8a`+N3HbQFz7QVnkZ~7*&?6#msH>y05lw#-w=j0@`6piY1F?5t z<;)*0Uy6G_<#hMiC-ZB^Vvc3A$@l<}+s(wN7E;>V<-~4_543Dz3ZpF|4`{+9cVr0~ zPEJnRH&)cZFoDyp>@?dISR z@G`%o4dkm0-_|OA0Bc?fPfG*BL2mhCE~p4#NJ}e;13-uN*hkGZ{mr1Lzg0Sj`lr~# zSz;z)2!ZH<9Vq5~Z%UkqxuQkiScG0FbI1s_u(bS@53(F@^p9KQpQRzbdwFjPn8N{$ zIh9n>n%>>rodh=`Oi!`F#K!iUx{JJNdb9Rk-uFuyt3tkicEe<{AAm_EE^^p3uCeaz z(&%yDp8EunLz}3Gh{!MBRy;s1PlS#R6>Fr{if=0`xC4!1E6yZ4ftUC|m4qg9;Sz&0 zKvrv<#Dj%%>cO4Z+_mUA?P8Sbz8_p$o6jo>cn%1VF#8IxZ_@1`l1#3v{6IA0rpZW2 zKZC^R;x!s~|C$*Fz7dy_!oYX&m2BzS5uuOUXp<&F(eI08b=jp?Uv#08^75&2(0kk%=qp^6DFJ&3Lyz|PIhxt2NSVV~3W-4kZ|IJ+8_ z+P|BEFzr5-7ow*K;RxqpqGG2YeIBKl_omlls@LX+SshpcPEe=t>lmrHNfhqHwsEoo zb^t@+yiOyGr~qMef!fQEj$slhSH|^csLh#0a)%Np2>>UV(Qq?VD9jX|nb+7XEG+z; zWG)_wWEWOX^lCO1j9YM|>S|(AI46?3Sit6VcYSHpRqp9c+8;lE9*CgfLT)ZDZC_kp zsG7@_f}BbA{1ZoX{Wl~r?lQmV`w&7#S5@iuStMFBjZV<-@aYhbnV4EppkH-$k(=R4B_Kt$(it_WXZNA^L#OfPT zib_c}O|tkl77^Jl$T+423cgUhibjH`y)ur`1KiJT>?E5?ft`b+<7VqQ3q3%-%IoWQ zb=IZ=BEL`m{MjT8qVcH1hFgG6p%?=--BX@EeX3_PUH1s0){n2py1-gTw2H zJF^?|+&RKuJ*m`4<$6U;`ut|*(${n~TO$NwbVE1&Qb$ycftEJCQZ)9^trXb;2M8c0 zEKKLyI-NToaEkP-y!{4bS-^+yc-uP;2OvgA=z|f6YR6GNfZg7%9(v`k?eWgi(h{Xt z>grtzy>BzoGZ-qzN3L+k|b@?-Eb z1z2D~k;4_&#^W}Cf@L6Vb^#gY?`N-BI}UDV3=9l>)JP%6(To$Rxm9?cM{3NMsTof@ zr)@*CSn_HkpZAB2#HX0J^*19|pisx-h>uhX2wwV@L6wc8qoXayj0b?TI0+T=B54%V z@7?R71(a+2u=8#t$Y=pMdJY+<=ajU(0nr*{>j^=_2NV5sg!=P!a59(l|+~o`DOL?dCxtVS8rXqW&qQDBP@zt7}n4W+q_-lv1{g z9MVTu-dr&?U0`18r?>G{zt$ zM4Rq~7eJy-Z<%Rb6O)aq($WA^#3=r(0M(+`OMVy@Z^49tmDK$;NHO{4+1wNz9Zkj* zskMHTuC~;ER!`Ef%O2n?>%Q6UyvVP1i>iM7GJhEWKJlKYN`l7u2*pS)l~e&8;Ueou*e|p;9-X35_Sf6O1T3=e9c-~V!zrVAygF8Mxo^=H5xvacAI8SFu4_y~D z?dq33xluXU=r&7+KpAom*5~?c8PH=-V zc%un$j*z&83~}|C;wPnA5RbZsMh>cGy#WXeZfremju}fD(fKS86;tGnA4J_!IqSLn zJ&zK${B=1|`rV6sQ1LNRkzS(QEkURx$N)m6m$v|-EbsA4S?JSMz;SLSKMHvX(h&Bv zX8P>zQU#3mq9USW=VU?U0hf_EDg+NgSRLIsGCJCO7Uj^MeFg)-*LayL&v~QQq~c;A zeKS41{U~rp_qv2b-Iu>#6`&)}(vDW{ycj2+rT?5W`Whoe1Wo*&P3(#%)T)D^UTZnk zj^kt;=JI8cHcduV`=JQ69#%{fkHU^MuNu(8WG*>$eu| z_zvHA4f35Cu>w%9J_GckP#A`*^8~?Cp?U&~P(5%%=+)$4m=s8K| ziyXfe{p()dr!Q<#o~|VK*@I-{jn)+gW;h%a)p-!2B1*1TIj) zXC!b9Q{tDmJU59F3xbl7$O^c6)t!x0zpqkpAMVaoCzcN%KyJ3l}QsZOtQC)J`)1vKsx$QpM-LPECo z{bhlWG_4Qny0zx2FX0#eRYwOBBH&>>MF0QqbbS=*|D98T_m&{!|LYYGZ^takzs>Z^ zf=5VKB(-v(Qf|n>!PyCfP)(8QY z<2?t5-aol18BW(FY&PP94?-eaa9L&LCartf;!b1tPeKVs{QYq-1t~UPA3r|~6)mkD zbdqk7b_+Ju=(9HVaU8X|x!Hle1vJDLR@wftr|Ky-9o9_U?e_3Mgq76-I|3n;Y;!m+ zx-#2av(8A>br1q)F#%-h0D(Y|*%-7}vK^u4r0>?-{?d=OxoS|3*GwaWLkIZN^N|+6 zp!`?&f4#kb&0_>j1#ZQ$W42>pYd;LVwckMu&AT^UR=6FW3S0l-lMPC+wPBw-=;>(} zfRvg1{eD=TU0pxFeQrCq7@$x;ia{cUMn^_uzX_`u(!Hoc=<4Ql1nqAsi=_`Fv-Oyi zI7|?v$_ZE?ujL9;6_7vMj_K>`d*14|wb^Ga+7EEXA!E;mXSdjDe{*{6;;S!$#XjKw z%IQ|WDlbDj(kW=_`Sa(t&6~&ic5ip(^X`9#K7`_r>MGaVfRsZ7YUcrK(XG|>_20#< zA6i?3A}ZHz`Ds;>}ipMF?ZsjhAg{0W2YbxsX_r3(RT_-#bxgK*`EJPP(i~1T^Xl~ z?_q^T0%UV+LG1z$2f`X@)`-vxBr+H0FIyp)>ePWYJo~?A!2#q2FAb-~dqA6=n=|KQ zkMFSSO}LROgbCs3=Px?tNlGbbu$X9Y$rMWLrGli$=W=D)QC}8Q%|b`=--8%PWsVG} z1kw;tD+fo*^w!3z-K7TnWpgAoWLDl^Fu@QG_9oqefa1DYQB?&FmNr9-MgbyKUQyvv zwcz&Ioe#Br3B{oMy=VwuxE6|Z#>U{W0+=*T(52^zX)U#S7nW+k( zRHVh@74HmIW@dxw@83Uk3%@q&Y(AD_IEy`A5oMPy9c}Fbz&kotaEGga9Nq)8`_5#8 ziF*ZLx9|h^GwX}1w$D5_}S}O{s_OpzIiKVLrYM1IH zU-!EY1~#+}iqF}sw6uft*)0OOI+}xxgCp!lwg!Q@bIpA$m`FhqBw=oDZk>+VSw-~U z!i9x}OF%F>AFdoQ!1H)6MlM^!>lx>l`Pb)JFOXaX)6+cuMaPmmAZK4gO>Jsp|5*Mm z`Y#@QtIEde=t`ft+-0R^m6XL*d$^&9l$1W@T-UJuUlGVDd#s^a|2X%tn4E;f-Z&7!ras|5 z%2`q0u&w?ppZE81k%Q&&-p0tE#s2ER-PJDFzk`yqe}ORM1k1`)k$yGTZvUds({IM2ohQEFI8f3CvfFXS6&Gi8Hp2dd}k|X$Lz;HHp z106bM-TG>r9~5YzvA9obyVqD^fAC~`CwP21$M^;teld>qfwHnB8PQW^TvFy!g>aTD zSMb4{bO%)tFJm9;216Gc_RC;@leEkrbHYN%jqr9+pc9pR`gGTdaEd?04c*?#)lb=l zE%O)4L4T%Iq&D-~Ox@0f$ADPYxV@O9{gZ=m&=ZA?kPsKY3C*~=y3%04!ott&w@aRz zi_OSjVej-pBR*PmkruSI-4TQv;}2eAzBXehp4Ke{XN^5t8uX;b9{j8_$xL#~Wzd4Xposq$6>k6A(#oE4uU% zK(nOy5}b0`Amt{c-w_&8P`O47vLZ6;2#Hh#TA;M}c@my?>|rN6H%3QCX>0i>yMzb) zfP%1nw7V8B8s*l0$i285cni#}8FQox(Sa{0jq55aT_0Q@pPn9s4#>l|VE&bDZ6RJO zZZ;O=QC*U@W`b@`PRCEu;alf~$srdPm;KaxIQ<`}SB1_Sx#GDTR3t>2m!)RF({IUo zJ+I%>DQxcu)EI{%B4N1TGD}d%5S^4wt*1hD;zj$)D)mTt2vDdhK zE%0`DEfB-BZY{t%vAAK=s#H6sr7Mt!31&Z_ZRYwZ#oGG%$-PaVs*istB1*3oT!1j5 zR9-HAetxF0R>?y{L&OajH-jnxT%x!|YxzDX4+!d|Rv%Ue9M@}J=MIKnxsZ8h>B*Dw zc5Qm}sRp=FUPvfDE-s^>pkNgIG}?xpy`8K+qIhY7S;m*_HRHTOTV9PC)w^}OoK*NKKb8GKmsm`ijS6A005avUn+tB-qukLR; zJhHRH3T>R*@n@sz;^N`qF+=;{BN`eSxZ)BIZ<&~wq!NXLHiTT}?mdtmFlVZkkuPPWT96sZhYOt?)If6U6oNi(ByEZeDAs+NghJnro>)ncp3yWm zyC&$hl_NTUF}#qfi)|MkpOeF`Cz}3oW^MP>7_%#{siyXNN0!5+#k(|T+IM9`Rj3Va zY+{1n1By}VM9QWXn6 zF+QkdFR*Qas_P4=-o>Hi^>y#V;C4z-&2A>!G%Kbof(ObI))s(UlBU)Ij52d$V*@ua z(p+1M<4tUJKo=Q|j*pJ|WX^7J5Ye#amO%%T6BC=W4K7A$Hsg6`Qvv2~_D^72)p)Gq z-qGTfD_5Q$uI4CFDUS}1j@J8ldj1(u&y>iX0KbSQKN5GFYN{5<#3#B`gKIB=?y%YsvEhjogti|53iqzwKo<~|_siOb-jP0z`;q$Mt$II&sNqk^<3JbSjqQ#7j zh4!iZI|0PhkX-H-!OEb)&)J#3&T$kO4;X&4a`3BigWB%$%1U-U#I8AC@~SG=#V!z` zwo+`N4Xv${9bjy)`TK>A@TaT>DHULn3fSYLW?OvL%5!67&2SFPC~)6eV;w+hG04<} zzOgj=j2)jnb?6%)ACzYUp;q8#qnTavY<{3!I&yLCqq|fv0tC8a`;r)I*E>Wm0!VQw zAb|}#M~c;YEOa+GOFS9swy&-nS@Pn>KXF>L=-%^-R^SwlEEVt@BK;uX^zoE*jy2LE z*!n5=u8v+%pxkZN{BkFtRCDBv>Wa5dMDCRxnZt@S(4_xAElJ!JyEMf=qLViq3WtYtXB17=lKNC@HAn#RVg*-kB)0E!B+dG94Ybam z)v}q!0$aeTs|f}Sj~K|GRsi&qEz;b$FP^7?@`riFrKMLMaVM&Jn{+TLa0lTDKYZFG zoc_qo@A&5fVs$08U%YfpW^`u8^lvntYAI@K%g%^>nhk<7 z&dJ(f=4!uZHz;f_fi(B$7{BH1jCU#g&PxhtValj1+jIVYW`h(zsXJ7665G)e zl;fvQ70jLXusI5x3O0jdV9;0T$fthQomM|=p5!dsA%i#!-$&+x@<)R_PB_YGtbCZK zn9kb3R8&;-4@eWaDK>{?#aW&d*=pS4CK!+&b4PsI03*t{e{JVnip^I6qXwOkkr5{T zeqaB#nY)n|^eHyzg(@v^O=GXw2m^h>^%U6fN|{U!?BY>dRn_Miy0^nVA^`ogA-@mc>h@h`X_Z5-_M)kYj%UJSx^fnEU}8)&Ea68%@-T zyOdf)*L-;8+Nb;1hD(r+m!Z9ye!&9hU1g<4$J{f@_Hm#Gd547&jvL%&hc>2~6DOLz zifv9e(*!yDUrgv#V>9~3KRBSd`})F%Y(=!?KF@EfgLnwsTwt&5PRev@t1SfK(l4F? za&xz{v!uX#uu6Lrk1zeBAEj|5Ib?u@_!p2ftX_qoc(?FC7-nSTWPEEs{+iu^EE|nj zOJxVe+z_b9_@I2u+VpK{X@fJWPSpkqPKWp&D*!!b+KizI1_f9V22^#;I(*40To>)# z+$8tc$M3bRnQZadle7YGJ@!>A1KMwn~<1g1QJP-qXVBLT(59;tKMRm<1L1~-_X6OfaAbxqB>)alK2K|bd zfu0cn)XRHcg&1@nRI+u=raW+Epi48Px4O&s1F2#18Cbo!K!0`HKgP3l z3GaX4KYlj5rD?qtq>eE4ZLXo?mhSJOd<<_&-U8c?mmhB27^Ds^@BMs51! zUsA5(MZOY!Nrv*NKubf_*VlKXx!qBc=T5X>y3P_Sh&#q(cVxq!PX`lq7O7{R?z6gm z)N=Q41(nB1f~ufF=;2~&SW=qi8CRnt?~wsOilKP+U0zD+z!VA;O+WbnbY?%u-qG<$ zvP(F>r4mC!L!%25CM6?NepDXzoRi#-nueyGQ~~5QKTs%7)*MN)MDAQN!E}J;=ucu! zF(4--D91A@Y9%Sx9BmCcf;X{VrDe-hy#HL1z+PW{R(*&MDv zRfrH*kh82?4V2M29!~8aM&8ENbvu-Qwx```u{t8AV|>D{U3q$ z{|dJv@BRye8pZ!^ohYyT|M74(KT;jUXqdp`P}TImI60X|h*4C^y|C)qHydUT?*V}; zYmEDBwawrE)g<~3i44ue9!^8ZjYZI6(t+gTdlq&zR(lq92*l>_#NJ>*>~~%iP78r( zyj@C5FL8TObPnwx?eYbxn;ThD6uX4t{yh0?29aN9 zW0LpSj27^P2f78Ut&|`Df;TWW#{t z!?Y5)S_R|0_-cxl^YW|vTsc?{lI`eAM-WgCQA8ia5__`}y_N}oWM_+!t6Nz=8XhBd z{bW)5u!D}hKhA2mYeiDnf{x3ON7GqdWLI1X9e-pA=3Eyqz@{wZf%B(V7PWPOgzt!0ZBgBu`!-aEDrieVqVNi zo`gg?T3Hpa$3DoU>XHHkFur?Xr$bFmjU38J=2}rL903-}Ehtn>MC3wj&w?MYwq{!} z1%lM}(8}sMSZ@q>=}w>=GCFOlQi{y@?h|t6Ak68t z{*J*g8n$?^T&=e=0>gX*ygS|=M{hOJbJbq|nv*-wP*8+h+(*VC`h1VTsfN7F0MLIr*?Xy=!CU zj=yY~va)h60BQESbTr9|_C>gRYIY-5NYAztv>vB6hREE!{vO$7=Xl z&$+)vB3tbD)p5Lu!m&!l9aDwZ^)LR(@ttr8fr z;V4`cQQDUK_AzMYx#eIxte76$K;g_r;TuW7j_|r?Ar)2v22Tbocw*sIo@{zwaVLe~ z0u}kZvqW$FJ`EU`mXs){tH<^Vzvd(VY;R*zSO*#r+Mp3(7`MQyjy4r4G?fE0ki8(q zm)KiA-4?W8nw*@Rz)4;JY=s~t+5$oG=3N0&5zCUc>68`C50*nEA(4xQxJLv zO0Jlmh4Jg;&u+2DQv!=mhn)wTvQvhyQ>nPuFnmKdZedxC+iPrdx^=dYw~y~G9Vzf*gWPskNhzX# zh3Sk=xSx2bu|7s1tROyzj4_xj$y}fb26$z!S0IsL{{Cqm&Bm?3+RdVHBRudfohi^6 z+vJiTorglG{*xJcQ4?II-H-kXe%vUF#~O*^2#+Kq9(G= zHn_SFv2ZDJbu3_&16Zq$;p%1Jj-UF=&cNRNSlD3#--APqUTlr|Nr8vo9H%xtn>9eU zgEYJk9P+l;nh3Z(cVs)NUU;6H>}Y7%!$A{zz^py;>I`3bAbEAPow+0VDUAt6?^bk; z^Qb4(6A2jG*TmgC2rBnw=+PRMn*ir_fbGZWx@SUgm%bMOIS5#^s zXu{mZdOXZ-)!Pah!~#1e<|cc54;@J!P!=$@qRbD_@HlM1`2U?dC9Na-40h1^J#`+A zhe&>`c)JG&2j5Uf-|d){hl_}4_2N!sAT0>Ywhw5EN9R+aw8L_dNWx`u64O40wlBEg zK>#_RM`i|u3?rg9&jL zQ=bn)rdsqiF90Rj-u_Sq`Vc=ieD!|7r#o>c8pSUF+O=CS1p^3k0-b|1C7G5r@&Y5t z{FJjXsN*S_E8)_wU@9>1d5*mks9#sQ4{yP!XjBhP^k{;1tSzu7mJ=GNco!o$> zbopD!GbsW_10DDcH!?sLFi%R8)+!ojj!a8eeWSHC@9c^JGbTsaYH4v!GbldXZut-> zpSd%rqt9vuD}YC5`!aH#jLARWqmIs(YX9!jo)x%SnrmSofd<{((b^#yr{3T&vfu^Q z*(NM8$3f>Ys2xIm%fm?frYkJf2Mka{S126-UR{PY68(!|M)Q!HrE_5|ekfr6h=Tz!pfyT-+);d%+O zg+-dQDnI|18)(UJlYc(W9%%r;at!o=a^Usb@7kMmejR7-Mp!?_!rrlgAb!LezGYhv z;)ezT`C<#iL4Tix90JjH3yW8R=Jt=HNbX9FI)qT(rPBb4%)LD(imy@}z)Tg1sWdr$ z0QOfnWTfyev8baj0;^@fghTOp;H$y0zyd&NTbGx2b)QWB;L}rO_JH4iEq5_hX0t$V zLFHD3K26hwi;IJXyr4GyjWZ)_kQ88m8xJwtpzU(C*wbZg&eKi)j{DP04m*Im%TKM4)%T-YHmtPGO@u64F! z=i~$+LV=E!1?bvj<2IiEbH1}Lx&We%^FN?UX^jWQN-$K=7HJ8Vn=MzCk1sn%{EU+g zY|*KC%sZlv_CEQ_Xa)y&9|kfJRk**j<@PcDDs&ZkF4TTt`RgNYs1-=G{YqNKz-}Wq z_g(^pQ^wbWHd`xGWOK?wQ|e`(T|T6)nlRH&}Wfm=vxaRjaCL0@yi|s0Aw}k5UmoI>c%DL75r`NQK@$6%4!R*AuDhnIi zmxXxwP)~sDT3$wGpm5UMmX%-L4IG}BkP*TMpPXRjJA8p(bNAK#XQ2HYi$lp1UcO!s zL&x1? z7eq{JXc-v=X~0<)@33qB>AO``&gXO1veh&5oAxO#MfRQPE*clVp z$h-wgKx`IRu(`lk(T|!0$QlgN?~ef8a80p zPX2h@71A79I$H1`Ka~e4MhCetbvJZ}lH zKn_6?l1#lTPp&`|&S)0A^BXkz;%y9k3wWckGA`i)_qBrg=qcK=9u+p=cdNqG+m5HV z8U{Yi|781p7fOZMe@LFDen&CXNO%OXgyS1(bRoX*mt7O+;j7Wt6!RYINq@PowN4(P z2+cLk0E8-JiTpHZ%j5#~xNxhZCqTSQyAk{EPy4Zg7QG=aK6uIpW5Ne*0u@J=Tl5K- zs?_tHZ;#vNBUw++3<`EhfxMF{U>A!eJJ`OrOUCYRUU6x6*1e0GKpY-0_mpf*N{jGH z;pXw2{|Qw}BCBiDygGDbJaN<{_Aa9+1aK@9#Hd|B&Mfgek=wG3Us|yibap{hYRnojIN^F|#SC^rs*u;? zBhwoI=|e&(DqGWO6K;D|Ha|d@ndI~NZVz!XdPpknHf5)#f6l(S<7n%gZ>v(=!YR?5 zL)4-l*hp6be4~&%MYudp){JZp7Pm0ut3Rm-M2Bv&q0XfANs>O#e^Igh{IF;U{`$8uR>xt${?nk)(~8Ua_rSs;1--Ahe>KC~(X$gl|E^c@q`5XH^&YlbA$vp&-nQ{M=g2-h`@u@zpRdCS4m(qdU-?T39CB#mdEey z+mKF7{x?_?OG9%WjfdeLw%D^zzS1G%(xlwtjk4XHEX!L(=zlc7&s1!F_qGAKzS3WF z0a}Bdz&dGRCkpgR0`wHw#B(BKi&bEAp&RfU_Kdi%2ST&3@1Ou^2j;yhwh_74m20k% z7DL2zr0!QCj-rYDtYA6?qD~sfrKOSpG+FO-tFvkpkXts-k2VT!Uaiv$(fP(N%jdy9 zpm+%EN5})Ux?MeyQv)yyw?5{j&rV3*9ApU7&`JscrOG+7sCOH}RNAqn>a(!9>%1t^ zzs*yLqoij<3UpJ?XwAU49b1L1VR!{a1J)V%GH1bl*w}pD+_`|zDHV?#Y!5JU7$m$m z0$X^BH{JlZp`+AovSE!U3GX-8*HAa3pY-*ZF(~Qcyr4I+Hw-raq2i!9naid}s*~_u zqD%NA$kt(v$5{#Tt_NK6=n#Xcyo4GFmuQ98IGcBAya9l-9N zMT)7Gfs*q8dikJWpC~+^*AML6(Z|7F9sW;r7NIM=Zg#v>P*qj6o_>$# zI6XKr&ZI~zfgv_FRyl+Lmu&E_{PV)VN>a|6yuJ=x@);lZttQXKM-);buQPWK4a&oQ z{-ieLx+nsy;_>OnV5`cK_XE$$|GxOvDb7|jH|Fd8qzp?nd+C9WJJ*d~>sI5lgG}37 zYHb46Zoie&1D8v(QDkLh1v|C0TrU~&_Dd%o@_U6(ue7n2PSFGbQ?}kneLVp~k*P4*W3{sL-4{?Nd&w%(Kol zZH3lbGi^ou{UEU`r?pJ2(CQjgyND$&dAmrPaC=v}n3ja#rZr39Se62`wkEKB0|(As zEqYHpvl9MZAAC@nwR>E6a(*9_ZM8t`=Ub9V_-6;XqN%5P{GCe@Cbq7Xh7qf^cD-Qh z7;S0=nBHjM3$^OC%U@#2tX!*=$SJf>y?jgev0Y98H^RUmph?akg|?$%|DKuI?7ZmO z#CW%;iLcPUmwEgrb~lmTrB+lhb}96RI;l2*j(n^Ohj z=Pr{;JTxZ1l)>sIB0_Jq9X*1D4y zZWAYQOTXR!f=D@2<5+~U6~-^_``khDU9*UW-TjUKMRPtw+s}9-tW@&u`r4WpD3Swo zd~5ZyGIC{18tUIT+*EoXIvWrXr;_jjn4S+pL~MgAH=KDSpXZdxGe)O}8QQZu->h!b zw6VDX1o2|L6_@0mWi_iz>wF!GvVOqWwb_OUXQP3Qo|av*HQT`cjCFVIZg|XQO>-tC z^LtW+R2yx1b?Dd`z7$Q=5Yb;kw`im+S_%o29@bTL59#^k1w?s?Cq$^3S9i^wEq;I< zGhWfmEJGNqSheL>3h0}Y9OYNJm=;=8D?h!q$i5VZ=R#v9YKlO6ID>l7FY2`S`<*xk zeVXA*YwGIB*z9S@Fw)!Kzo|qz5A9N5jWX7-v#;>q@Ibv+|5qa}5>ITV6j`?!TT53{ zyc!$)oAnte2=)RgOv~1eE_k5)v>v*+2q3MOjL8z#eb#9R*dwn9nSml*T?ySx9F3DHbojVY?P zv#*q{6MeUbR|0iOv&TlJc#CAD6m-=?i~zzD&u-R}N78*!Yu={LLG zr7zs8{>d2rI|(IInZATuG_oc+v7&j;-!Fw55W6Ds>?=Q4O-F9*p`i6iu~U?y&*11^ z#x8HlXG@6z1EXoK7oG@?VclBfsiH?4GCu|%hb;B$E@gZ_9D-%Lo;!9{6aLp@{UV=N zILt-Y*1i2+o|o}QFP(AY+LGpbm4|A2?T4khzW$ZBs&Ez#ntnpfw!`dTtHkVU?d$6@ z&5OR%!S@En;4gw*Y&+T?uSZy>Z-!h=Ox-##mWye|-_gD@?!cjZlAAurLEWt1wK}#& zOh!Ww&nj|YueWH!AB~%HARAc+rYugic zA&J@MAFCaQ3_~&+7u6PAU`o%Duts`IW) zDgWZEY>WHO83iY| z{{8ki3~v5KhhrOjb(HO&sg;jLnY#9q*J~(Ag{yI1jQ%!fU+B%#TS;_9?LxvT<619z?&+nj8qKYgy}*cW&cQG8h2>kA!@J|d+$gJ`yvu{xni(y` zbfR844ll^4w(K;x9~W=DF3&Tj_qOxD{GTj#-A(=ue5$wI|GrbGdClTt-#pzhkl?O^wh9&gCh0fbSGk<+Z9l{FvyJ}psGS+kP?;oG>57r3f%B<;cyf2&^AD1!Q z*&3bY(sOV7Y_g|?^99T{$d;7i|Yr7CfkrbYRq85{G}H;4U&?*363P%3-hZf z{QsPx9|JFJOt$%}xL369T|R3cA=5eEv{9T}&*lzWWxujQ7FD&b#L0WjlQa10Uxv?e5iX_O@%u_zRk@g>uKtEAwmZd5RZO9ov9?8^g51B;`$i znc@8ITvATZ{B7F*EZ8%_tnlg-IQM9VCN4Z97V@Vi4?aS`<)hZrk3(5->o9*TZXO|$ zreg=GxU)+l%H_$qy^zoU?UDZqc77PMxBpwI&3oIwD*SD=F)Q3{7kgv@911y?;D!=NGOF!*GEcQMpG-H)DVL3O9vGy*7|vPiJ-3a=&K=aUd1U1f9q#{#sJVXs zGttB_^A8r;An`PFaqm$^woPe~-5b*i9#uovM|Bh&`C!R$W6OZL2=erX@PO#I)C}l9 z@CHu02yiIaDS{|YWs!wq1Nm0{j2uv>vdAcET?odFb)1`ZR3E1_cdCQZzr2>md#CsF zMz=L+K(sT7?f91`)B5tKf#2sySgcG;N0Oe<_JGl*o%th?Z&~{2!B34jAL!Y#O{|AU zuH|IV0NXc?0q@!O%H0c^6*S%CcT8(6HM>@G(DM2#pqa(`2X=|`xLi4}Mg5Y~OM)c@ zNd`(|pSWRFL+G02?mW>vPV~BR4a|}&W%0Z~PatNMc@CCAip&9oKi1gU?JQ5J+XoRV zFKO?@)v2qP0FcUIrX0PxL2Q21O%ahck1kQ(;zM9GtURooT9)oGhj&hGpz!iHlROoX zNS$qxn&G0f%i;JK^;K{Wf4QHeAmg{&-O+HR-3Ph*AoBn2f*j3dq)kulZnEh)*ss7P zH}DKwOb!opvKC3tK}VE_JyNA2^^~QdvBE!&Q1{zn?1uHKu@{ueJLHZMu1e)O+I?XB zXa5;~pu_7W3tM=rqW+}Fcp1V4O%z2s8WWDSer)NIzM33NWG!?zf46Xa^Q+|bqEG%t z%cARA3M2SMM;yqZceFY$U;5>| zo&lH1%qhSl1c~<{#FGsxLHEp{4xkL;FMxXZJ!=kqG)DoM0L!%U_vq+p0XVuFvr!ko zX#-AD5!|DQIl!{BwLRS(AcRK|?F&mwzdV7HIn51YHu=r5klR@_;5>@ueLBOjdl{mP z@zR{T>vi9WIur8JshiJ=AUMoyi4Y3ZF)N+s?BOvNd)zkybkalv{iH*RKz` zAP`;P#ROsvK=BR(0DMS0eD47XMB^it4ZXM}Ha0d!JpQ{5I=cs!LJfxg0TPG4KzxaK z^A+(g*N1rO48uUw!}lQApvY_uHixi(H6Ms$QG|5t`A7Hm$1C&j-$@0)pq!v!0JM6B z_;mhc4xpM4SvNcKE4Op|?M|PqA7`=juMwUKhL6%Q5j&C650(mJGS?Nf>q$YGxoe^c zKRrJv;gghpCuX!+wJ*!6^qh)H|sG7UjRz1wDNf5 zi_ioG14z>y0PV2d4jiK+FhEalz9ruQAN{eaI}jcoj`#y)OF$>>(9>RW5digc1i5Zm zdCXOLy8iF;AkYB_6#II^{Qh_D1^_ejzan^AC1|@j8wSeSHxref&ZQsW(vR`xftS2hf<)K~Fz5K(rIXw3iplxuHQ z=NJbm#NU)>z(k@=q!ISoLq0_UGCTidn!<9*(;$!#$_@PQ@sbixp3bimMKCQyEG<%o zPotylU8Gb7TO9i%HTE)=11hct>EO_2S0QQ^DttK2uC#k{i)JV_`5zd&*TRc z;M2bXOywk!4cTD&oRZH+iX{ZObq&w`^K1k^(lj3c5VoOI-b_e!J$V}1b7BoK<@Jni z{mWT?3|D-YNJqcfZ-`8pezUX#AH}&tkMtqC#b8f9a&mIu_%gIS5J&%yT=j^Alo%ag`7TNo*eYf+1|g#Vgif ziLzz;R~Oyjm5=RFjoJ?`hgYjM$_6ovE4kZP9ukxWD$E}|EIHVo%-&|n7=q%W(% za-#(Cw(yRJ6OOch{`veF_$|9>Ryj4;+TQRM-`O<&xhQn}a*WGyO~CI#bnjv7Im)ld z+;h4D^TQhfAX zs4h+)Pr_!A;s#$$E2q>^i8z8{oZd8|f2pT6>74ZPFzg^rL|MT&SIaUv>x=geuY{gR zb&N>*anm~n5_*G{5i7ClFKvphfDt}golUcwd3Bz{ZGk4^t3i>qo>LNo6y;c zBM9zUYqyp+arRV+5rzKzyK!(wd;z-($+52LWrdb{N7u|?#J03kYOgAHIlQG=!X_os zscP3pD$h#NV);hgtXu3{NVX9szr|zqMc9$}LsLrvPUWxP$f}|*HJ{8ROyQeJKI?q} z;JpoB((aH2>jhs+>i`A z4|bU&6{>nLpUx0 z3owFyHJ|W3eYO0`S!S;zVjg2@_+Y>&M?b;wtZ-ha>~eMNB#LpE<0F}r5VzOdZXav* z>wyM4QEpR`{DCaCHfj-hYo#vDOtQsUj&~w2Glmv+I{NE!9jV@Ok(4EJT1AUEBKw(U z*vO8D47`;xaUQhocp6hL(xc8;BgN=2So|~Q`k1yIliAMCMIy$ANEp4BaOGliIx8Gk zH)^f;^NAH9eYh0;uBW6PZGj?X!3OEXkytHE9UnVMaZto1HJ1>ZC`Uv@5-uTsB?8yOm5u?MOcZ)}HA z@lvEkO)`sioMP*y^#chc3=ZT+@(*iUNbfm}@E0+@WYYLyTpULBsq20i@uj=TE`G!2 zue$G}V49YL#{&yE(i#br4b+rb{612L_Yh?Iq=-(pKc-waE>TsBmT9a((G z?0zThW3MbAPcECu3bz@`3oCG@t_jH!CW2khG;yvzroX16EE&woVsvG_;(`%p#%T

2#Dk%>22;&vKi^7W6_E45kh7}+4b#Shx^ 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 literal 115954 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ð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 XojH|;R>~(J;73o(NV8Vm@x}iE1tAV0 diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e2f0c97479a3d5401fe8f178e34c1ad3aa6e0802 GIT binary patch literal 13833 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 literal 0 HcmV?d00001 diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi index d7871b7a97d07c1963647226d62bec04c2e57ad2..69207097c09b5703150140f6c8218eb3847ea2a0 100644 GIT binary patch literal 17233 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 literal 4164 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 delta 15467 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 F{0|bemxBNR diff --git a/icons/obj/bloodbank.dmi b/icons/obj/bloodbank.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4b4b2b6990ccfa9d4b7039977982030cb6117980 GIT binary patch literal 1832 zcmb7_doJg$gqpTUNDZ@+5o9zNEp-{%)n#=_ zZIxElB{FqMlOiI+NQX8-QK~JCh)XpWmn^zJ_Gh<0-sd^*Iq&(tpZEKH&Uv$ayxlZ4 z_GMNqzw&m#{cOY$TBs850cv1W&uDCoy8Tzm0yUxdW`ZC7)t&cnYT z4F>~=~ugVDmXXhE;wfbAiLQ8$qgt)~7?!uhFfm&~ZU{76yPA~k60^gd94 zugI;Du6C_A(k1-G-I}#Bqp!?7?M>zBtnbB!!>cKm#1$hFIoln^M`aYr#vu=4c-&4m zGP~(B>J#BVBE_aAoju^;i!>gvjRJHGQeD0HXftD@{R7FM{=UAYx#YE?s_M+A=+q^?GSB+<2N&B4VtE3lgz|z&AK3e!Z-azD!St=CML4G9X2nr%2R}KlKbX zB6i16V5WW#8Zsj)P^_;^wuW}Af_n7$7%1Rn17EQZtB`$6 zxsTOQ5!IZ)wZGj;Wcg*RvVv&N??&$MS^^)zgOz=?tb9s7VPA)mgU*C8H}4b}Ow>y* zJ5fou8PMnI)VG8dht*s~xLv;aV1i8(hMWFAk7JKNyS!4wA(2}y{ZP)N}dQDUZejQ+4%J(<@xfRa$sN!Kha-<^A-HYdJ>w{x6<+g zf<)@Atws0?Rfm`+QGj@%-E%q0dOPRnUU)~qr5=ChVEDpV=lj_$PVSid4ndbeRbHHp z$(4ul>fWcO-!DlgEbj}PlQ1404_nw8U7KjEtE;=n=`!xRR@v=gT{&?k`(>)qHMH7J zBxXG-CZ^77F9IpTXGRX5_w_IuAafql9)+l_qg>N!?nfh!(rdPjDBc+>Zh8g%Cl z6OM(`pNjiqT%Rd)B?NDUaE*&Q*=&Du=Yk?Lu{K|ShEg!Rs)kGg{vXu`;gK-M zSF?rKF(ga};`T+Eo-Y)e{`1HR41G{e! literal 0 HcmV?d00001 diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm index 2be99436..d0e059e7 100644 --- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm +++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm @@ -307,7 +307,7 @@ var/mob/M = loc M.update_inv_hands() - SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is) + clean_blood() /obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user) if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked) diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm index bb8d4a5f..e5d386b5 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm @@ -1,18 +1,3 @@ -/mob/living/carbon/human/species/mammal - race = /datum/species/mammal - -/mob/living/carbon/human/species/avian - race = /datum/species/avian - -/mob/living/carbon/human/species/aquatic - race = /datum/species/aquatic - -/mob/living/carbon/human/species/insect - race = /datum/species/insect - -/mob/living/carbon/human/species/xeno - race = /datum/species/xeno - /mob/living/proc/resist_embedded() return diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 2e8dfb78..178199ae 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -222,7 +222,7 @@ miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno skinned_type = /obj/item/stack/sheet/animalhide/xeno - exotic_bloodtype = "L" + exotic_bloodtype = "X*" damage_overlay_type = "xeno" liked_food = MEAT diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm index 2e0df07e..2b53fa46 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -10,7 +10,7 @@ inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") - meat = null //robots can't make meat silly! + meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc //Just robo looking parts. mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc @@ -19,7 +19,7 @@ mutanteyes = /obj/item/organ/eyes/ipc mutanttongue = /obj/item/organ/tongue/robot - exotic_bloodtype = "oil" + exotic_bloodtype = "HF" var/datum/action/innate/monitor_change/screen diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm index 00063c22..c8ebde11 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,11 +1,3 @@ -/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume) - if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart)) - qdel(O) - else - if(O) - O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) - /datum/reagent/syndicateadrenals name = "Syndicate Adrenaline" id = "syndicateadrenals" diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index 91d7a1c2..1f97035b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -317,10 +317,10 @@ //So slimes can play too. /datum/chemical_reaction/fermi/enthrall/slime - required_catalysts = list("slimejelly" = 1) + required_catalysts = list("jellyblood" = 1) /datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom) - var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list//The one line change. + var/datum/reagent/blood/jellyblood/B = locate(/datum/reagent/blood/jellyblood) in my_atom.reagents.reagent_list//The one line change. var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list if(!B.data) var/list/seen = viewers(5, get_turf(my_atom)) diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index 0337d213..9dfc3054 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -2,7 +2,7 @@ /datum/reagent/consumable/semen name = "Semen" id = "semen" - description = "Sperm from some animal. Useless for anything but insemination, really." + description = "Sperm from some animal. I bet you'll drink this out of a bucket someday." taste_description = "something salty" taste_mult = 2 //Not very overpowering flavor data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) @@ -42,7 +42,9 @@ add_blood_DNA(list("Non-human DNA" = "A+")) /obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S) - S.add_blood_DNA(return_blood_DNA()) + if(S.blood_DNA) + blood_DNA |= S.blood_DNA.Copy() + ..() /datum/reagent/consumable/femcum name = "Female Ejaculate" @@ -74,7 +76,8 @@ add_blood_DNA(list("Non-human DNA" = "A+")) /obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F) - F.add_blood_DNA(return_blood_DNA()) + if(F.blood_DNA) + blood_DNA |= F.blood_DNA.Copy() ..() /datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume) diff --git a/modular_citadel/icons/mob/64x32_effects.dmi b/modular_citadel/icons/mob/64x32_effects.dmi index 7db65a8fc31d1f3d43419a64d2b83e0cf455d423..a11b3584a3b9599ed0f8bfdc7ab2701648f93bbb 100644 GIT binary patch literal 39945 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�=5f}!8&YO9VQ{|7c> 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 literal 35318 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

Q8&^ugcfy3TsWU?uPINTsbvsDn$^ywt>p~Z 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

_w5 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 P_)kSyL#b53DDeLPiMwb5 diff --git a/tgstation.dme b/tgstation.dme index 30f1e8bf..4979ae49 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -47,7 +47,6 @@ #include "code\__DEFINES\flags.dm" #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" -#include "code\__DEFINES\forensics.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\integrated_electronics.dm" #include "code\__DEFINES\interaction_flags.dm" @@ -365,7 +364,6 @@ #include "code\datums\components\empprotection.dm" #include "code\datums\components\footstep.dm" #include "code\datums\components\forced_gravity.dm" -#include "code\datums\components\forensics.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" #include "code\datums\components\knockoff.dm" @@ -394,7 +392,6 @@ #include "code\datums\components\uplink.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" -#include "code\datums\components\decals\blood.dm" #include "code\datums\components\storage\storage.dm" #include "code\datums\components\storage\concrete\_concrete.dm" #include "code\datums\components\storage\concrete\bag_of_holding.dm" @@ -600,6 +597,7 @@ #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\bloodbankgen.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" @@ -782,6 +780,7 @@ #include "code\game\objects\effects\decals\misc.dm" #include "code\game\objects\effects\decals\remains.dm" #include "code\game\objects\effects\decals\cleanable\aliens.dm" +#include "code\game\objects\effects\decals\cleanable\gibs.dm" #include "code\game\objects\effects\decals\cleanable\humans.dm" #include "code\game\objects\effects\decals\cleanable\misc.dm" #include "code\game\objects\effects\decals\cleanable\robots.dm" diff --git a/tools/mapmerge2/dmi.py b/tools/mapmerge2/dmi.py index f0a8182c..c12964ce 100644 --- a/tools/mapmerge2/dmi.py +++ b/tools/mapmerge2/dmi.py @@ -45,6 +45,8 @@ class Dmi: @classmethod def from_file(cls, fname): image = Image.open(fname) + if image.mode != 'RGBA': + image = image.convert('RGBA') # no metadata = regular image file if 'Description' not in image.info: @@ -250,4 +252,4 @@ if __name__ == '__main__': Dmi.from_file(os.path.join(dirpath, filename)) count += 1 - print(f"Successfully parsed {count} dmi files") + print(f"Successfully parsed {count} dmi files") \ No newline at end of file diff --git a/tools/mapmerge2/dmm.py b/tools/mapmerge2/dmm.py index 8bb1dca3..15aa04c0 100644 --- a/tools/mapmerge2/dmm.py +++ b/tools/mapmerge2/dmm.py @@ -343,7 +343,7 @@ def _parse(map_raw_text): in_map_block = False in_coord_block = False in_map_string = False - iter_x = 0 + base_x = 0 adjust_y = True curr_num = "" @@ -487,7 +487,7 @@ def _parse(map_raw_text): curr_x = int(curr_num) if curr_x > maxx: maxx = curr_x - iter_x = 0 + base_x = curr_x curr_num = "" reading_coord = "y" elif reading_coord == "y": @@ -521,21 +521,15 @@ def _parse(map_raw_text): adjust_y = False else: curr_y += 1 - if curr_x > maxx: - maxx = curr_x - if iter_x > 1: - curr_x = 1 - iter_x = 0 - + curr_x = base_x else: curr_key = BASE * curr_key + base52_r[char] curr_key_len += 1 if curr_key_len == key_length: - iter_x += 1 - if iter_x > 1: - curr_x += 1 - grid[curr_x, curr_y, curr_z] = duplicate_keys.get(curr_key, curr_key) + if curr_x > maxx: + maxx = curr_x + curr_x += 1 curr_key = 0 curr_key_len = 0 @@ -551,4 +545,4 @@ def _parse(map_raw_text): data = DMM(key_length, Coordinate(maxx, maxy, maxz)) data.dictionary = dictionary data.grid = grid - return data + return data \ No newline at end of file diff --git a/tools/mapmerge2/update_paths.py b/tools/mapmerge2/update_paths.py index 2c316e94..deab468e 100644 --- a/tools/mapmerge2/update_paths.py +++ b/tools/mapmerge2/update_paths.py @@ -173,4 +173,4 @@ if __name__ == "__main__": parser.add_argument("--directory", "-d", help="path to maps directory, defaults to _maps/") parser.add_argument("--inline", "-i", help="treat update source as update string instead of path", action="store_true") parser.add_argument("--verbose", "-v", help="toggle detailed update information", action="store_true") - main(parser.parse_args()) + main(parser.parse_args()) \ No newline at end of file