diff --git a/code/datums/disease.dm b/code/datums/disease.dm index 024337c8e065..a8fdf504fc07 100644 --- a/code/datums/disease.dm +++ b/code/datums/disease.dm @@ -104,16 +104,20 @@ GLOBAL_LIST_INIT(diseases, typesof(/datum/disease) - /datum/disease) how_spread = force_spread if(how_spread == SPECIAL || how_spread == NON_CONTAGIOUS || how_spread == BLOOD)//does not spread - return + return FALSE if(stage < contagious_period) //the disease is not contagious at this stage - return + return FALSE if(!source)//no holder specified if(affected_mob)//no mob affected holder source = affected_mob else //no source and no mob affected. Rogue disease. Break - return + return FALSE + + var/mob/source_mob = source + if(istype(source_mob) && !source_mob.can_pass_disease()) + return FALSE var/check_range = airborne_range//defaults to airborne - range 2 @@ -122,7 +126,7 @@ GLOBAL_LIST_INIT(diseases, typesof(/datum/disease) - /datum/disease) if(isturf(source.loc)) for(var/mob/living/carbon/victim in oview(check_range, source)) - if(isturf(victim.loc)) + if(isturf(victim.loc) && victim.can_pass_disease()) if(AStar(source.loc, victim.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, check_range)) victim.contract_disease(src, 0, 1, force_spread) diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index fa5332c0c996..fa2e959b7f64 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -1,27 +1,25 @@ /obj/structure/closet/l3closet name = "level-3 biohazard suit closet" desc = "It's a storage unit for level-3 biohazard gear." - icon_state = "bio" - icon_closed = "bio" - icon_opened = "bioopen" + icon_state = "bio_general" + icon_closed = "bio_general" + icon_opened = "bio_generalopen" /obj/structure/closet/l3closet/Initialize() . = ..() - new /obj/item/clothing/suit/bio_suit/general( src ) - new /obj/item/clothing/head/bio_hood/general( src ) - + new /obj/item/clothing/suit/bio_suit( src ) + new /obj/item/clothing/head/bio_hood( src ) -/obj/structure/closet/l3closet/general - icon_state = "bio_general" - icon_closed = "bio_general" - icon_opened = "bio_generalopen" +/obj/structure/closet/l3closet/medical + icon_state = "bio_medical" + icon_closed = "bio_medical" + icon_opened = "bio_medicalopen" -/obj/structure/closet/l3closet/general/Initialize() +/obj/structure/closet/l3closet/medical/Initialize() . = ..() contents = list() - new /obj/item/clothing/suit/bio_suit/general( src ) - new /obj/item/clothing/head/bio_hood/general( src ) - + new /obj/item/clothing/suit/bio_suit/medical( src ) + new /obj/item/clothing/head/bio_hood/medical( src ) /obj/structure/closet/l3closet/virology icon_state = "bio_virology" @@ -33,9 +31,6 @@ contents = list() new /obj/item/clothing/suit/bio_suit/virology( src ) new /obj/item/clothing/head/bio_hood/virology( src ) - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/oxygen(src) - /obj/structure/closet/l3closet/security icon_state = "bio_security" @@ -48,19 +43,6 @@ new /obj/item/clothing/suit/bio_suit/security( src ) new /obj/item/clothing/head/bio_hood/security( src ) - -/obj/structure/closet/l3closet/janitor - icon_state = "bio_janitor" - icon_closed = "bio_janitor" - icon_opened = "bio_janitoropen" - -/obj/structure/closet/l3closet/janitor/Initialize() - . = ..() - contents = list() - new /obj/item/clothing/suit/bio_suit/janitor( src ) - new /obj/item/clothing/head/bio_hood/janitor( src ) - - /obj/structure/closet/l3closet/scientist icon_state = "bio_scientist" icon_closed = "bio_scientist" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 53e96f898613..2fbccc4a21cc 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -1443,7 +1443,7 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list( armor_rad = CLOTHING_ARMOR_HIGHPLUS force = 0 //"The M3 MOPP mask would be a normal weapon if you were to hit someone with it." throwforce = 0 - flags_inventory = BLOCKSHARPOBJ + flags_inventory = BLOCKSHARPOBJ|BLOCKGASEFFECT flags_marine_helmet = NO_FLAGS flags_atom = NO_SNOW_TYPE|NO_NAME_OVERRIDE flags_inv_hide = HIDEEARS|HIDEALLHAIR diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 59e0918550ed..9d40e8d92bd0 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -1,7 +1,9 @@ //Biosuit complete with shoes (in the item sprite) +//Standard biosuit, orange stripe + /obj/item/clothing/head/bio_hood name = "bio hood" - icon_state = "bio" + icon_state = "bio_general" desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.2 armor_melee = CLOTHING_ARMOR_NONE @@ -9,10 +11,10 @@ armor_laser = CLOTHING_ARMOR_NONE armor_energy = CLOTHING_ARMOR_NONE armor_bomb = CLOTHING_ARMOR_NONE - armor_bio = CLOTHING_ARMOR_ULTRAHIGH + armor_bio = CLOTHING_ARMOR_HARDCORE armor_rad = CLOTHING_ARMOR_MEDIUM armor_internaldamage = CLOTHING_ARMOR_LOW - flags_inventory = COVEREYES|COVERMOUTH + flags_inventory = COVEREYES|COVERMOUTH|BLOCKGASEFFECT flags_inv_hide = HIDEFACE|HIDEMASK|HIDEEARS|HIDEALLHAIR flags_armor_protection = BODY_FLAG_HEAD|BODY_FLAG_FACE|BODY_FLAG_EYES siemens_coefficient = 0.9 @@ -26,7 +28,7 @@ /obj/item/clothing/suit/bio_suit name = "bio suit" desc = "A suit that protects against biological contamination." - icon_state = "bio" + icon_state = "bio_general" item_state = "bio_suit" w_class = SIZE_LARGE//bulky item gas_transfer_coefficient = 0.01 @@ -47,7 +49,7 @@ /obj/item/clothing/suit/storage/synthbio name = "bio suit" desc = "Synthetic compliant bio-hazard suit. Intended to allow a synthetic to offer the illusion of infection control to humans. Has had most of the internal protective lining removed, allowing it to hold equipment and be lighter to move in." - icon_state = "bio" + icon_state = "bio_general" item_state = "bio_suit" allowed = list( /obj/item/weapon/baton, @@ -65,13 +67,13 @@ /obj/item/device/motiondetector, ) -//Standard biosuit, orange stripe -/obj/item/clothing/head/bio_hood/general - icon_state = "bio_general" +//Medical biosuit, blue wrist bands +/obj/item/clothing/head/bio_hood/medical + icon_state = "bio_med" flags_armor_protection = BODY_FLAG_HEAD|BODY_FLAG_FACE|BODY_FLAG_EYES -/obj/item/clothing/suit/bio_suit/general - icon_state = "bio_general" +/obj/item/clothing/suit/bio_suit/medical + icon_state = "bio_med" flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS|BODY_FLAG_HANDS|BODY_FLAG_FEET flags_inv_hide = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL @@ -84,7 +86,7 @@ flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS flags_inv_hide = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL -//Security biosuit, grey with red stripe across the chest +//Security biosuit, red wrist bands /obj/item/clothing/head/bio_hood/security icon_state = "bio_security" @@ -93,17 +95,7 @@ flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS flags_inv_hide = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL -//Janitor's biosuit, grey with purple arms -/obj/item/clothing/head/bio_hood/janitor - icon_state = "bio_janitor" - -/obj/item/clothing/suit/bio_suit/janitor - icon_state = "bio_janitor" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS - flags_inv_hide = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL - - -//Scientist's biosuit, white with a pink-ish hue +//Scientist's biosuit, purple wrist bands /obj/item/clothing/head/bio_hood/scientist icon_state = "bio_scientist" @@ -112,15 +104,6 @@ flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS flags_inv_hide = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL -//CMO's biosuit, blue stripe -/obj/item/clothing/suit/bio_suit/cmo - icon_state = "bio_cmo" - flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_LEGS|BODY_FLAG_ARMS - flags_inv_hide = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL - -/obj/item/clothing/head/bio_hood/cmo - icon_state = "bio_cmo" - //Plague Dr mask can be found in clothing/masks/gasmask.dm /obj/item/clothing/suit/bio_suit/plaguedoctorsuit diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 9a181c817020..1bd8bac6b5c1 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -212,14 +212,14 @@ /datum/equipment_preset/synth/survivor/scientist_synth name = "Survivor - Synthetic - Scientist Synth" equipment_to_spawn = list( - WEAR_HEAD = /obj/item/clothing/head/bio_hood, + WEAR_HEAD = /obj/item/clothing/head/bio_hood/synth, WEAR_FACE = /obj/item/clothing/mask/surgical, WEAR_EYES = /obj/item/clothing/glasses/hud/health, WEAR_BODY = /obj/item/clothing/under/rank/scientist, WEAR_BACK = /obj/item/storage/backpack/satchel/chem, WEAR_IN_BACK = /obj/item/reagent_container/glass/beaker/vial/random/good, WEAR_IN_BACK = /obj/item/paper/research_notes/good, - WEAR_JACKET = /obj/item/clothing/suit/bio_suit, + WEAR_JACKET = /obj/item/clothing/suit/storage/synthbio, WEAR_WAIST = /obj/item/storage/belt/medical/lifesaver/full, WEAR_HANDS = /obj/item/clothing/gloves/black, WEAR_R_HAND = /obj/item/device/motiondetector, diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 08daa5348022..1ee7cc4c3169 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -156,30 +156,66 @@ . = ..() -/mob/living/carbon/attack_hand(mob/M as mob) - if(!istype(M, /mob/living/carbon)) return +/mob/living/carbon/attack_hand(mob/target_mob as mob) + if(!istype(target_mob, /mob/living/carbon)) return - if(M.mob_flags & SURGERY_MODE_ON && M.a_intent & (INTENT_HELP|INTENT_DISARM)) - var/datum/surgery/current_surgery = active_surgeries[M.zone_selected] + if(target_mob.mob_flags & SURGERY_MODE_ON && target_mob.a_intent & (INTENT_HELP|INTENT_DISARM)) + var/datum/surgery/current_surgery = active_surgeries[target_mob.zone_selected] if(current_surgery) - if(current_surgery.attempt_next_step(M, null)) + if(current_surgery.attempt_next_step(target_mob, null)) return TRUE else - var/obj/limb/affecting = get_limb(check_zone(M.zone_selected)) - if(affecting && initiate_surgery_moment(null, src, affecting, M)) + var/obj/limb/affecting = get_limb(check_zone(target_mob.zone_selected)) + if(affecting && initiate_surgery_moment(null, src, affecting, target_mob)) return TRUE - for(var/datum/disease/D in viruses) - if(D.spread_by_touch()) - M.contract_disease(D, 0, 1, CONTACT_HANDS) + if(can_pass_disease() && target_mob.can_pass_disease()) + for(var/datum/disease/virus in viruses) + if(virus.spread_by_touch()) + target_mob.contract_disease(virus, 0, 1, CONTACT_HANDS) - for(var/datum/disease/D in M.viruses) - if(D.spread_by_touch()) - contract_disease(D, 0, 1, CONTACT_HANDS) + for(var/datum/disease/virus in target_mob.viruses) + if(virus.spread_by_touch()) + contract_disease(virus, 0, 1, CONTACT_HANDS) - M.next_move += 7 //Adds some lag to the 'attack'. Adds up to 11 in combination with click_adjacent. + target_mob.next_move += 7 //Adds some lag to the 'attack'. Adds up to 11 in combination with click_adjacent. return +/// Whether or not a mob can pass diseases to another, or receive said diseases. +/mob/proc/can_pass_disease() + return TRUE + +/mob/living/carbon/human/can_pass_disease() + /// Multiplier for checked pieces. + var/mult = 0 + /// Total amount of bio protection + var/total_prot = 0 + /// Super bio armor + var/bio_hardcore = 0 + + var/list/worn_clothes = list() + worn_clothes += head + worn_clothes += wear_suit + worn_clothes += hands + worn_clothes += glasses + worn_clothes += w_uniform + worn_clothes += shoes + worn_clothes += wear_mask + + for(var/obj/item/clothing/worn_item in worn_clothes) + total_prot = (total_prot + worn_item.armor_bio) + mult++ + if(worn_item.armor_bio == CLOTHING_ARMOR_HARDCORE) + bio_hardcore++ + + if(bio_hardcore >= 2) + return FALSE + + var/perc = (total_prot / mult) + if(!prob(perc)) + return TRUE + return FALSE + /mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1.0, def_zone = null) if(status_flags & GODMODE) //godmode return FALSE diff --git a/icons/mob/humans/onmob/head_0.dmi b/icons/mob/humans/onmob/head_0.dmi index 9fc0bc82c123..b4738019fe1a 100644 Binary files a/icons/mob/humans/onmob/head_0.dmi and b/icons/mob/humans/onmob/head_0.dmi differ diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi index 737b59f6c4af..f2c4305f9cba 100644 Binary files a/icons/mob/humans/onmob/suit_0.dmi and b/icons/mob/humans/onmob/suit_0.dmi differ diff --git a/icons/obj/items/clothing/hats.dmi b/icons/obj/items/clothing/hats.dmi index 3e2a1dcfc243..fe95f09af4c8 100644 Binary files a/icons/obj/items/clothing/hats.dmi and b/icons/obj/items/clothing/hats.dmi differ diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi index 5057a89fe278..f3509d470376 100644 Binary files a/icons/obj/items/clothing/suits.dmi and b/icons/obj/items/clothing/suits.dmi differ diff --git a/icons/obj/structures/closet.dmi b/icons/obj/structures/closet.dmi index 4377a48779cb..9bda5798f782 100644 Binary files a/icons/obj/structures/closet.dmi and b/icons/obj/structures/closet.dmi differ diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm index dbcf22e2e586..bd4c1b4f33d8 100644 --- a/maps/map_files/BigRed/BigRed.dmm +++ b/maps/map_files/BigRed/BigRed.dmm @@ -13123,7 +13123,7 @@ }, /area/bigredv2/outside/virology) "aNa" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet/virology, /turf/open/floor{ icon_state = "white" }, diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm index 9c09a95e9f94..a0f2d17b69c0 100644 --- a/maps/map_files/CORSAT/Corsat.dmm +++ b/maps/map_files/CORSAT/Corsat.dmm @@ -31121,7 +31121,7 @@ }, /area/corsat/omega/maint) "bLD" = ( -/obj/structure/closet/l3closet/janitor, +/obj/structure/closet/l3closet, /turf/open/floor/corsat{ dir = 5; icon_state = "yellow" @@ -35244,7 +35244,7 @@ /turf/open/floor/corsat, /area/corsat/inaccessible) "bYU" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet, /turf/open/floor/corsat{ icon_state = "yellow" }, @@ -39429,7 +39429,7 @@ /turf/open/gm/dirtgrassborder/north, /area/corsat/theta/biodome) "ePL" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet, /turf/open/floor/corsat{ icon_state = "plate" }, @@ -58094,7 +58094,7 @@ }, /area/corsat/gamma/hangar/flightcontrol) "sFD" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet, /obj/structure/machinery/light, /turf/open/floor/corsat{ icon_state = "plate" diff --git a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm index f81f67e45a80..40a5a4349435 100644 --- a/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm +++ b/maps/map_files/FOP_v3_Sciannex/Fiorina_SciAnnex.dmm @@ -13504,9 +13504,8 @@ /area/fiorina/station/botany) "igQ" = ( /obj/structure/closet/cabinet, -/obj/item/clothing/under/rank/janitor, -/obj/item/clothing/suit/bio_suit/janitor, -/obj/item/clothing/head/bio_hood/janitor, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/head/bio_hood, /turf/open/floor/wood, /area/fiorina/station/civres_blue) "igV" = ( @@ -14854,7 +14853,7 @@ }, /area/fiorina/station/civres_blue) "iXV" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet, /turf/open/floor/prison, /area/fiorina/tumor/aux_engi) "iYa" = ( @@ -30983,10 +30982,6 @@ /area/fiorina/tumor/civres) "sQr" = ( /obj/structure/janitorialcart, -/obj/item/clothing/head/bio_hood/janitor{ - pixel_x = -4; - pixel_y = 5 - }, /turf/open/floor/prison, /area/fiorina/station/disco) "sQy" = ( diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 9e1d1ee91c96..718ecf645b68 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -17029,7 +17029,7 @@ }, /area/almayer/shipboard/port_point_defense) "bVe" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet/scientist, /obj/structure/window/reinforced{ dir = 8; health = 80 @@ -41339,7 +41339,7 @@ }, /area/almayer/hallways/upper/aft_hallway) "jZY" = ( -/obj/structure/closet/l3closet/virology, +/obj/structure/closet/l3closet/medical, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -44945,7 +44945,7 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/maint/hull/upper/u_a_s) "lmw" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet/scientist, /obj/structure/machinery/light{ dir = 8 }, @@ -51494,7 +51494,7 @@ /turf/open/floor/almayer, /area/almayer/hallways/lower/starboard_umbilical) "nDo" = ( -/obj/structure/closet/l3closet/general, +/obj/structure/closet/l3closet/scientist, /obj/structure/window/reinforced{ dir = 8; health = 80