From ef28e006909a5a82d8ab61fcb2b6c4f63e89e41a Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sun, 15 Feb 2026 01:30:57 -0600 Subject: [PATCH] [MDB Ignore] Refactors gauze, adds Tourniquets (#95041) ## About The Pull Request 1. Refactors gauze Removes gauze var from `/stack`, adds a shared parent between tape and gauze. Behavior of "sticking thing on limb" is now a bit more generic, with there being a component to facilitate it and a framework on `/bodypart` Closes #92990 2. Adds Tourniquets A first aid item, when attached to a limb it reduces blood loss from that limb by 90%. However while attached you walk slower (if on a leg), interact slower (if on a arm), and yes, you rapidly die if you put it on your head Paramedic belts have their starting equipment changed again for the 500th time. Surgical tape -> Tourniquet Bone gel -> Bonesetter image ## Why It's Good For The Game Adds some more variety for field treatment of bleeding wounds, and in the future we can add things like "improvised tourniquets" or "improvised splints" with wooden planks. ## Changelog :cl: Melbert add: Adds Tourniquets. While attached to a limb, reduces blood loss from that limb by 90%, but makes you walk / interact slower. (Or if you put it on your head, you die.) add: You can purchase Tourniquets from the premium section of the medical vendor add: Paramedic belt setup has changed yet again: Surgical tape replaced with Tourniquet, Bone gel replaced with Bonesetter. add: You can use all forms of tape as splint - like Gauze. Will secure a fracture but won't stop your blood from exiting. refactor: Refactored gauze entirely, report any strangeness with it (or tape, or tourniquets) /:cl: --- .../RandomRuins/AnywhereRuins/golem_ship.dmm | 2 +- .../lavaland_surface_biodome_winter.dmm | 4 +- .../lavaland_surface_elephant_graveyard.dmm | 2 +- .../SpaceRuins/dangerous_research.dmm | 2 +- _maps/RandomRuins/SpaceRuins/deepstorage.dmm | 4 +- .../RandomRuins/SpaceRuins/garbagetruck1.dmm | 2 +- .../RandomRuins/SpaceRuins/garbagetruck2.dmm | 6 +- .../RandomRuins/SpaceRuins/garbagetruck3.dmm | 2 +- _maps/RandomRuins/SpaceRuins/the_faceoff.dmm | 2 +- _maps/RandomZLevels/TheBeach.dmm | 2 +- _maps/RandomZLevels/heretic.dmm | 14 +- .../CatwalkStation/CatwalkStation_2023.dmm | 10 +- .../map_files/Deltastation/DeltaStation2.dmm | 12 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 374 +++++++++--------- _maps/map_files/MetaStation/MetaStation.dmm | 8 +- .../map_files/NebulaStation/NebulaStation.dmm | 10 +- .../maintenance_modules/medsciupper_3.dmm | 2 +- _maps/map_files/tramstation/tramstation.dmm | 10 +- _maps/map_files/wawastation/wawastation.dmm | 4 +- _maps/minigame/deathmatch/maint_mania.dmm | 2 +- _maps/minigame/deathmatch/sunrise.dmm | 2 +- _maps/shuttles/emergency_cruise.dmm | 2 +- _maps/shuttles/emergency_lance.dmm | 2 +- _maps/shuttles/emergency_luxury.dmm | 2 +- _maps/shuttles/emergency_meta.dmm | 2 +- _maps/shuttles/emergency_raven.dmm | 2 +- _maps/shuttles/infiltrator_advanced.dmm | 2 +- _maps/shuttles/infiltrator_basic.dmm | 2 +- _maps/shuttles/infiltrator_clown.dmm | 2 +- _maps/shuttles/whiteship_birdshot.dmm | 2 +- _maps/templates/holodeck_medicalsim.dmm | 2 +- _maps/templates/lazy_templates/wizard_den.dmm | 2 +- _maps/virtual_domains/heretic_hunt.dmm | 8 +- _maps/virtual_domains/island_brawl.dmm | 2 +- _maps/virtual_domains/meta_central.dmm | 2 +- code/__DEFINES/bodyparts.dm | 6 + .../signals/signals_mob/signals_mob_carbon.dm | 4 +- code/__DEFINES/dcs/signals/signals_object.dm | 5 + code/_globalvars/lists/maintenance_loot.dm | 4 +- code/datums/components/crafting/equipment.dm | 4 +- .../components/crafting/ranged_weapon.dm | 10 +- code/datums/components/crafting/tailoring.dm | 4 +- code/datums/components/crafting/tools.dm | 3 +- code/datums/components/limb_applicable.dm | 97 +++++ code/datums/storage/subtypes/belts.dm | 2 +- code/datums/storage/subtypes/medkits.dm | 2 +- code/datums/storage/subtypes/others/misc.dm | 2 +- code/datums/wounds/_wounds.dm | 37 +- code/datums/wounds/bones.dm | 13 +- code/datums/wounds/burns.dm | 15 +- code/datums/wounds/pierce.dm | 15 +- code/datums/wounds/slash.dm | 19 +- code/game/machinery/wall_healer.dm | 16 +- .../effects/decals/turfdecal/weakpoint.dm | 4 +- .../effects/spawners/random/medical.dm | 2 +- code/game/objects/items/stacks/medical.dm | 261 ++++++------ .../items/stacks/sheets/sheet_types.dm | 2 +- code/game/objects/items/stacks/stack.dm | 21 +- code/game/objects/items/stacks/tape.dm | 52 +-- code/game/objects/items/storage/belt.dm | 13 +- .../items/storage/boxes/clothes_boxes.dm | 2 +- code/game/objects/items/storage/dufflebags.dm | 2 +- code/game/objects/items/storage/medkit.dm | 23 +- code/game/objects/items/tourniquet.dm | 146 +++++++ code/modules/cargo/packs/medical.dm | 2 +- code/modules/holiday/holidays.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 18 +- code/modules/mob/living/carbon/examine.dm | 15 +- .../mob/living/silicon/robot/robot_model.dm | 4 +- .../reagents/reagent_containers/cups/soda.dm | 4 +- .../designs/autolathe/medsci_designs.dm | 2 +- .../designs/autolathe/service_designs.dm | 2 +- code/modules/research/designs/misc_designs.dm | 6 +- code/modules/surgery/bodyparts/_bodyparts.dm | 101 +++-- code/modules/surgery/bodyparts/parts.dm | 102 ++++- code/modules/surgery/bodyparts/wounds.dm | 3 +- .../surgery/operations/operation_add_limb.dm | 8 +- .../operations/operation_bone_repair.dm | 24 +- .../surgery/operations/operation_generic.dm | 12 +- code/modules/surgery/surgery_tray.dm | 6 +- .../uplink/uplink_items/device_tools.dm | 2 +- code/modules/vending/assist.dm | 2 +- code/modules/vending/engivend.dm | 2 +- code/modules/vending/medical.dm | 9 +- code/modules/vending/medical_wall.dm | 2 +- icons/map_icons/items/_item.dmi | Bin 19853 -> 19861 bytes icons/obj/medical/firstaid.dmi | Bin 0 -> 353 bytes tgstation.dme | 2 + tools/UpdatePaths/Scripts/95041_tape.txt | 2 + 89 files changed, 1021 insertions(+), 607 deletions(-) create mode 100644 code/datums/components/limb_applicable.dm create mode 100644 code/game/objects/items/tourniquet.dm create mode 100644 icons/obj/medical/firstaid.dmi create mode 100644 tools/UpdatePaths/Scripts/95041_tape.txt diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm index d910f5d7673..91b8ea9bc11 100644 --- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm +++ b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm @@ -217,7 +217,7 @@ /area/ruin/powered/golem_ship) "ok" = ( /obj/structure/table, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_y = 12; pixel_x = 4 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index cc9f5e7a295..3c228756225 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -14,8 +14,8 @@ /area/ruin/powered/snow_biodome) "ad" = ( /obj/structure/table, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/ruin/powered/snow_biodome) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index 2b4b18d6c68..1213c3684d7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -380,7 +380,7 @@ /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "Cp" = ( -/obj/item/stack/medical/gauze/improvised, +/obj/item/stack/medical/wrap/gauze/improvised, /obj/effect/decal/cleanable/dirt, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 8900f33d7f8..db55bfe5f94 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -1075,7 +1075,7 @@ /area/ruin/space/has_grav/dangerous_research/lab) "oJ" = ( /obj/item/stack/medical/bandage, -/obj/item/stack/medical/gauze/twelve, +/obj/item/stack/medical/wrap/gauze/twelve, /obj/item/reagent_containers/hypospray/medipen/blood_loss, /obj/effect/spawner/random/medical/injector, /obj/effect/turf_decal/tile/dark_red/anticorner{ diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index ced8c535a3f..d15e2954126 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -645,8 +645,8 @@ /obj/structure/table, /obj/item/healthanalyzer, /obj/item/healthanalyzer, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, +/obj/item/stack/medical/wrap/gauze, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "de" = ( diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm index 20bd5e3613c..a7eb36e8456 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck1.dmm @@ -904,7 +904,7 @@ /obj/item/stack/tile/bamboo/tatami{ amount = 40 }, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_y = -2 }, /obj/effect/decal/cleanable/plastic, diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm index b67d0f00080..2541fa7c568 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm @@ -305,8 +305,8 @@ "zH" = ( /obj/structure/closet/cardboard, /obj/item/stack/medical/suture, -/obj/item/stack/medical/gauze, -/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/wrap/gauze, +/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/structure/broken_flooring/corner, /obj/item/organ/cyberimp/arm/toolkit/surgery, /obj/item/organ/cyberimp/eyes/hud/medical, @@ -409,7 +409,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "EJ" = ( -/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/wrap/sticky_tape/surgical, /turf/open/floor/plating, /area/ruin/space/has_grav/garbagetruck/medicalwaste) "Go" = ( diff --git a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm index 21136cc1089..63dcd2f3b13 100644 --- a/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm +++ b/_maps/RandomRuins/SpaceRuins/garbagetruck3.dmm @@ -332,7 +332,7 @@ /obj/item/boxcutter{ pixel_x = 10 }, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_x = -5 }, /obj/structure/closet/crate/preopen, diff --git a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm index 6464c4901fd..6c30451bba8 100644 --- a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm @@ -1056,7 +1056,7 @@ "Ue" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced/plastitaniumglass, -/obj/item/stack/sticky_tape/pointy/super, +/obj/item/stack/medical/wrap/sticky_tape/pointy/super, /obj/structure/cable, /turf/open/floor/iron/dark/airless, /area/ruin/space) diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index cc06de9ed5d..1cecb4bebfe 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -726,7 +726,7 @@ pixel_y = 1; pixel_x = 18 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = -15; pixel_y = 10 }, diff --git a/_maps/RandomZLevels/heretic.dmm b/_maps/RandomZLevels/heretic.dmm index 768ce5698b6..831b608268a 100644 --- a/_maps/RandomZLevels/heretic.dmm +++ b/_maps/RandomZLevels/heretic.dmm @@ -434,8 +434,8 @@ /obj/structure/table, /obj/item/healthanalyzer, /obj/item/healthanalyzer, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, +/obj/item/stack/medical/wrap/gauze, /turf/open/floor/iron/dark, /area/awaymission/caves/heretic_laboratory) "cz" = ( @@ -1030,11 +1030,11 @@ /area/awaymission/beach/heretic) "fK" = ( /obj/structure/table, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_x = 6; pixel_y = 5 }, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_x = -6; pixel_y = 5 }, @@ -1385,7 +1385,7 @@ /area/awaymission/beach/heretic) "ho" = ( /obj/structure/table/glass, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/effect/turf_decal/siding{ dir = 6 @@ -3929,7 +3929,7 @@ "uM" = ( /obj/structure/table/glass, /obj/item/storage/medkit/regular, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/suture, /obj/effect/turf_decal/siding{ dir = 10 @@ -5603,7 +5603,7 @@ /area/awaymission/beach/heretic) "Dz" = ( /obj/structure/table/glass, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, /obj/effect/turf_decal/siding{ diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index 9cde40b8d1a..42a2ae3b778 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -18570,7 +18570,7 @@ /area/station/maintenance/port/aft) "eVY" = ( /obj/structure/cable, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_x = 12; pixel_y = 14 }, @@ -43394,7 +43394,7 @@ "lzW" = ( /obj/structure/table/glass, /obj/item/clothing/gloves/latex/nitrile, -/obj/item/stack/sticky_tape/surgical{ +/obj/item/stack/medical/wrap/sticky_tape/surgical{ pixel_x = -4; pixel_y = 5 }, @@ -57984,12 +57984,12 @@ /turf/open/floor/iron/textured, /area/station/cargo/storage) "pux" = ( -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_x = 8; pixel_y = 14 }, /obj/structure/table, -/obj/item/stack/sticky_tape{ +/obj/item/stack/medical/wrap/sticky_tape{ pixel_x = -4; pixel_y = 11 }, @@ -66934,7 +66934,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = 8 }, /obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 393f2d8931b..237d3778b78 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -10533,10 +10533,10 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/rd) "czO" = ( -/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/structure/table/glass, /obj/item/radio/intercom/directional/north, -/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/stack/medical/bone_gel, /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15629,7 +15629,7 @@ /area/station/commons/fitness/recreation) "dOc" = ( /obj/structure/table, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -39739,7 +39739,7 @@ /area/station/science/research) "jKm" = ( /obj/structure/rack, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/suture, /obj/item/stack/medical/mesh, /obj/item/reagent_containers/syringe/epinephrine{ @@ -48399,7 +48399,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "lQX" = ( -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/suture, /obj/machinery/camera/directional/north{ c_tag = "Medbay - Treatment Center"; @@ -65669,7 +65669,7 @@ /turf/open/floor/plating, /area/station/medical/abandoned) "qgs" = ( -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/tile/blue/fourcorners, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 1c11ddaab68..1dc2cef08cc 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -574,6 +574,16 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) +"akI" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/wrap/gauze{ + pixel_x = 2 + }, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/suture, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) "akK" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -4051,13 +4061,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating/icemoon, /area/station/engineering/atmos) -"bec" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "ben" = ( /obj/machinery/bluespace_beacon, /obj/effect/turf_decal/stripes/line{ @@ -8603,10 +8606,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/mining) -"coc" = ( -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "cod" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -8738,10 +8737,6 @@ "cpY" = ( /turf/closed/wall, /area/station/service/kitchen) -"cqa" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "cqb" = ( /obj/machinery/food_cart, /obj/structure/extinguisher_cabinet/directional/east, @@ -9665,10 +9660,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"cDt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "cDv" = ( /obj/item/stack/rods/fifty, /obj/structure/rack, @@ -12064,6 +12055,26 @@ /obj/structure/sign/nanotrasen/directional/east, /turf/open/openspace/icemoon/keep_below, /area/icemoon/underground/explored) +"dkM" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/wrap/gauze{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/item/stack/medical/mesh{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/stack/medical/suture, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, +/obj/machinery/defibrillator_mount/directional/east, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) "dkT" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -22000,10 +22011,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/station/commons/storage/art) -"gfV" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "gga" = ( /obj/machinery/light/small/directional/west, /obj/effect/spawner/random/trash/hobo_squat, @@ -25458,13 +25465,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/textured, /area/station/maintenance/starboard/fore) -"hfo" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "hfs" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, @@ -28397,6 +28397,13 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/plating, /area/station/medical/virology) +"hXg" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/circuit_workshop) "hXC" = ( /obj/structure/chair{ dir = 8 @@ -29406,6 +29413,14 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/qm) +"ikS" = ( +/obj/structure/cable, +/obj/structure/table/glass, +/obj/item/stack/medical/wrap/sticky_tape/surgical, +/obj/item/stack/medical/bone_gel, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/fore) "ikW" = ( /obj/structure/railing/corner{ dir = 8 @@ -33792,6 +33807,13 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"jAA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "jAF" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -34850,13 +34872,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"jPf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/engineering/circuit_workshop) "jPh" = ( /obj/structure/grille/broken, /obj/structure/disposalpipe/segment, @@ -36573,6 +36588,19 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"koa" = ( +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/circuit_workshop) "kod" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue{ @@ -38518,6 +38546,13 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/security/processing) +"kOP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/engineering/circuit_workshop) "kOR" = ( /obj/structure/railing/wooden_fence, /obj/item/flashlight/lantern/on, @@ -39469,13 +39504,6 @@ /obj/effect/decal/cleanable/confetti, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"lbF" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/lobby) "lch" = ( /obj/machinery/computer/monitor{ dir = 1; @@ -39488,16 +39516,6 @@ /obj/machinery/gateway/centerstation, /turf/open/floor/iron/dark/smooth_large, /area/station/command/gateway) -"lco" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "lcs" = ( /obj/structure/reagent_dispensers/plumbed{ dir = 4 @@ -40144,6 +40162,10 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/range) +"lmp" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "lms" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -40422,11 +40444,6 @@ "lpM" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain) -"lpQ" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "lpS" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -41994,6 +42011,14 @@ /obj/machinery/wall_healer/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"lNx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "lNy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44705,6 +44730,10 @@ /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"mCF" = ( +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "mCP" = ( /obj/machinery/light/small/red/directional/south, /obj/structure/chair{ @@ -47614,6 +47643,24 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"nvw" = ( +/obj/structure/table/glass, +/obj/item/stack/medical/wrap/gauze{ + pixel_x = 1 + }, +/obj/item/stack/medical/mesh, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "chemistry_access_shutters"; + name = "Chemistry Access Shutter Control"; + req_access = list("medical") + }, +/obj/item/stack/medical/suture, +/obj/effect/turf_decal/tile/blue/full, +/turf/open/floor/iron/large, +/area/station/medical/treatment_center) "nvx" = ( /obj/machinery/airalarm/directional/east, /obj/effect/landmark/event_spawn, @@ -49207,19 +49254,6 @@ /obj/structure/sign/warning/cold_temp/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/cytology) -"nPr" = ( -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/circuit_workshop) "nPs" = ( /obj/structure/bodycontainer/morgue, /obj/machinery/camera/directional/south{ @@ -50265,16 +50299,6 @@ /obj/machinery/computer/pandemic, /turf/open/floor/iron/white, /area/station/medical/virology) -"oeW" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/gauze{ - pixel_x = 2 - }, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/suture, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) "ofc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, /turf/open/floor/plating, @@ -54502,19 +54526,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/break_room) -"pjP" = ( -/obj/structure/cable, -/obj/structure/table/glass, -/obj/item/stack/sticky_tape/surgical, -/obj/item/stack/medical/bone_gel, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/machinery/camera/directional/south{ - c_tag = "Surgery B"; - network = list("ss13","medbay") - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "pkf" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -54737,6 +54748,11 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) +"pnF" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "pnG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/newscaster/directional/north, @@ -54958,14 +54974,6 @@ "prg" = ( /turf/open/floor/wood, /area/station/service/library) -"prm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "prs" = ( /obj/docking_port/stationary{ dir = 8; @@ -58217,6 +58225,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/lockers) +"qkP" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "qkR" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/chem_master, @@ -66142,26 +66160,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"svq" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/gauze{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/stack/medical/mesh{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/stack/medical/suture, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/syringe, -/obj/machinery/defibrillator_mount/directional/east, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) "svx" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/blue{ @@ -66815,24 +66813,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"sEK" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/gauze{ - pixel_x = 1 - }, -/obj/item/stack/medical/mesh, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "chemistry_access_shutters"; - name = "Chemistry Access Shutter Control"; - req_access = list("medical") - }, -/obj/item/stack/medical/suture, -/obj/effect/turf_decal/tile/blue/full, -/turf/open/floor/iron/large, -/area/station/medical/treatment_center) "sEN" = ( /obj/machinery/atmospherics/components/unary/passive_vent/layer2{ dir = 8 @@ -68549,13 +68529,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron, /area/station/science/xenobiology) -"tfC" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/circuit_workshop) "tfM" = ( /obj/structure/chair/office/light{ dir = 1 @@ -69084,6 +69057,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"tmt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "tmw" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron, @@ -71602,14 +71579,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/mine/eva/lower) -"tYA" = ( -/obj/structure/cable, -/obj/structure/table/glass, -/obj/item/stack/sticky_tape/surgical, -/obj/item/stack/medical/bone_gel, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/fore) "tYE" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -75170,6 +75139,10 @@ }, /turf/open/floor/cult, /area/station/service/chapel/office) +"vct" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "vcx" = ( /obj/machinery/newscaster/directional/east, /obj/structure/sink/directional/west, @@ -75908,6 +75881,13 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"vop" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/lobby) "vos" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76819,6 +76799,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/construction) +"vAJ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "vAP" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -77106,6 +77093,19 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/virology, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"vFZ" = ( +/obj/structure/cable, +/obj/structure/table/glass, +/obj/item/stack/medical/wrap/sticky_tape/surgical, +/obj/item/stack/medical/bone_gel, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/camera/directional/south{ + c_tag = "Surgery B"; + network = list("ss13","medbay") + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "vGw" = ( /obj/structure/transit_tube/station/reverse, /obj/structure/sign/warning/secure_area/directional/north, @@ -82737,11 +82737,6 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"xob" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/lobby) "xow" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/firealarm/directional/west, @@ -82970,6 +82965,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) +"xrL" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/smooth, +/area/station/engineering/lobby) "xrS" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, @@ -84303,10 +84302,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"xJY" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/smooth, -/area/station/engineering/lobby) "xKb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/window/reinforced/spawner/directional/south, @@ -86018,6 +86013,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) +"ykE" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/lobby) "ykG" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -182392,7 +182392,7 @@ xMq bID qhL iEQ -xob +ykE gjq eJf gjq @@ -182649,7 +182649,7 @@ iDt bID iWW thq -xob +ykE gjq eJf gjq @@ -182904,8 +182904,8 @@ thA iDt scw bID -gfV -lpQ +lmp +pnF bID bID bID @@ -183161,7 +183161,7 @@ thA thA ppY bID -cqa +xrL jJI tiJ uSA @@ -183418,7 +183418,7 @@ thA thA iDt bID -coc +mCF jJI eEn bCy @@ -183427,8 +183427,8 @@ iub iub dOb oWy -nPr -tfC +koa +hXg oxD aEz vJm @@ -183678,14 +183678,14 @@ bID bID jJI qrt -lco -bec -prm -bec +qkP +jAA +lNx +jAA gzL jsw nYl -jPf +kOP twu wJW oWy @@ -183933,13 +183933,13 @@ iDt iDt ppY bID -lbF +vop bID -xJY +vct iWW muJ -cDt -hfo +tmt +vAJ oWy qtu gTx @@ -253300,7 +253300,7 @@ cTV bOp lwQ qfi -sEK +nvw eHg ahL wVw @@ -255356,14 +255356,14 @@ hDq pZm lwQ gkX -oeW +akI aTZ fle pyu oul wRG rsR -svq +dkM oio kQM upO @@ -258195,11 +258195,11 @@ uKj dDw cyr qgu -tYA +ikS vds uhG liz -pjP +vFZ mFE nEc klk diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5f2afb80981..fcfef778c10 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2192,7 +2192,7 @@ /area/station/service/kitchen) "aNQ" = ( /obj/structure/table, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, /obj/machinery/power/apc/auto_name/directional/north, @@ -37484,7 +37484,7 @@ req_access = list("surgery") }, /obj/structure/table/reinforced, -/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/stack/medical/bone_gel, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/window/reinforced/spawner/directional/north, @@ -40811,7 +40811,7 @@ pixel_x = -4; pixel_y = 8 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49926,7 +49926,7 @@ "rbs" = ( /obj/structure/table, /obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/suture, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index e927ecbc6bb..5aefe75d4fa 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -72120,8 +72120,8 @@ dir = 4 }, /obj/structure/table/glass, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, @@ -116905,7 +116905,7 @@ pixel_y = 12; pixel_x = 8 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = 5 }, /obj/effect/turf_decal/tile/blue/full, @@ -138208,7 +138208,7 @@ /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/trimline/dark_blue/filled/line, /obj/structure/rack, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, /obj/item/reagent_containers/syringe/epinephrine{ @@ -147443,7 +147443,7 @@ dir = 6 }, /obj/structure/table/glass, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, /obj/effect/turf_decal/trimline/blue/corner{ diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm index c921b68dbb9..b7298d8f1f1 100644 --- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_3.dmm @@ -247,7 +247,7 @@ pixel_y = 10; pixel_x = -6 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_y = -2; pixel_x = 5 }, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index e8af5cfc03f..6edd7fc9d11 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -8605,7 +8605,7 @@ "bVY" = ( /obj/structure/table/glass, /obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -14495,7 +14495,7 @@ /obj/machinery/firealarm/directional/south, /obj/structure/table/glass, /obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "dRY" = ( @@ -14828,7 +14828,7 @@ pixel_x = -4; pixel_y = 8 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = 8 }, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -23246,7 +23246,7 @@ /area/station/commons/fitness/recreation) "hfd" = ( /obj/structure/table/glass, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/suture, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -49644,7 +49644,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 }, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/radio/intercom/directional/east, /obj/machinery/light/cold/directional/north, diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 9fd655eda86..2a439748deb 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -16631,7 +16631,7 @@ dir = 1 }, /obj/structure/table, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/suture, /obj/item/stack/medical/mesh, /obj/machinery/power/apc/auto_name/directional/north, @@ -44593,7 +44593,7 @@ pixel_x = -4; pixel_y = 8 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = 8 }, /obj/item/reagent_containers/syringe, diff --git a/_maps/minigame/deathmatch/maint_mania.dmm b/_maps/minigame/deathmatch/maint_mania.dmm index 984da1f698c..db3742238d0 100644 --- a/_maps/minigame/deathmatch/maint_mania.dmm +++ b/_maps/minigame/deathmatch/maint_mania.dmm @@ -64,7 +64,7 @@ /turf/open/indestructible, /area/deathmatch) "jY" = ( -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ amount = 1 }, /turf/open/indestructible, diff --git a/_maps/minigame/deathmatch/sunrise.dmm b/_maps/minigame/deathmatch/sunrise.dmm index 756f9f668d1..8439b75b08d 100644 --- a/_maps/minigame/deathmatch/sunrise.dmm +++ b/_maps/minigame/deathmatch/sunrise.dmm @@ -272,7 +272,7 @@ "qu" = ( /obj/structure/table/wood, /obj/item/retractor, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = 4; pixel_y = 1 }, diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index 6b9fb38b134..301a1bcf2e0 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -875,7 +875,7 @@ /area/shuttle/escape) "lz" = ( /obj/structure/table/reinforced/rglass, -/obj/item/stack/medical/gauze/twelve{ +/obj/item/stack/medical/wrap/gauze/twelve{ pixel_x = -2; pixel_y = 6 }, diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm index c7690ad3832..31bbe51b2d4 100644 --- a/_maps/shuttles/emergency_lance.dmm +++ b/_maps/shuttles/emergency_lance.dmm @@ -92,7 +92,7 @@ "cM" = ( /obj/effect/turf_decal/bot_white, /obj/structure/rack, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment{ pixel_x = 5 diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index cdb6ce920cc..d821b680beb 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -980,7 +980,7 @@ /obj/effect/decal/cleanable/blood/old, /obj/item/reagent_containers/cup/glass/bottle/whiskey, /obj/item/reagent_containers/cup/bottle/ethanol, -/obj/item/stack/medical/gauze/improvised, +/obj/item/stack/medical/wrap/gauze/improvised, /obj/item/bot_assembly/medbot, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index b2fdab9a9a9..614fa2127ba 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -690,7 +690,7 @@ /area/shuttle/escape) "Ld" = ( /obj/structure/table, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 7b96165e014..7883827c9e5 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -1289,7 +1289,7 @@ /obj/effect/turf_decal/bot_white, /obj/structure/rack, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment{ pixel_x = 5 diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 296a65fe8bf..988b06f2c7f 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -378,7 +378,7 @@ /obj/item/storage/box/bodybags{ pixel_y = 6 }, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bruise_pack{ pixel_x = 6 }, diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 394fb3b91af..b1b00f10d57 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -290,7 +290,7 @@ /area/shuttle/syndicate/medical) "bu" = ( /obj/structure/table/reinforced, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, /obj/effect/turf_decal/tile/blue{ diff --git a/_maps/shuttles/infiltrator_clown.dmm b/_maps/shuttles/infiltrator_clown.dmm index 4b783ecf448..091e2efc6be 100644 --- a/_maps/shuttles/infiltrator_clown.dmm +++ b/_maps/shuttles/infiltrator_clown.dmm @@ -290,7 +290,7 @@ /area/shuttle/syndicate/medical) "bu" = ( /obj/structure/table/reinforced, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, /obj/effect/turf_decal/tile/blue{ diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship_birdshot.dmm index 8f64e40dbec..54fb35f123d 100644 --- a/_maps/shuttles/whiteship_birdshot.dmm +++ b/_maps/shuttles/whiteship_birdshot.dmm @@ -1038,7 +1038,7 @@ /obj/item/tank/internals/anesthetic{ pixel_x = -3 }, -/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/clothing/mask/breath/medical{ pixel_y = 3 }, diff --git a/_maps/templates/holodeck_medicalsim.dmm b/_maps/templates/holodeck_medicalsim.dmm index 269b9c41f01..11cb6662f49 100644 --- a/_maps/templates/holodeck_medicalsim.dmm +++ b/_maps/templates/holodeck_medicalsim.dmm @@ -112,7 +112,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/retractor, /obj/item/cautery, /turf/open/floor/holofloor{ diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index a909cc94c23..c851314e682 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -751,7 +751,7 @@ "RY" = ( /obj/item/cautery/alien, /obj/structure/closet/crate, -/obj/item/stack/sticky_tape/super, +/obj/item/stack/medical/wrap/sticky_tape/super, /obj/item/clothing/head/wizard/tape, /obj/item/bikehorn/golden{ pixel_x = -8; diff --git a/_maps/virtual_domains/heretic_hunt.dmm b/_maps/virtual_domains/heretic_hunt.dmm index ce7e20749d5..b7b84fbc39a 100644 --- a/_maps/virtual_domains/heretic_hunt.dmm +++ b/_maps/virtual_domains/heretic_hunt.dmm @@ -386,7 +386,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/item/stack/medical/gauze/improvised{ +/obj/item/stack/medical/wrap/gauze/improvised{ pixel_y = -2 }, /turf/open/floor/plating, @@ -573,7 +573,7 @@ /obj/machinery/defibrillator_mount/directional/west, /obj/structure/table/glass, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/stack/medical/gauze/improvised, +/obj/item/stack/medical/wrap/gauze/improvised, /obj/effect/turf_decal/siding/blue{ dir = 4 }, @@ -1112,7 +1112,7 @@ "NN" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/table/glass, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_y = 4 }, /obj/effect/turf_decal/siding/blue{ @@ -1152,7 +1152,7 @@ /obj/effect/turf_decal/siding/blue/end{ dir = 1 }, -/obj/item/stack/medical/gauze/improvised, +/obj/item/stack/medical/wrap/gauze/improvised, /obj/structure/cable, /turf/open/floor/plastic, /area/virtual_domain) diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index 07003db1aa5..31a65f790ab 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -3088,7 +3088,7 @@ pixel_y = 1; pixel_x = 18 }, -/obj/item/stack/medical/gauze{ +/obj/item/stack/medical/wrap/gauze{ pixel_x = -15; pixel_y = 10 }, diff --git a/_maps/virtual_domains/meta_central.dmm b/_maps/virtual_domains/meta_central.dmm index e7f6e003b35..003785055e6 100644 --- a/_maps/virtual_domains/meta_central.dmm +++ b/_maps/virtual_domains/meta_central.dmm @@ -3010,7 +3010,7 @@ "zg" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/table/glass, -/obj/item/stack/medical/gauze, +/obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/mesh, /obj/item/stack/medical/suture, /turf/open/floor/plating, diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index ffeff072f45..9bdc517a6ac 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -182,3 +182,9 @@ DEFINE_BITFIELD(surgery_state, list( #define UNCLAMPED_VESSELS_BLEEDING 1.5 /// How much blood is lost from clamped vessels or cut organs? #define CLAMPED_VESSELS_BLEEDING 0.2 + +// Limb item categories +/// Gauze slot, asserted to be wrap items +#define LIMB_ITEM_GAUZE "gauze" +/// Tourniquet slot +#define LIMB_ITEM_TOURNIQUET "tourniquet" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index a632a7dd222..b23710935a7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -32,9 +32,9 @@ ///from /obj/item/bodypart/proc/receive_damage, sent from the limb owner (limb, brute, burn) #define COMSIG_CARBON_LIMB_DAMAGED "carbon_limb_damaged" #define COMPONENT_PREVENT_LIMB_DAMAGE (1 << 0) -/// from /obj/item/bodypart/proc/apply_gauze(/obj/item/stack/gauze): (/obj/item/stack/medical/gauze/applied_gauze, /obj/item/stack/medical/gauze/stack_used) +/// from /obj/item/bodypart/proc/apply_gauze(/obj/item/stack/gauze): (/obj/item/stack/medical/wrap/gauze/applied_gauze, /obj/item/stack/medical/wrap/gauze/stack_used) #define COMSIG_BODYPART_GAUZED "bodypart_gauzed" -/// from /obj/item/stack/medical/gauze/Destroy(): (/obj/item/stack/medical/gauze/removed_gauze) +/// from /obj/item/stack/medical/wrap/gauze/Destroy(): (/obj/item/stack/medical/wrap/gauze/removed_gauze) #define COMSIG_BODYPART_UNGAUZED "bodypart_ungauzed" /// Called from bodypart changing owner, which could be on attach or detachment. Either argument can be null. (mob/living/carbon/new_owner, mob/living/carbon/old_owner) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index d666a93f0d6..14ff38bf3d0 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -639,6 +639,11 @@ /// Sent from /obj/item/mob_holder/purple_raptor/proc/toggle_wings() : (mob/living/carbon/human/user) #define COMSIG_RAPTOR_WINGS_CLOSED "raptor_wings_closed" +/// Sent from /obj/item/bodypart/limb/proc/apply_item(): (obj/item/bodypart/limb) +#define COMSIG_ITEM_APPLIED_TO_LIMB "item_applied_to_limb" +/// Sent from /obj/item/bodypart/limb/proc/Exited(): (obj/item/bodypart/limb) +#define COMSIG_ITEM_UNAPPLIED_FROM_LIMB "item_removed_from_limb" + /// Sent from /obj/effect/rune/convert/try_sacrifice_item(obj/effect/rune/convert/rune) #define COMSIG_ITEM_CULT_SACRIFICE "item_cult_sacrifice" #define COMPONENT_SACRIFICE_SUCCESSFUL (1<<0) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 638d1068b2c..5421fb971c7 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/grenade/smokebomb = 1, /obj/item/radio/off = 1, /obj/item/stack/spacecash/c10 = 1, - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, /obj/item/tank/internals/emergency_oxygen = 1, /obj/item/paper/paperslip/fishing_tip = 1, @@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items list(//medical and chemicals list(//basic healing items - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/stack/medical/mesh = 1, /obj/item/stack/medical/suture = 1, /obj/item/stack/medical/bandage = 1, diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index f5aa18b8f25..dfc12eef865 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -18,7 +18,7 @@ result = /obj/item/shield/improvised reqs = list( /obj/item/stack/sheet/iron = 10, - /obj/item/stack/sticky_tape = 2, + /obj/item/stack/medical/wrap/sticky_tape = 2, ) time = 4 SECONDS category = CAT_EQUIPMENT @@ -249,7 +249,7 @@ name = "Improvised Gripper Gloves" reqs = list( /obj/item/clothing/gloves/fingerless = 1, - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, ) result = /obj/item/clothing/gloves/tackler/offbrand category = CAT_EQUIPMENT diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 86cf1d3b151..57139147fd8 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -25,7 +25,7 @@ result = /obj/item/weaponcrafting/receiver reqs = list( /obj/item/stack/sheet/iron = 5, - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, /obj/item/screwdriver = 1, /obj/item/assembly/mousetrap = 1, ) @@ -38,7 +38,7 @@ result = /obj/item/weaponcrafting/stock reqs = list( /obj/item/stack/sheet/mineral/wood = 8, - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, ) time = 5 SECONDS category = CAT_WEAPON_RANGED @@ -49,7 +49,7 @@ result = /obj/item/gun_maintenance_supplies/makeshift reqs = list( /obj/item/stack/sheet/iron = 5, - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, /obj/item/pipe = 1, /obj/item/stack/sheet/cloth = 2, ) @@ -195,7 +195,7 @@ /obj/item/pipe = 2, /obj/item/weaponcrafting/stock = 1, /obj/item/storage/toolbox = 1, // for the screws - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, ) tool_behaviors = list(TOOL_SCREWDRIVER) time = 5 SECONDS @@ -210,7 +210,7 @@ /obj/item/stock_parts/servo = 2, /obj/item/stack/sheet/mineral/wood = 4, /obj/item/storage/toolbox = 1, // for the screws - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, ) tool_paths = list(/obj/item/hatchet) tool_behaviors = list(TOOL_SCREWDRIVER) diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 8dd96407a2b..c41659c64a8 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -505,7 +505,7 @@ result = /obj/item/clothing/suit/pillow_suit time = 2 SECONDS reqs = list( - /obj/item/stack/sticky_tape = 10, + /obj/item/stack/medical/wrap/sticky_tape = 10, /obj/item/pillow = 5, ) category = CAT_CLOTHING @@ -516,7 +516,7 @@ tool_behaviors = list(TOOL_WIRECUTTER, TOOL_KNIFE) time = 2 SECONDS reqs = list( - /obj/item/stack/sticky_tape = 5, + /obj/item/stack/medical/wrap/sticky_tape = 5, /obj/item/pillow = 1, ) category = CAT_CLOTHING diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm index 7cf73e9421a..29ea7a60010 100644 --- a/code/datums/components/crafting/tools.dm +++ b/code/datums/components/crafting/tools.dm @@ -43,7 +43,7 @@ reqs = list( /obj/item/crowbar = 1, /obj/item/knife = 1, - /obj/item/stack/sticky_tape = 1, + /obj/item/stack/medical/wrap/sticky_tape = 1, ) result = /obj/item/pickaxe/improvised category = CAT_TOOLS @@ -142,4 +142,3 @@ crafting_flags = CRAFT_SKIP_MATERIALS_PARITY tool_behaviors = list(TOOL_SCREWDRIVER) category = CAT_TOOLS - diff --git a/code/datums/components/limb_applicable.dm b/code/datums/components/limb_applicable.dm new file mode 100644 index 00000000000..006b2f91ff5 --- /dev/null +++ b/code/datums/components/limb_applicable.dm @@ -0,0 +1,97 @@ +/** + * ## Limb Applicable + * + * Allows item to be attached to limbs by clicking on humans with them while limb targeting + * + * The item then goes in the limb's contents, where it will be added to the limb's applied_items list + * The applied_items is indexed by category so you can easily check for the presence of a given item or category of item + */ +/datum/component/limb_applicable + /// List of body zones we can apply parent to + var/list/valid_zones + /// Category that the parent is applied to + /// Defaults to REF(parent), ie, you can apply any number of this item to a limb + /// Setting it to a category will prevent multiple items of that category being applied unless override_existing is TRUE + var/apply_category + /// If TRUE, replaces existing items with new ones + /// If FALSE, application will fail if an item of the same category is already applied + var/override_existing + /// Callback to determine if parent can be applied. (Return FALSE to block application) + var/datum/callback/can_apply + /// Callback invoked after application + var/datum/callback/on_apply + +/datum/component/limb_applicable/Initialize( + list/valid_zones = GLOB.all_body_zones.Copy(), + apply_category, + override_existing = TRUE, + datum/callback/can_apply, + datum/callback/on_apply, +) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.valid_zones = valid_zones + src.apply_category = apply_category || REF(parent) + src.override_existing = override_existing + src.can_apply = can_apply + src.on_apply = on_apply + + +/datum/component/limb_applicable/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(on_apply)) + RegisterSignal(parent, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(add_context)) + + var/obj/item/applying_item = parent + applying_item.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + +/datum/component/limb_applicable/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ITEM_INTERACTING_WITH_ATOM) + UnregisterSignal(parent, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET) + +/datum/component/limb_applicable/proc/add_context(obj/item/source, list/context, atom/target, mob/living/user) + if(isliving(target)) + context[SCREENTIP_CONTEXT_LMB] = "Apply [source.name]" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/datum/component/limb_applicable/proc/on_apply(datum/source, mob/user, atom/interacting_with) + SIGNAL_HANDLER + + if(!isliving(interacting_with)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(on_apply_async), user, interacting_with) + return ITEM_INTERACT_BLOCKING + +/datum/component/limb_applicable/proc/on_apply_async(mob/user, atom/interacting_with) + var/mob/living/target = interacting_with + var/obj/item/bodypart/applying_to = target.get_bodypart(deprecise_zone(user.zone_selected)) + if(isnull(applying_to)) + target.balloon_alert(user, "no bodypart!") + return + + if(!(applying_to.body_zone in src.valid_zones)) + target.balloon_alert(user, "can't be applied there!") + return + + if(!override_existing) + var/obj/item/existing = LAZYACCESS(applying_to.applied_items, apply_category) + if(!isnull(existing)) + target.balloon_alert(user, "something is already there!") + return + + if(can_apply && !can_apply.Invoke(user, target, applying_to)) + return + + var/obj/item/applying = parent + if(isstack(parent)) + var/obj/item/stack/stack_parent = parent + applying = stack_parent.split_stack(1) + + else if(!user.temporarilyRemoveItemFromInventory(applying)) + target.balloon_alert(user, "can't part with [applying.name]!") + return + + applying_to.apply_item(applying, apply_category, override_existing) + on_apply?.Invoke(user, target, applying_to) diff --git a/code/datums/storage/subtypes/belts.dm b/code/datums/storage/subtypes/belts.dm index 763131eb98e..5bd5c9fbfa8 100644 --- a/code/datums/storage/subtypes/belts.dm +++ b/code/datums/storage/subtypes/belts.dm @@ -61,7 +61,7 @@ /obj/item/scalpel, /obj/item/shears, /obj/item/stack/medical, - /obj/item/stack/sticky_tape, //surgical tape + /obj/item/stack/medical/wrap/sticky_tape, //surgical tape /obj/item/stamp, /obj/item/sensor_device, /obj/item/storage/fancy/cigarettes, diff --git a/code/datums/storage/subtypes/medkits.dm b/code/datums/storage/subtypes/medkits.dm index 28e8208c18c..e0f13da8bb2 100644 --- a/code/datums/storage/subtypes/medkits.dm +++ b/code/datums/storage/subtypes/medkits.dm @@ -30,7 +30,7 @@ //stacks /obj/item/stack/medical, - /obj/item/stack/sticky_tape, + /obj/item/stack/medical/wrap/sticky_tape, //containers /obj/item/reagent_containers/applicator, diff --git a/code/datums/storage/subtypes/others/misc.dm b/code/datums/storage/subtypes/others/misc.dm index 1b1011b769d..2ef02380fa1 100644 --- a/code/datums/storage/subtypes/others/misc.dm +++ b/code/datums/storage/subtypes/others/misc.dm @@ -34,7 +34,7 @@ /obj/item/scalpel, /obj/item/shears, /obj/item/stack/medical/bone_gel, - /obj/item/stack/sticky_tape/surgical, + /obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/surgical_drapes, /obj/item/surgicaldrill, /obj/item/blood_scanner, diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index bed3a0b019c..f6a0f0abaeb 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -299,7 +299,7 @@ . = limb if(limb) // if we're nulling limb, we're basically detaching from it, so we should remove ourselves in that case - UnregisterSignal(limb, list(COMSIG_QDELETING, COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_UNGAUZED, COMSIG_BODYPART_UPDATING_SURGERY_STATE)) + UnregisterSignal(limb, COMSIG_BODYPART_UPDATING_SURGERY_STATE) LAZYREMOVE(limb.wounds, src) if (!destroying) limb.update_wounds(replaced) @@ -314,7 +314,6 @@ if (limb) RegisterSignal(limb, COMSIG_QDELETING, PROC_REF(source_died)) - RegisterSignals(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_UNGAUZED), PROC_REF(gauze_state_changed)) if (disabling) limb.add_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) @@ -452,31 +451,23 @@ return 0 -/// Signal proc for if gauze has been applied or removed from our limb. -/datum/wound/proc/gauze_state_changed() - SIGNAL_HANDLER - - if (wound_flags & ACCEPTS_GAUZE) - update_inefficiencies() - /// Updates our limping and interaction penalties in accordance with our gauze. /datum/wound/proc/update_inefficiencies(replaced_or_replacing = FALSE) + SHOULD_NOT_SLEEP(TRUE) + if (wound_flags & ACCEPTS_GAUZE) + var/splint_factor = limb.get_splint_factor() if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(limb.current_gauze?.splint_factor) - limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor - limp_chance = initial(limp_chance) * limb.current_gauze.splint_factor - else - limp_slowdown = initial(limp_slowdown) - limp_chance = initial(limp_chance) + limp_slowdown = initial(limp_slowdown) * splint_factor + limp_chance = initial(limp_chance) * splint_factor else if(limb.body_zone in GLOB.arm_zones) - if(limb.current_gauze?.splint_factor) - set_interaction_efficiency_penalty(1 + ((get_effective_actionspeed_modifier()) * limb.current_gauze.splint_factor)) + if(splint_factor < 1) + set_interaction_efficiency_penalty(1 + (get_effective_actionspeed_modifier() * splint_factor)) else set_interaction_efficiency_penalty(initial(interaction_efficiency_penalty)) if(initial(disabling)) - set_disabling(isnull(limb.current_gauze)) + set_disabling(splint_factor < 1) limb.update_wounds(replaced_or_replacing) @@ -655,9 +646,10 @@ /datum/wound/proc/get_wound_description(mob/user) var/desc - if ((wound_flags & ACCEPTS_GAUZE) && limb.current_gauze) + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if ((wound_flags & ACCEPTS_GAUZE) && current_gauze) var/sling_condition = get_gauze_condition() - desc = "[victim.p_Their()] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [limb.current_gauze.name]" + desc = "[victim.p_Their()] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [current_gauze.name]" else desc = "[victim.p_Their()] [limb.plaintext_zone] [examine_desc]" @@ -695,10 +687,11 @@ /datum/wound/proc/get_gauze_condition() SHOULD_BE_PURE(TRUE) - if (!limb.current_gauze) + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if (!current_gauze) return null - switch(limb.current_gauze.absorption_capacity) + switch(current_gauze.absorption_capacity) if(0 to 1.25) return "just barely" if(1.25 to 2.75) diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index a2307a927d5..f6ba5f3acb9 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -163,7 +163,7 @@ victim.apply_damage(rand(1, 3) * (severity - 1) * gun.weapon_weight, BRUTE, limb, wound_bonus = CANT_WOUND, wound_clothing = FALSE) if(!HAS_TRAIT(victim, TRAIT_ANALGESIA)) - bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += (15 * severity * (limb.current_gauze?.splint_factor || 1)) + bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += (15 * severity * limb.get_splint_factor()) /datum/wound/blunt/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus) if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE || !victim.can_bleed()) @@ -202,7 +202,8 @@ /datum/wound/blunt/bone/modify_desc_before_span(desc) . = ..() - if (!limb.current_gauze) + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if (!current_gauze) if(taped) . += ", [span_notice("and appears to be reforming itself under some surgical tape!")]" else if(gelled) @@ -381,7 +382,7 @@ limp_slowdown = 6 limp_chance = 60 series_threshold_penalty = 30 - treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) + treatable_by = list(/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) status_effect_type = /datum/status_effect/wound/blunt/bone/severe scar_keyword = "bluntsevere" brain_trauma_group = BRAIN_TRAUMA_MILD @@ -422,7 +423,7 @@ sound_effect = 'sound/effects/wounds/crack2.ogg' threshold_penalty = 15 disabling = TRUE - treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) + treatable_by = list(/obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) status_effect_type = /datum/status_effect/wound/blunt/bone/critical scar_keyword = "bluntcritical" brain_trauma_group = BRAIN_TRAUMA_SEVERE @@ -509,7 +510,7 @@ return TRUE /// if someone is using surgical tape on our wound -/datum/wound/blunt/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) +/datum/wound/blunt/bone/proc/tape(obj/item/stack/medical/wrap/sticky_tape/surgical/I, mob/user) if(!gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] must be coated with bone gel to perform this emergency operation!")) return TRUE @@ -543,7 +544,7 @@ /datum/wound/blunt/bone/treat(obj/item/tool, mob/user) if(istype(tool, /obj/item/stack/medical/bone_gel)) gel(tool, user) - if(istype(tool, /obj/item/stack/sticky_tape/surgical)) + if(istype(tool, /obj/item/stack/medical/wrap/sticky_tape/surgical)) tape(tool, user) /datum/wound/blunt/bone/get_scanner_description(mob/user) diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 7877f1b955c..e6a83b85690 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -58,11 +58,13 @@ sanitization = max(sanitization - 0.15, 0) if(infection_rate <= 0.15 && prob(50)) infection_rate += 0.001 - if(limb.current_gauze) + + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if(current_gauze) limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE * seconds_per_tick) if(flesh_healing > 0) // good bandages multiply the length of flesh healing - var/bandage_factor = limb.current_gauze?.burn_cleanliness_bonus || 1 + var/bandage_factor = current_gauze?.burn_cleanliness_bonus || 1 flesh_damage = max(flesh_damage - (0.5 * seconds_per_tick), 0) flesh_healing = max(flesh_healing - (0.5 * bandage_factor * seconds_per_tick), 0) // good bandages multiply the length of flesh healing @@ -78,7 +80,7 @@ // sanitization is checked after the clearing check but before the actual ill-effects, because we freeze the effects of infection while we have sanitization if(sanitization > 0) - var/bandage_factor = limb.current_gauze?.burn_cleanliness_bonus || 1 + var/bandage_factor = current_gauze?.burn_cleanliness_bonus || 1 infection = max(infection - (WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) sanitization = max(sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor * seconds_per_tick), 0) return @@ -151,9 +153,10 @@ return span_deadsay("[victim.p_Their()] [limb.plaintext_zone] has locked up completely and is non-functional.") var/list/condition = list("[victim.p_Their()] [limb.plaintext_zone] [examine_desc]") - if(limb.current_gauze) + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if(current_gauze) var/bandage_condition - switch(limb.current_gauze.absorption_capacity) + switch(current_gauze.absorption_capacity) if(0 to 1.25) bandage_condition = "nearly ruined" if(1.25 to 2.75) @@ -163,7 +166,7 @@ if(4 to INFINITY) bandage_condition = "clean" - condition += " underneath a dressing of [bandage_condition] [limb.current_gauze.name]." + condition += " underneath a dressing of [bandage_condition] [current_gauze.name]." else switch(infection) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index 953dfcdac2f..a55bf97c2ce 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -54,9 +54,7 @@ /datum/wound/pierce/bleed/receive_damage(wounding_type, wounding_dmg, wound_bonus) if(victim.stat == DEAD || (wounding_dmg < 5) || !limb.can_bleed() || !victim.get_blood_volume() || !prob(internal_bleeding_chance + wounding_dmg)) return - if(limb.current_gauze?.splint_factor) - wounding_dmg *= (1 - limb.current_gauze.splint_factor) - var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit + var/blood_bled = rand(1, limb.get_splint_factor() * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit switch(blood_bled) if(1 to 6) victim.bleed(blood_bled, TRUE) @@ -91,7 +89,7 @@ return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOOD_FOUNTAIN)) return BLOOD_FLOW_INCREASING - if(limb.current_gauze || clot_rate > 0) + if(LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) || clot_rate > 0) return BLOOD_FLOW_DECREASING if(clot_rate < 0) return BLOOD_FLOW_INCREASING @@ -114,12 +112,11 @@ adjust_blood_flow(0.25 * seconds_per_tick) // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first //gauze always reduces blood flow, even for non bleeders - if(limb.current_gauze) - if(clot_rate > 0) - adjust_blood_flow(-clot_rate * seconds_per_tick) - var/gauze_power = limb.current_gauze.absorption_rate + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if(current_gauze) + var/gauze_power = current_gauze.absorption_rate limb.seep_gauze(gauze_power * seconds_per_tick) - adjust_blood_flow(-gauze_power * gauzed_clot_rate * seconds_per_tick) + adjust_blood_flow((-clot_rate * seconds_per_tick) + (-gauze_power * gauzed_clot_rate * seconds_per_tick)) //otherwise, only clot if it's a bleeder else if(limb.can_bleed()) adjust_blood_flow(-clot_rate * seconds_per_tick) diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 3e43a1081d0..d7c5392e93b 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -94,12 +94,13 @@ return ..() /datum/wound/slash/flesh/get_wound_description(mob/user) - if(!limb.current_gauze) + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if(!current_gauze) return ..() var/list/msg = list("The cuts on [victim.p_their()] [limb.plaintext_zone] are wrapped with ") // how much life we have left in these bandages - switch(limb.current_gauze.absorption_capacity) + switch(current_gauze.absorption_capacity) if(0 to 1.25) msg += "nearly ruined" if(1.25 to 2.75) @@ -108,7 +109,7 @@ msg += "slightly bloodied" if(4 to INFINITY) msg += "clean" - msg += " [limb.current_gauze.name]!" + msg += " [current_gauze.name]!" return "[msg.Join()]" @@ -126,9 +127,8 @@ // compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile var/bleed_amt = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course. - if(limb.current_gauze) // gauze stops all bleeding from dragging on this limb, but wears the gauze out quicker - limb.seep_gauze(bleed_amt * 0.33) - return + if(limb.seep_gauze(bleed_amt * 0.33)) // gauze stops all bleeding from dragging on this limb, but wears the gauze out quicker + return 0 return bleed_amt @@ -138,7 +138,7 @@ return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOOD_FOUNTAIN)) return BLOOD_FLOW_INCREASING - if(limb.current_gauze || clot_rate > 0) + if(LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) || clot_rate > 0) return BLOOD_FLOW_DECREASING if(clot_rate < 0) return BLOOD_FLOW_INCREASING @@ -157,8 +157,9 @@ if(HAS_TRAIT(victim, TRAIT_BLOOD_FOUNTAIN)) adjust_blood_flow(0.25) // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first - if(limb.current_gauze) - var/gauze_power = limb.current_gauze.absorption_rate + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if(current_gauze) + var/gauze_power = current_gauze.absorption_rate limb.seep_gauze(gauze_power * seconds_per_tick) adjust_blood_flow(-gauze_power * seconds_per_tick) diff --git a/code/game/machinery/wall_healer.dm b/code/game/machinery/wall_healer.dm index 513faebd37b..4789b59d390 100644 --- a/code/game/machinery/wall_healer.dm +++ b/code/game/machinery/wall_healer.dm @@ -12,7 +12,7 @@ armor_type = /datum/armor/obj_machinery/wall_healer /// Cost per bandage dispensed. Note, always disregarded on red alert. - var/per_bandage_cost = (/obj/item/stack/medical/gauze::custom_price) / (/obj/item/stack/medical/gauze::amount) + var/per_bandage_cost = (/obj/item/stack/medical/wrap/gauze::custom_price) / (/obj/item/stack/medical/wrap/gauze::amount) /// Number of bandages to dispense on rmb. Never recharges but can be restocked. var/num_bandages = 5 /// Lazylist of bandages that have been restocked into the wall healer. @@ -82,7 +82,7 @@ context[SCREENTIP_CONTEXT_LMB] = "Heal self" context[SCREENTIP_CONTEXT_RMB] = "Get gauze" return CONTEXTUAL_SCREENTIP_SET - if(istype(held_item, /obj/item/stack/medical/gauze)) + if(istype(held_item, /obj/item/stack/medical/wrap/gauze)) context[SCREENTIP_CONTEXT_LMB] = "Restock" return CONTEXTUAL_SCREENTIP_SET @@ -335,7 +335,7 @@ to_chat(user, span_warning("You try to retrieve some gauze, but it gets all jammed up in the access port.")) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - var/obj/item/stack/medical/gauze/bandage = LAZYACCESS(stocked_bandages, 1) + var/obj/item/stack/medical/wrap/gauze/bandage = LAZYACCESS(stocked_bandages, 1) if(isnull(bandage)) num_bandages-- bandage = new(user.drop_location(), 1) @@ -352,12 +352,12 @@ /obj/machinery/wall_healer/on_deconstruction(disassembled) var/atom/drop_loc = drop_location() - for(var/obj/item/stack/medical/gauze/bandage as anything in stocked_bandages) + for(var/obj/item/stack/medical/wrap/gauze/bandage as anything in stocked_bandages) bandage.forceMove(drop_loc) - new /obj/item/stack/medical/gauze(drop_loc, num_bandages) + new /obj/item/stack/medical/wrap/gauze(drop_loc, num_bandages) /obj/machinery/wall_healer/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(!istype(tool, /obj/item/stack/medical/gauze)) + if(!istype(tool, /obj/item/stack/medical/wrap/gauze)) return NONE if(!user.temporarilyRemoveItemFromInventory(tool)) to_chat(user, span_warning("You try to restock [src] with [tool], but it seems stuck to your hand.")) @@ -369,9 +369,9 @@ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, vision_distance = 5, ) - var/obj/item/stack/medical/gauze/bandage = tool + var/obj/item/stack/medical/wrap/gauze/bandage = tool while(bandage.amount > 1) - var/obj/item/stack/medical/gauze/split_bandage = bandage.split_stack(1) + var/obj/item/stack/medical/wrap/gauze/split_bandage = bandage.split_stack(1) LAZYADD(stocked_bandages, split_bandage) split_bandage.forceMove(src) LAZYADD(stocked_bandages, bandage) diff --git a/code/game/objects/effects/decals/turfdecal/weakpoint.dm b/code/game/objects/effects/decals/turfdecal/weakpoint.dm index c982cb60a92..47749187b0f 100644 --- a/code/game/objects/effects/decals/turfdecal/weakpoint.dm +++ b/code/game/objects/effects/decals/turfdecal/weakpoint.dm @@ -67,8 +67,8 @@ return ITEM_INTERACT_SUCCESS /obj/effect/weakpoint/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(istype(tool, /obj/item/stack/sticky_tape)) - var/obj/item/stack/sticky_tape/duct_tape = tool + if(istype(tool, /obj/item/stack/medical/wrap/sticky_tape)) + var/obj/item/stack/medical/wrap/sticky_tape/duct_tape = tool if(!duct_tape.use(1)) return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("\The [src] is sealed with a little elbow grease and a mound of [duct_tape].")) diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm index 2998e9dc670..57b180a02b4 100644 --- a/code/game/objects/effects/spawners/random/medical.dm +++ b/code/game/objects/effects/spawners/random/medical.dm @@ -8,7 +8,7 @@ loot = list( /obj/item/stack/medical/suture, /obj/item/stack/medical/mesh, - /obj/item/stack/medical/gauze, + /obj/item/stack/medical/wrap/gauze, ) /obj/effect/spawner/random/medical/injector diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index f8900240563..d244efb3ad4 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -16,7 +16,22 @@ cost = 250 source = /datum/robot_energy_storage/medical merge_type = /obj/item/stack/medical - apply_verb = "treating" + + /// Verb used when applying this object to someone + var/apply_verb = "applying" + /// If set and this used as a splint for a broken bone wound, + /// This is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) + var/splint_factor + /// Like splint_factor but for burns instead of bone wounds. This is a multiplier used to speed up burn recoveries + var/burn_cleanliness_bonus + /// How much blood flow this stack can absorb if used as a bandage on a cut wound. + /// note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up + var/absorption_capacity + /// How quickly we lower the blood flow on a cut wound we're bandaging. + /// Expected lifetime of this bandage in seconds is thus absorption_capacity/absorption_rate, + /// or until the cut heals, whichever comes first + var/absorption_rate + /// How long it takes to apply it to yourself var/self_delay = 5 SECONDS /// How long it takes to apply it to someone else @@ -369,12 +384,113 @@ user.visible_message(span_suicide("[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS -/obj/item/stack/medical/gauze - name = "medical gauze" - desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones. " +/obj/item/stack/medical/wrap + name = "wrap" + desc = "Something you can wrap around someone, like a hug." gender = PLURAL - singular_name = "medical gauze" icon_state = "gauze" + apply_verb = "wrapping" + works_on_dead = TRUE + +/obj/item/stack/medical/wrap/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) + . = ..() + AddComponent( \ + /datum/component/limb_applicable, \ + apply_category = LIMB_ITEM_GAUZE, \ + override_existing = TRUE, \ + can_apply = CALLBACK(src, PROC_REF(can_gauze_limb)), \ + on_apply = CALLBACK(src, PROC_REF(on_gauze_limb)), \ + ) + RegisterSignals(src, list(COMSIG_ITEM_APPLIED_TO_LIMB, COMSIG_ITEM_UNAPPLIED_FROM_LIMB), PROC_REF(update_wounds)) + +/obj/item/stack/medical/wrap/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + return NONE // uses component + +#define LACKS_WOUND 0 +#define HAS_WOUND 1 +#define HAS_SCANNED_WOUND 2 + +/// Callback for limb applicability component +/obj/item/stack/medical/wrap/proc/can_gauze_limb(mob/user, mob/living/patient, obj/item/bodypart/limb) + var/wound_tracker = LACKS_WOUND + for(var/datum/wound/woundies as anything in limb.wounds) + if(!(woundies.wound_flags & ACCEPTS_GAUZE)) + continue + if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED)) + wound_tracker = HAS_SCANNED_WOUND + break + wound_tracker = HAS_WOUND + + if(wound_tracker == LACKS_WOUND) + patient.balloon_alert(user, LAZYLEN(limb.wounds) ? "can't gauze!" : "no wounds!") + return FALSE + + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(limb.applied_items, LIMB_ITEM_GAUZE) + if(current_gauze && (current_gauze.absorption_capacity * 1.2 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row + patient.balloon_alert(user, pick("already bandaged!", "bandage is clean!")) // good enough + return FALSE + + var/treatment_delay = (user == patient ? self_delay : other_delay) + if(wound_tracker == HAS_SCANNED_WOUND) + treatment_delay *= 0.5 + if(user == patient) + user.visible_message( + span_warning("[user] begins expertly wrapping the wounds on [p_their()]'s [limb.plaintext_zone] with [src]..."), + span_warning("You begin quickly wrapping the wounds on your [limb.plaintext_zone] with [src], keeping the holo-image indications in mind..."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + user.visible_message( + span_warning("[user] begins expertly wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), + span_warning("You begin quickly wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src], keeping the holo-image indications in mind..."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + else + user.visible_message( + span_warning("[user] begins wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), + span_warning("You begin wrapping the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]..."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + if(heal_begin_sound) + playsound(src, heal_begin_sound, 75, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) + + if(!do_after(user, treatment_delay, patient)) + return FALSE + + if(heal_end_sound) + playsound(patient, heal_end_sound, 75, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) + return TRUE + +/// Callback for limb applicability component +/obj/item/stack/medical/wrap/proc/on_gauze_limb(mob/user, mob/living/patient, obj/item/bodypart/limb) + patient.balloon_alert(user, "wrapped [limb.plaintext_zone]") + user.visible_message( + span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone]."), + span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone]."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + if(limb.cached_bleed_rate) + add_mob_blood(patient) + // Dressing burns provides a "one-time" bonus to sanitization and healing + // However, any notable infection will reduce the effectiveness of this bonus + for(var/datum/wound/burn/flesh/wound in limb.wounds) + wound.sanitization += sanitization * (wound.infection > 0.1 ? 0.2 : 1) + wound.flesh_healing += flesh_regeneration * (wound.infection > 0.1 ? 0 : 1) + +/// Used via signal to update wounds +/obj/item/stack/medical/wrap/proc/update_wounds(datum/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + for(var/datum/wound/gauzed as anything in limb.wounds) + gauzed.update_inefficiencies() + +#undef LACKS_WOUND +#undef HAS_WOUND +#undef HAS_SCANNED_WOUND + +/obj/item/stack/medical/wrap/gauze + name = "medical gauze" + desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones." + singular_name = "medical gauze" self_delay = 5 SECONDS other_delay = 2 SECONDS max_amount = 12 @@ -386,37 +502,16 @@ flesh_regeneration = 5 splint_factor = 0.7 burn_cleanliness_bonus = 0.35 - merge_type = /obj/item/stack/medical/gauze - apply_verb = "wrapping" - works_on_dead = TRUE - var/obj/item/bodypart/gauzed_bodypart + merge_type = /obj/item/stack/medical/wrap/gauze heal_end_sound = SFX_BANDAGE_END heal_begin_sound = SFX_BANDAGE_BEGIN drop_sound = SFX_CLOTH_DROP pickup_sound = SFX_CLOTH_PICKUP -/obj/item/stack/medical/gauze/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) - . = ..() - register_context() - -/obj/item/stack/medical/gauze/grind_results() +/obj/item/stack/medical/wrap/gauze/grind_results() return list(/datum/reagent/cellulose = 2) -/obj/item/stack/medical/gauze/Destroy(force) - . = ..() - - if (gauzed_bodypart) - gauzed_bodypart.current_gauze = null - SEND_SIGNAL(gauzed_bodypart, COMSIG_BODYPART_UNGAUZED, src) - gauzed_bodypart = null - -/obj/item/stack/medical/gauze/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) - if(iscarbon(target)) - context[SCREENTIP_CONTEXT_LMB] = "Apply Gauze" - return CONTEXTUAL_SCREENTIP_SET - return NONE - -/obj/item/stack/medical/gauze/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) +/obj/item/stack/medical/wrap/gauze/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() if(isnull(held_item)) return @@ -424,111 +519,33 @@ context[SCREENTIP_CONTEXT_LMB] = "Shred Into Cloth" return CONTEXTUAL_SCREENTIP_SET -/obj/item/stack/medical/gauze/try_heal_checks(mob/living/patient, mob/living/user, healed_zone, silent = FALSE) - var/obj/item/bodypart/limb = patient.get_bodypart(healed_zone) - if(isnull(limb)) - if(!silent) - patient.balloon_alert(user, "no [parse_zone(healed_zone)]!") - return FALSE - if(!LAZYLEN(limb.wounds)) - if(!silent) - patient.balloon_alert(user, "no wounds!") // good problem to have imo - return FALSE - if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 1.2 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row - if(!silent) - patient.balloon_alert(user, pick("already bandaged!", "bandage is clean!")) // good enough - return FALSE - for(var/datum/wound/woundies as anything in limb.wounds) - if(woundies.wound_flags & ACCEPTS_GAUZE) - return TRUE - if(!silent) - patient.balloon_alert(user, "can't gauze!") - return FALSE - -// gauze is only relevant for wounds, which are handled in the wounds themselves -/obj/item/stack/medical/gauze/try_heal(mob/living/patient, mob/living/user, healed_zone, silent, auto_change_zone, continuous) - var/obj/item/bodypart/limb = patient.get_bodypart(healed_zone) - var/treatment_delay = (user == patient ? self_delay : other_delay) - var/any_scanned = FALSE - for(var/datum/wound/woundies as anything in limb.wounds) - if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED)) - any_scanned = TRUE - break - - if(any_scanned) - treatment_delay *= 0.5 - if(user == patient) - if(!silent) - user.visible_message( - span_warning("[user] begins expertly wrapping the wounds on [p_their()]'s [limb.plaintext_zone] with [src]..."), - span_warning("You begin quickly wrapping the wounds on your [limb.plaintext_zone] with [src], keeping the holo-image indications in mind..."), - visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, - ) - else - if(!silent) - user.visible_message( - span_warning("[user] begins expertly wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), - span_warning("You begin quickly wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src], keeping the holo-image indications in mind..."), - visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, - ) - else - if(!silent) - user.visible_message( - span_warning("[user] begins wrapping the wounds on [patient]'s [limb.plaintext_zone] with [src]..."), - span_warning("You begin wrapping the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]..."), - visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, - ) - playsound(src, heal_begin_sound, 75, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) - - if(!do_after(user, treatment_delay, target = patient)) - return - - if(!silent) - patient.balloon_alert(user, "wrapped [parse_zone(healed_zone)]") - user.visible_message( - span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone]."), - span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone]."), - visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, - ) - if(heal_end_sound) - playsound(patient, heal_end_sound, 75, TRUE, MEDIUM_RANGE_SOUND_EXTRARANGE) - - if(limb.cached_bleed_rate) - add_mob_blood(patient) - - // Dressing burns provides a "one-time" bonus to sanitization and healing - // However, any notable infection will reduce the effectiveness of this bonus - for(var/datum/wound/burn/flesh/wound in limb.wounds) - wound.sanitization += sanitization * (wound.infection > 0.1 ? 0.2 : 1) - wound.flesh_healing += flesh_regeneration * (wound.infection > 0.1 ? 0 : 1) - - limb.apply_gauze(src) - -/obj/item/stack/medical/gauze/twelve +/obj/item/stack/medical/wrap/gauze/twelve amount = 12 -/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) +/obj/item/stack/medical/wrap/gauze/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(tool.tool_behaviour == TOOL_WIRECUTTER || tool.get_sharpness()) if(get_amount() < 2) balloon_alert(user, "not enough gauze!") - return - new /obj/item/stack/sheet/cloth(I.drop_location()) + return ITEM_INTERACT_BLOCKING + new /obj/item/stack/sheet/cloth(tool.drop_location()) if(IsReachableBy(user)) - user.visible_message(span_notice("[user] cuts [src] into pieces of cloth with [I]."), \ - span_notice("You cut [src] into pieces of cloth with [I]."), \ + user.visible_message(span_notice("[user] cuts [src] into pieces of cloth with [tool]."), \ + span_notice("You cut [src] into pieces of cloth with [tool]."), \ span_hear("You hear cutting.")) else //telekinesis - visible_message(span_notice("[I] cuts [src] into pieces of cloth."), \ + visible_message(span_notice("[tool] cuts [src] into pieces of cloth."), \ blind_message = span_hear("You hear cutting.")) use(2) - else - return ..() + return ITEM_INTERACT_SUCCESS -/obj/item/stack/medical/gauze/suicide_act(mob/living/user) + return NONE + + +/obj/item/stack/medical/wrap/gauze/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] begins tightening [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!")) return OXYLOSS -/obj/item/stack/medical/gauze/improvised +/obj/item/stack/medical/wrap/gauze/improvised name = "improvised gauze" singular_name = "improvised gauze" desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze." @@ -541,7 +558,7 @@ absorption_capacity = 4 sanitization = 1 flesh_regeneration = 3 - merge_type = /obj/item/stack/medical/gauze/improvised + merge_type = /obj/item/stack/medical/wrap/gauze/improvised /* The idea is for the following medical devices to work like a hybrid of the old brute packs and tend wounds, diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 73e3fdd8b65..f231a69cc35 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -531,7 +531,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("science bag", /obj/item/storage/bag/xeno, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6, crafting_flags = NONE, category = CAT_TOOLS), \ + new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/wrap/gauze/improvised, 1, 2, 6, crafting_flags = NONE, category = CAT_TOOLS), \ new/datum/stack_recipe("rag", /obj/item/rag, 1, crafting_flags = NONE, category = CAT_CHEMISTRY), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3, crafting_flags = NONE, category = CAT_FURNITURE), \ new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6, crafting_flags = NONE, category = CAT_FURNITURE), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 51a224e8d60..cefc8aa6fa2 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -58,21 +58,6 @@ // They're here instead of /stack/medical // because sticky tape can be used as a makeshift bandage or splint - /// Verb used when applying this object to someone - var/apply_verb = "applying" - /// If set and this used as a splint for a broken bone wound, - /// This is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) - var/splint_factor - /// Like splint_factor but for burns instead of bone wounds. This is a multiplier used to speed up burn recoveries - var/burn_cleanliness_bonus - /// How much blood flow this stack can absorb if used as a bandage on a cut wound. - /// note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up - var/absorption_capacity - /// How quickly we lower the blood flow on a cut wound we're bandaging. - /// Expected lifetime of this bandage in seconds is thus absorption_capacity/absorption_rate, - /// or until the cut heals, whichever comes first - var/absorption_rate - /// Can this stack be used for contruction of girders? var/usable_for_construction = FALSE /// Does this stack require a unique girder in order to make a wall? @@ -231,12 +216,12 @@ if(novariants) return ..() if(amount <= (max_amount * (1/3))) - icon_state = initial(icon_state) + icon_state = post_init_icon_state || initial(icon_state) return ..() if (amount <= (max_amount * (2/3))) - icon_state = "[initial(icon_state)]_2" + icon_state = "[post_init_icon_state || initial(icon_state)]_2" return ..() - icon_state = "[initial(icon_state)]_3" + icon_state = "[post_init_icon_state || initial(icon_state)]_3" return ..() /obj/item/stack/examine(mob/user) diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index a83f1627c74..c219f1d8bd3 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -1,22 +1,26 @@ -/obj/item/stack/sticky_tape +/obj/item/stack/medical/wrap/sticky_tape name = "sticky tape" singular_name = "sticky tape" desc = "Used for sticking to things for sticking said things to people." icon = 'icons/map_icons/items/_item.dmi' - icon_state = "/obj/item/stack/sticky_tape" + icon_state = "/obj/item/stack/medical/wrap/sticky_tape" post_init_icon_state = "tape" - var/prefix = "sticky" - w_class = WEIGHT_CLASS_TINY - full_w_class = WEIGHT_CLASS_TINY item_flags = NOBLUDGEON amount = 5 max_amount = 5 - resistance_flags = FLAMMABLE + self_delay = 8 SECONDS + other_delay = 5 SECONDS splint_factor = 0.65 - merge_type = /obj/item/stack/sticky_tape + merge_type = /obj/item/stack/medical/wrap/sticky_tape greyscale_config = /datum/greyscale_config/tape greyscale_colors = "#B2B2B2#BD6A62" + apply_verb = "taping" + heal_begin_sound = 'sound/items/duct_tape/duct_tape_rip.ogg' + heal_end_sound = 'sound/items/duct_tape/duct_tape_rip.ogg' + /// Prefix applied to the target when wrapped with this tape. + var/prefix = "sticky" + /// Embed applied to the target when wrapped with this tape. var/conferred_embed = /datum/embedding/sticky_tape ///The tape type you get when ripping off a piece of tape. var/obj/tape_gag = /obj/item/clothing/mask/muzzle/tape @@ -27,10 +31,10 @@ ignore_throwspeed_threshold = TRUE immune_traits = null -/obj/item/stack/sticky_tape/grind_results() +/obj/item/stack/medical/wrap/sticky_tape/grind_results() return list(/datum/reagent/cellulose = 5) -/obj/item/stack/sticky_tape/attack_hand(mob/user, list/modifiers) +/obj/item/stack/medical/wrap/sticky_tape/attack_hand(mob/user, list/modifiers) if(user.get_inactive_held_item() == src) if(is_zero_amount(delete_if_zero = TRUE)) return @@ -45,11 +49,11 @@ return TRUE return ..() -/obj/item/stack/sticky_tape/examine(mob/user) +/obj/item/stack/medical/wrap/sticky_tape/examine(mob/user) . = ..() . += "[span_notice("You could rip a piece off by using an empty hand.")]" -/obj/item/stack/sticky_tape/interact_with_atom(obj/item/target, mob/living/user, list/modifiers) +/obj/item/stack/medical/wrap/sticky_tape/interact_with_atom(obj/item/target, mob/living/user, list/modifiers) if(!isitem(target)) return NONE @@ -86,14 +90,14 @@ return ITEM_INTERACT_SUCCESS -/obj/item/stack/sticky_tape/super +/obj/item/stack/medical/wrap/sticky_tape/super name = "super sticky tape" singular_name = "super sticky tape" desc = "Quite possibly the most mischievous substance in the galaxy. Use with extreme lack of caution." prefix = "super sticky" conferred_embed = /datum/embedding/sticky_tape/super splint_factor = 0.4 - merge_type = /obj/item/stack/sticky_tape/super + merge_type = /obj/item/stack/medical/wrap/sticky_tape/super greyscale_colors = "#4D4D4D#75433F" tape_gag = /obj/item/clothing/mask/muzzle/tape/super @@ -101,16 +105,16 @@ embed_chance = 100 fall_chance = 0.1 -/obj/item/stack/sticky_tape/pointy +/obj/item/stack/medical/wrap/sticky_tape/pointy name = "pointy tape" icon = 'icons/map_icons/items/_item.dmi' - icon_state = "/obj/item/stack/sticky_tape/pointy" + icon_state = "/obj/item/stack/medical/wrap/sticky_tape/pointy" post_init_icon_state = "tape_spikes" singular_name = "pointy tape" desc = "Used for sticking to things for sticking said things inside people." prefix = "pointy" conferred_embed = /datum/embedding/pointy_tape - merge_type = /obj/item/stack/sticky_tape/pointy + merge_type = /obj/item/stack/medical/wrap/sticky_tape/pointy greyscale_config = /datum/greyscale_config/tape/spikes greyscale_colors = "#E64539#808080#AD2F45" tape_gag = /obj/item/clothing/mask/muzzle/tape/pointy @@ -118,20 +122,20 @@ /datum/embedding/pointy_tape ignore_throwspeed_threshold = TRUE -/obj/item/stack/sticky_tape/pointy/super +/obj/item/stack/medical/wrap/sticky_tape/pointy/super name = "super pointy tape" singular_name = "super pointy tape" desc = "You didn't know tape could look so sinister. Welcome to Space Station 13." prefix = "super pointy" conferred_embed = /datum/embedding/pointy_tape/super - merge_type = /obj/item/stack/sticky_tape/pointy/super + merge_type = /obj/item/stack/medical/wrap/sticky_tape/pointy/super greyscale_colors = "#8C0A00#4F4F4F#300008" tape_gag = /obj/item/clothing/mask/muzzle/tape/pointy/super /datum/embedding/pointy_tape/super embed_chance = 100 -/obj/item/stack/sticky_tape/surgical +/obj/item/stack/medical/wrap/sticky_tape/surgical name = "surgical tape" singular_name = "surgical tape" desc = "Made for patching broken bones back together alongside bone gel, not for playing pranks." @@ -139,23 +143,23 @@ conferred_embed = /datum/embedding/sticky_tape/surgical splint_factor = 0.5 custom_price = PAYCHECK_CREW - merge_type = /obj/item/stack/sticky_tape/surgical + merge_type = /obj/item/stack/medical/wrap/sticky_tape/surgical greyscale_colors = "#70BAE7#BD6A62" tape_gag = /obj/item/clothing/mask/muzzle/tape/surgical /datum/embedding/sticky_tape/surgical embed_chance = 30 -/obj/item/stack/sticky_tape/surgical/get_surgery_tool_overlay(tray_extended) +/obj/item/stack/medical/wrap/sticky_tape/surgical/get_surgery_tool_overlay(tray_extended) return "tape" + (tray_extended ? "" : "_out") -/obj/item/stack/sticky_tape/duct +/obj/item/stack/medical/wrap/sticky_tape/duct name = "duct tape" singular_name = "duct tape" desc = "Tape designed for sealing punctures, holes and breakages in objects. Engineers swear by this stuff for practically all kinds of repairs. Maybe a little TOO much..." prefix = "duct taped" conferred_embed = /datum/embedding/sticky_tape/duct - merge_type = /obj/item/stack/sticky_tape/duct + merge_type = /obj/item/stack/medical/wrap/sticky_tape/duct var/object_repair_value = 30 amount = 10 max_amount = 10 @@ -163,7 +167,7 @@ /datum/embedding/sticky_tape/duct embed_chance = 0 //Wrapping something in duct tape is basically ensuring it never embeds. -/obj/item/stack/sticky_tape/duct/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) +/obj/item/stack/medical/wrap/sticky_tape/duct/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!object_repair_value) return NONE diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index be4c3a4bbab..02dfbae7716 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -207,9 +207,9 @@ /obj/item/storage/belt/medical/paramedic/PopulateContents() SSwardrobe.provide_type(/obj/item/sensor_device, src) - SSwardrobe.provide_type(/obj/item/stack/medical/gauze/twelve, src) - SSwardrobe.provide_type(/obj/item/stack/medical/bone_gel, src) - SSwardrobe.provide_type(/obj/item/stack/sticky_tape/surgical, src) + SSwardrobe.provide_type(/obj/item/stack/medical/wrap/gauze/twelve, src) + SSwardrobe.provide_type(/obj/item/tourniquet, src) + SSwardrobe.provide_type(/obj/item/bonesetter, src) SSwardrobe.provide_type(/obj/item/reagent_containers/syringe, src) SSwardrobe.provide_type(/obj/item/reagent_containers/cup/bottle/ammoniated_mercury, src) SSwardrobe.provide_type(/obj/item/reagent_containers/cup/bottle/formaldehyde, src) @@ -218,9 +218,9 @@ /obj/item/storage/belt/medical/paramedic/get_types_to_preload() var/list/to_preload = list() //Yes this is a pain. Yes this is the point to_preload += /obj/item/sensor_device - to_preload += /obj/item/stack/medical/gauze/twelve - to_preload += /obj/item/stack/medical/bone_gel - to_preload += /obj/item/stack/sticky_tape/surgical + to_preload += /obj/item/stack/medical/wrap/gauze/twelve + to_preload += /obj/item/tourniquet + to_preload += /obj/item/bonesetter to_preload += /obj/item/reagent_containers/syringe to_preload += /obj/item/reagent_containers/cup/bottle/ammoniated_mercury to_preload += /obj/item/reagent_containers/cup/bottle/formaldehyde @@ -906,4 +906,3 @@ desc = "An imitation of a design grown by the infamous Tiziran Plasma Fire. Has a trigger mechanism to more forcefully draw the blade." icon_state = "grass_gunsheath" actions_types = list(/datum/action/innate/blade_counter/gunpowered) - diff --git a/code/game/objects/items/storage/boxes/clothes_boxes.dm b/code/game/objects/items/storage/boxes/clothes_boxes.dm index f692354a689..dacd33f90c2 100644 --- a/code/game/objects/items/storage/boxes/clothes_boxes.dm +++ b/code/game/objects/items/storage/boxes/clothes_boxes.dm @@ -47,7 +47,7 @@ new /obj/item/clothing/head/wizard/tape/fake(src) new /obj/item/clothing/suit/wizrobe/tape/fake(src) new /obj/item/staff/tape(src) - new /obj/item/stack/sticky_tape(src) + new /obj/item/stack/medical/wrap/sticky_tape(src) /obj/item/storage/box/fakesyndiesuit name = "boxed replica space suit and helmet" diff --git a/code/game/objects/items/storage/dufflebags.dm b/code/game/objects/items/storage/dufflebags.dm index 15eaf089d30..377dd158a8d 100644 --- a/code/game/objects/items/storage/dufflebags.dm +++ b/code/game/objects/items/storage/dufflebags.dm @@ -287,7 +287,7 @@ new /obj/item/bonesetter(src) new /obj/item/blood_filter(src) new /obj/item/stack/medical/bone_gel(src) - new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/stack/medical/wrap/sticky_tape/surgical(src) new /obj/item/emergency_bed(src) new /obj/item/clothing/suit/jacket/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 2ac03f96f5e..14dad15fa7b 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -43,7 +43,7 @@ if(empty) return var/list/items_inside = list( - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, @@ -62,7 +62,7 @@ return var/list/items_inside = list( /obj/item/healthanalyzer/simple = 1, - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/stack/medical/bandage = 1, /obj/item/stack/medical/ointment = 1, /obj/item/reagent_containers/hypospray/medipen/ekit = 2, @@ -82,7 +82,7 @@ return var/list/items_inside = list( /obj/item/healthanalyzer = 1, - /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/stack/medical/wrap/gauze/twelve = 1, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, @@ -109,12 +109,12 @@ /obj/item/retractor/advanced = 1, /obj/item/cautery/advanced = 1, /obj/item/surgical_drapes = 1, - /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/stack/medical/wrap/gauze/twelve = 1, /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/bonesetter = 1, /obj/item/blood_filter = 1, /obj/item/stack/medical/bone_gel = 1, - /obj/item/stack/sticky_tape/surgical = 1, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1, /obj/item/reagent_containers/syringe = 1, /obj/item/reagent_containers/cup/bottle/sodium_thiopental = 1, ) @@ -131,7 +131,7 @@ if(empty) return var/list/items_inside = list( - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment= 3) generate_items_inside(items_inside,src) @@ -234,7 +234,7 @@ return var/list/items_inside = list( /obj/item/reagent_containers/applicator/patch/libital = 3, - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/storage/pill_bottle/probital = 1, /obj/item/reagent_containers/hypospray/medipen/salacid = 1, /obj/item/healthanalyzer/simple = 1, @@ -258,7 +258,7 @@ var/list/items_inside = list( /obj/item/reagent_containers/applicator/patch/synthflesh = 3, /obj/item/reagent_containers/hypospray/medipen/atropine = 2, - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/storage/pill_bottle/penacid = 1) generate_items_inside(items_inside,src) @@ -277,7 +277,7 @@ var/list/items_inside = list( /obj/item/healthanalyzer/advanced = 1, /obj/item/reagent_containers/hypospray/medipen/atropine = 1, - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/wrap/gauze = 1, /obj/item/stack/medical/suture/medicated = 2, /obj/item/stack/medical/mesh/advanced = 2, ) @@ -306,7 +306,7 @@ /obj/item/storage/box/bandages = 1, /obj/item/surgical_drapes = 1, /obj/item/reagent_containers/hypospray/medipen/atropine = 2, - /obj/item/stack/medical/gauze = 2, + /obj/item/stack/medical/wrap/gauze = 2, /obj/item/stack/medical/suture/medicated = 2, /obj/item/stack/medical/mesh/advanced = 2, /obj/item/reagent_containers/applicator/patch/libital = 4, @@ -333,7 +333,7 @@ /obj/item/reagent_containers/applicator/patch/libital = 3, /obj/item/reagent_containers/applicator/patch/aiuri = 3, /obj/item/healthanalyzer/advanced = 1, - /obj/item/stack/medical/gauze = 2, + /obj/item/stack/medical/wrap/gauze = 2, /obj/item/mod/module/thread_ripper = 1, /obj/item/mod/module/surgical_processor/preloaded = 1, /obj/item/mod/module/defibrillator/combat = 1, @@ -510,4 +510,3 @@ for(var/i in 1 to atom_storage.max_slots) new /obj/item/reagent_containers/cup/tube(src) update_appearance(UPDATE_ICON_STATE) - diff --git a/code/game/objects/items/tourniquet.dm b/code/game/objects/items/tourniquet.dm new file mode 100644 index 00000000000..8962adbae72 --- /dev/null +++ b/code/game/objects/items/tourniquet.dm @@ -0,0 +1,146 @@ +/obj/item/tourniquet + name = "tourniquet" + desc = "A medical device used to stop severe bleeding from a limb." + icon = 'icons/obj/medical/firstaid.dmi' + icon_state = "tourniquet" + + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FLAMMABLE + max_integrity = 50 + item_flags = NOBLUDGEON + custom_premium_price = PAYCHECK_CREW * 2 + +/obj/item/tourniquet/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/limb_applicable, \ + valid_zones = GLOB.limb_zones.Copy() + BODY_ZONE_HEAD, \ + apply_category = LIMB_ITEM_TOURNIQUET, \ + can_apply = CALLBACK(src, PROC_REF(can_apply_tourniquet)), \ + ) + RegisterSignal(src, COMSIG_ITEM_APPLIED_TO_LIMB, PROC_REF(on_applied_to_limb)) + RegisterSignal(src, COMSIG_ITEM_UNAPPLIED_FROM_LIMB, PROC_REF(on_removed_from_limb)) + +/obj/item/tourniquet/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/tourniquet/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] begins to wrap [src] around [p_their()] neck too tight! It looks like [user.p_theyre()] trying to commit suicide!")) + if(!do_after(user, 5 SECONDS, user)) + return SHAME + var/obj/item/bodypart/head = user.get_bodypart(BODY_ZONE_HEAD) + if(!head || !head.dismember()) + return SHAME + return OXYLOSS + +/obj/item/tourniquet/proc/on_applied_to_limb(datum/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + limb.refresh_bleed_rate() + switch(limb.body_zone) + if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + var/obj/item/bodypart/arm/arm = limb + arm.set_speed_modifiers(arm.interaction_modifier + 0.5, arm.click_cd_modifier + 0.5) + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/obj/item/bodypart/leg/leg = limb + leg.set_speed_modifier(leg.speed_modifier + 0.5) + if(BODY_ZONE_HEAD) + START_PROCESSING(SSobj, src) + +/obj/item/tourniquet/proc/on_removed_from_limb(datum/source, obj/item/bodypart/limb) + SIGNAL_HANDLER + limb.refresh_bleed_rate() + switch(limb.body_zone) + if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + var/obj/item/bodypart/arm/arm = limb + arm.set_speed_modifiers(arm.interaction_modifier - 0.5, arm.click_cd_modifier - 0.5) + if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/obj/item/bodypart/leg/leg = limb + leg.set_speed_modifier(leg.speed_modifier - 0.5) + if(BODY_ZONE_HEAD) + START_PROCESSING(SSobj, src) + +/obj/item/tourniquet/process(seconds_per_tick) + var/obj/item/bodypart/limb = loc + if(!istype(limb) || isnull(limb.owner)) + return PROCESS_KILL + if(HAS_TRAIT(limb.owner, TRAIT_NOBREATH)) + return // you win this time + + limb.owner.losebreath += 1 * seconds_per_tick // incapable of breathing + limb.owner.apply_damage(1 * seconds_per_tick, OXY, BODY_ZONE_HEAD, forced = TRUE) // no blood getting to brain + if(SPT_PROB(6, seconds_per_tick)) + limb.owner.apply_damage(10, STAMINA, BODY_ZONE_HEAD, forced = TRUE) + if(SPT_PROB(5, seconds_per_tick)) + limb.owner.adjust_eye_blur(4 SECONDS) + if(SPT_PROB(4, seconds_per_tick)) + limb.owner.adjust_dizzy(4 SECONDS) + limb.owner.adjust_confusion(2 SECONDS) + +/obj/item/tourniquet/proc/can_apply_tourniquet(mob/user, mob/living/patient, obj/item/bodypart/limb) + var/speed_multiplier = 2 + var/speed_boosted = FALSE + for(var/datum/wound/woundies as anything in limb.wounds) + if(!woundies.blood_flow) + continue + if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED) && limb.body_zone != BODY_ZONE_HEAD) + speed_multiplier = 0.5 + speed_boosted = TRUE + break + speed_multiplier = 1 + + if(limb.body_zone == BODY_ZONE_HEAD) + speed_multiplier *= 2 // are you sure about that? + + else if(user != patient) + speed_multiplier *= 0.5 + + if(limb.body_zone == BODY_ZONE_HEAD) + user.visible_message( + span_warning("[user] begins applying [src] to [user == patient ? p_their() : "[patient]'s"] neck..."), + span_userdanger("You begin applying [src] to [user == patient ? "your" : "[patient]'s"] neck, though you begin wonder if this is a good idea...?"), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ignored_mobs = patient, + ) + if(user != patient) + patient.show_message( + span_userdanger("[user] begins applying [src] to your neck! That can't be a good idea...!"), + MSG_VISUAL, + span_userdanger("You feel [user] start wrapping something tight around your neck! That can't be a good idea...!"), + ) + + else if(speed_boosted) + user.visible_message( + span_notice("[user] begins expertly applying [src] to [user == patient ? p_their() : "[patient]'s"] own [limb.plaintext_zone]..."), + span_notice("You begin expertly applying [src] to [user == patient ? "your" : "[patient]'s"] own [limb.plaintext_zone], keeping the holo-image indications in mind..."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ignored_mobs = patient, + ) + if(user != patient) + patient.show_message( + span_notice("[user] begins expertly applying [src] to your [limb.plaintext_zone]..."), + MSG_VISUAL, + span_notice("You feel [user] start wrapping something around your [limb.plaintext_zone] with expert precision..."), + ) + + else + user.visible_message( + span_warning("[user] begins applying [src] to [user == patient ? p_their() : "[patient]'s"] [limb.plaintext_zone]..."), + span_warning("You begin applying [src] to [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone]..."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ignored_mobs = patient, + ) + if(user != patient) + patient.show_message( + span_warning("[user] begins applying [src] to your [limb.plaintext_zone]..."), + MSG_VISUAL, + span_warning("You feel [user] start wrapping something around your [limb.plaintext_zone]..."), + ) + + if(!do_after(user, 5 SECONDS * speed_multiplier, patient)) + return FALSE + + // pain from tight wrapping + patient.apply_damage(5, BRUTE, limb, attacking_item = src) + patient.apply_damage(20, STAMINA, limb, attacking_item = src) + return TRUE diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index ddd21237451..b6d364feb5c 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -93,7 +93,7 @@ /obj/item/reagent_containers/cup/bottle/toxin, /obj/item/reagent_containers/cup/beaker/large, /obj/item/reagent_containers/applicator/pill/insulin, - /obj/item/stack/medical/gauze, + /obj/item/stack/medical/wrap/gauze, /obj/item/storage/box/bandages, /obj/item/storage/box/beakers, /obj/item/storage/box/medigels, diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 277e689656b..ddf0b30145f 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -487,7 +487,7 @@ GLOBAL_LIST_INIT(holiday_mail, list()) begin_month = JULY holiday_hat = /obj/item/clothing/head/costume/nursehat holiday_mail = list( - /obj/item/stack/medical/gauze, + /obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/ointment, /obj/item/storage/box/bandages, ) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1a11895f0af..8a5abd2869a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -112,6 +112,22 @@ weapon.get_embed().rip_out(usr) return + if(href_list["remove_tourniquet"]) + var/obj/item/bodypart/limb = locate(href_list["remove_tourniquet"]) in bodyparts + var/mob/living/patient = limb?.owner + var/obj/item/tourniquet = LAZYACCESS(limb?.applied_items, LIMB_ITEM_TOURNIQUET) + if(QDELETED(limb) || QDELETED(patient) || QDELETED(tourniquet)) + return + balloon_alert_to_viewers("removing tourniquet...") + if(!do_after(usr, 4 SECONDS, target = src)) + return + if(QDELETED(limb) || QDELETED(patient) || QDELETED(tourniquet) || limb.owner != patient || tourniquet.loc != limb) + return + + balloon_alert_to_viewers("tourniquet removed") + usr.put_in_hands(tourniquet) + return + if(href_list["show_paper_note"]) var/obj/item/paper/paper_note = locate(href_list["show_paper_note"]) if(!paper_note) @@ -931,7 +947,7 @@ ///Updates the bodypart speed modifier based on our bodyparts. /mob/living/carbon/proc/update_bodypart_speed_modifier() var/final_modification = 0 - for(var/obj/item/bodypart/bodypart as anything in bodyparts) + for(var/obj/item/bodypart/leg/bodypart in bodyparts) final_modification += bodypart.speed_modifier add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bodypart, update = TRUE, multiplicative_slowdown = final_modification) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index baf95f04fc4..210c0be8c2a 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -53,13 +53,15 @@ for(var/obj/item/bodypart/body_part as anything in bodyparts) if(body_part.bodypart_disabled) disabled += body_part + + var/treatment_distance = isliving(user) && get_dist(src, user) <= CARBON_EXAMINE_EMBEDDING_MAX_DIST for(var/obj/item/embedded as anything in body_part.embedded_objects) if(embedded.get_embed().stealthy_embed) continue var/harmless = embedded.get_embed().is_harmless() var/stuck_wordage = harmless ? "stuck to" : "embedded in" var/embed_line = "\a [embedded]" - if (get_dist(src, user) <= CARBON_EXAMINE_EMBEDDING_MAX_DIST) + if (treatment_distance) embed_line = "\a [embedded]" var/embed_text = "[t_He] [t_has] [icon2html(embedded, user)] [embed_line] [stuck_wordage] [t_his] [body_part.plaintext_zone]!" if (harmless) @@ -67,6 +69,17 @@ else . += span_boldwarning(embed_text) + var/obj/item/tourniquet/current_tourniquet = LAZYACCESS(body_part.applied_items, LIMB_ITEM_TOURNIQUET) + if(current_tourniquet) + var/tourniquet_href = "\a [current_tourniquet]" + if(treatment_distance) + tourniquet_href = "[tourniquet_href]" + var/tourniquet_msg = "[t_He] [t_has] [icon2html(current_tourniquet, user)] [tourniquet_href] tightly secured around [t_his] [body_part.body_zone == BODY_ZONE_HEAD ? "neck" : body_part.plaintext_zone]." + if(body_part.body_zone == BODY_ZONE_HEAD) + . += span_boldwarning(tourniquet_msg) + else + . += span_notice(tourniquet_msg) + for(var/datum/wound/iter_wound as anything in body_part.wounds) . += span_danger(iter_wound.get_examine_description(user)) diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 83da4418def..1e95ae542ac 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -723,7 +723,7 @@ /obj/item/extinguisher/mini, /obj/item/emergency_bed/silicon, /obj/item/borg/cyborghug/medical, - /obj/item/stack/medical/gauze, + /obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bone_gel, /obj/item/borg/apparatus/organ_storage, /obj/item/borg/lollipop, @@ -939,7 +939,7 @@ /obj/item/crowbar/cyborg, /obj/item/extinguisher/mini, /obj/item/pinpointer/syndicate_cyborg, - /obj/item/stack/medical/gauze, + /obj/item/stack/medical/wrap/gauze, /obj/item/stack/medical/bone_gel, /obj/item/gun/medbeam, /obj/item/borg/apparatus/organ_storage, diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index 40ab56e6093..51927093e6b 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -192,7 +192,7 @@ update_appearance() return ITEM_INTERACT_SUCCESS - if (istype(tool, /obj/item/stack/sticky_tape)) + if (istype(tool, /obj/item/stack/medical/wrap/sticky_tape)) if (tape_color) to_chat(user, span_warning("[src]'s hole is already covered up with tape!")) return ITEM_INTERACT_BLOCKING @@ -201,7 +201,7 @@ to_chat(user, span_warning("[src] hasn't been opened yet!")) return ITEM_INTERACT_BLOCKING - var/obj/item/stack/sticky_tape/tape = tool + var/obj/item/stack/medical/wrap/sticky_tape/tape = tool var/list/tape_colors = SSgreyscale.ParseColorString(tape.greyscale_colors) add_fingerprint(user) if (!tape.use(1)) diff --git a/code/modules/research/designs/autolathe/medsci_designs.dm b/code/modules/research/designs/autolathe/medsci_designs.dm index 7e804c21e6f..f36b37b4170 100644 --- a/code/modules/research/designs/autolathe/medsci_designs.dm +++ b/code/modules/research/designs/autolathe/medsci_designs.dm @@ -52,7 +52,7 @@ id = "surgical_tape" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/plastic =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/stack/sticky_tape/surgical + build_path = /obj/item/stack/medical/wrap/sticky_tape/surgical category = list( RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL, diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index 82911ce3caf..cfad5497e20 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -459,7 +459,7 @@ id = "sticky_tape" build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list(/datum/material/plastic =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/stack/sticky_tape + build_path = /obj/item/stack/medical/wrap/sticky_tape category = list(RND_CATEGORY_INITIAL, RND_CATEGORY_EQUIPMENT) category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE, diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index b355e379ab2..20a552095ef 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -882,7 +882,7 @@ id = "super_sticky_tape" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/plastic =SHEET_MATERIAL_AMOUNT * 1.5) - build_path = /obj/item/stack/sticky_tape/super + build_path = /obj/item/stack/medical/wrap/sticky_tape/super category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) @@ -893,7 +893,7 @@ id = "pointy_tape" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/plastic =HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/stack/sticky_tape/pointy + build_path = /obj/item/stack/medical/wrap/sticky_tape/pointy category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) @@ -904,7 +904,7 @@ id = "super_pointy_tape" build_type = PROTOLATHE | AWAY_LATHE materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/plastic =SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/stack/sticky_tape/pointy/super + build_path = /obj/item/stack/medical/wrap/sticky_tape/pointy/super category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE ) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 6d4b1546fc7..c7af5bf0708 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -72,8 +72,6 @@ var/list/embedded_objects /// are we a hand? if so, which one! var/held_index = 0 - /// A speed modifier we apply to the owner when attached, if any. Positive numbers make it move slower, negative numbers make it move faster. - var/speed_modifier = 0 // Limb disabling variables ///Whether it is possible for the limb to be disabled whatsoever. TRUE means that it is possible. @@ -156,10 +154,10 @@ var/cached_bleed_rate = 0 /// How much generic bleedstacks we have on this bodypart var/generic_bleedstacks - /// If we have a gauze wrapping currently applied (not including splints) - var/obj/item/stack/medical/gauze/current_gauze /// If something is currently grasping this bodypart and trying to staunch bleeding (see [/obj/item/hand_item/self_grasp]) var/obj/item/hand_item/self_grasp/grasped_by + /// Lazylist of category to item applied to this limb + var/list/applied_items ///A list of all bodypart overlays to draw var/list/bodypart_overlays = list() @@ -296,7 +294,7 @@ owner = null - QDEL_NULL(current_gauze) + QDEL_LIST_ASSOC_VAL(applied_items) QDEL_LAZYLIST(scars) for(var/atom/movable/movable in contents) @@ -434,14 +432,24 @@ continue var/harmless = embedded_thing.get_embed().is_harmless() var/stuck_wordage = harmless ? "stuck to" : "embedded in" - var/embed_text = "\t There is [icon2html(embedded_thing, examiner)] \a [embedded_thing] [stuck_wordage] your [plaintext_zone]!" + var/embed_text = "\tThere is [icon2html(embedded_thing, examiner)] \a [embedded_thing] [stuck_wordage] your [plaintext_zone]!" if (harmless) check_list += span_italics(span_notice(embed_text)) else check_list += span_boldwarning(embed_text) - if(current_gauze) - check_list += span_notice("\tThere is some [current_gauze.name] wrapped around it.") + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(applied_items, LIMB_ITEM_GAUZE) + var/obj/item/tourniquet/current_tourniquet = LAZYACCESS(applied_items, LIMB_ITEM_TOURNIQUET) + if(current_tourniquet || current_gauze) + if(current_tourniquet) + var/tourniquet_href = "[icon2html(current_tourniquet, examiner)] \a [current_tourniquet]" + var/tourniquet_text = "\tThere is [tourniquet_href] tightly secured around [body_zone == BODY_ZONE_HEAD ? "your neck!" : "it."]" + if(body_zone == BODY_ZONE_HEAD) + check_list += span_boldwarning(tourniquet_text) + else + check_list += span_warning(tourniquet_text) + if(current_gauze) + check_list += span_notice("\tThere is some [current_gauze.name] wrapped around it.") else if(can_bleed()) var/bleed_text = "" switch(cached_bleed_rate) @@ -620,8 +628,6 @@ if(IS_ORGANIC_LIMB(src)) playsound(drop_loc, 'sound/misc/splort.ogg', 50, TRUE, -1) - QDEL_NULL(current_gauze) - for(var/obj/item/organ/bodypart_organ in contents) if(bodypart_organ.organ_flags & ORGAN_UNREMOVABLE) continue @@ -987,8 +993,6 @@ owner = null - if(speed_modifier) - old_owner.update_bodypart_speed_modifier() if(LAZYLEN(bodypart_traits)) old_owner.remove_traits(bodypart_traits, bodypart_trait_source) @@ -1010,8 +1014,6 @@ owner = new_owner - if(speed_modifier) - owner.update_bodypart_speed_modifier() if(LAZYLEN(bodypart_traits)) owner.add_traits(bodypart_traits, bodypart_trait_source) @@ -1519,7 +1521,7 @@ else if(body_zone != BODY_ZONE_CHEST) surgery_bloodloss *= 0.25 // bonus for being gauzed up - if(current_gauze) + if(LAZYACCESS(applied_items, LIMB_ITEM_GAUZE)) surgery_bloodloss *= 0.4 cached_bleed_rate += surgery_bloodloss @@ -1543,6 +1545,9 @@ if(grasped_by) cached_bleed_rate *= 0.7 + if(LAZYACCESS(applied_items, LIMB_ITEM_TOURNIQUET)) + cached_bleed_rate *= 0.1 + // Our bleed overlay is based directly off bleed_rate, so go aheead and update that would you? if(cached_bleed_rate != old_bleed_rate) update_part_wound_overlay() @@ -1590,41 +1595,69 @@ return ((biological_state & BIO_BLOODED) && (!owner || owner.can_bleed())) /** - * apply_gauze() is used to- well, apply gauze to a bodypart + * Inserts an item into the applied items list for this bodypart * - * As of the Wounds 2 PR, all bleeding is now bodypart based rather than the old bleedstacks system, and 90% of standard bleeding comes from flesh wounds (the exception is embedded weapons). - * The same way bleeding is totaled up by bodyparts, gauze now applies to all wounds on the same part. Thus, having a slash wound, a pierce wound, and a broken bone wound would have the gauze - * applying blood staunching to the first two wounds, while also acting as a sling for the third one. Once enough blood has been absorbed or all wounds with the ACCEPTS_GAUZE flag have been cleared, - * the gauze falls off. + * Note: Forcemoves the item to the bodypart's contents when called! * * Arguments: - * * gauze- Just the gauze stack we're taking a sheet from to apply here + * * applying_item - The item to apply + * * category - The category of item being applied (e.g. LIMB_ITEM_GAUZE). If null, defaults to the REF of the applying_item + * * override - If TRUE, will force the application of the item even if an item of the same category is already applied + * + * Returns TRUE if the item was successfully applied + * Returns FALSE if the item was not applied (e.g. an item of the same category is already applied and override is FALSE) */ -/obj/item/bodypart/proc/apply_gauze(obj/item/stack/medical/gauze/new_gauze) - if(!istype(new_gauze) || !new_gauze.absorption_capacity || !new_gauze.use(1)) - return - var/newly_gauzed = !current_gauze - QDEL_NULL(current_gauze) - current_gauze = new new_gauze.type(src, 1) - current_gauze.gauzed_bodypart = src - if(newly_gauzed) - SEND_SIGNAL(src, COMSIG_BODYPART_GAUZED, current_gauze, new_gauze) +/obj/item/bodypart/proc/apply_item(obj/item/applying_item, category, override = FALSE) + if(isnull(category)) + category = REF(applying_item) + + if(!override && LAZYACCESS(applied_items, category)) + return FALSE + + applying_item.forceMove(src) + LAZYSET(applied_items, category, applying_item) + SEND_SIGNAL(applying_item, COMSIG_ITEM_APPLIED_TO_LIMB, src) + return TRUE + +/obj/item/bodypart/Exited(atom/movable/gone, direction) + . = ..() + for(var/category, item in applied_items) + if(item != gone) + continue + LAZYREMOVE(applied_items, category) + SEND_SIGNAL(gone, COMSIG_ITEM_UNAPPLIED_FROM_LIMB, src) /** - * seep_gauze() is for when a gauze wrapping absorbs blood or pus from wounds, lowering its absorption capacity. + * Get how splinted this bodypart is based on applied items * - * The passed amount of seepage is deducted from the bandage's absorption capacity, and if we reach a negative absorption capacity, the bandages falls off and we're left with nothing. + * Multiplier applied to maluses, so lower = better + */ +/obj/item/bodypart/proc/get_splint_factor() + var/factor = 1 + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(applied_items, LIMB_ITEM_GAUZE) + if(current_gauze) + factor *= current_gauze.splint_factor + return factor + +/** + * Attempts to use up some of gauze applied + * If we use up all of the gauze, it is deleted * * Arguments: * * seep_amt - How much absorption capacity we're removing from our current bandages (think, how much blood or pus are we soaking up this tick?) + * + * Return TRUE if we successfully used up some gauze + * Return FALSE if we had no gauze to use up */ /obj/item/bodypart/proc/seep_gauze(seep_amt = 0) + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(applied_items, LIMB_ITEM_GAUZE) if(!current_gauze) - return + return FALSE current_gauze.absorption_capacity -= seep_amt if(current_gauze.absorption_capacity <= 0) owner.visible_message(span_danger("\The [current_gauze.name] on [owner]'s [name] falls away in rags."), span_warning("\The [current_gauze.name] on your [name] falls away in rags."), vision_distance=COMBAT_MESSAGE_RANGE) - QDEL_NULL(current_gauze) + qdel(current_gauze) + return TRUE ///A multi-purpose setter for all things immediately important to the icon and iconstate of the limb. /obj/item/bodypart/proc/change_appearance(icon, id, greyscale, dimorphic) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 4424cd90bad..c888271cfc2 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -166,6 +166,12 @@ unarmed_damage_high = 10 unarmed_pummeling_bonus = 1.5 body_zone = BODY_ZONE_L_ARM + + /// Actionspeed modifier applied to doafters being done while this arm is active + var/interaction_modifier = 0 + /// Modifier to all click cds while this arm is active + var/click_cd_modifier = 1 + /// Datum describing how to offset things worn on the hands of this arm, note that an x offset won't do anything here var/datum/worn_feature_offset/worn_glove_offset /// Datum describing how to offset things held in the hands of this arm, the x offset IS functional here @@ -180,16 +186,26 @@ QDEL_NULL(held_hand_offset) return ..() +/obj/item/bodypart/arm/proc/set_speed_modifiers(interaction = 0, click = 1) + if(interaction_modifier == interaction && click_cd_modifier == click) + return + + owner?.remove_status_effect(/datum/status_effect/arm_speed_penalty, held_index) + interaction_modifier = interaction + click_cd_modifier = click + if(interaction_modifier != 0 || click_cd_modifier != 1) + owner?.apply_status_effect(/datum/status_effect/arm_speed_penalty, held_index, interaction, click) + /// We need to clear out hand hud items and appearance, so do that here /obj/item/bodypart/arm/clear_ownership(mob/living/carbon/old_owner) - ..() - + . = ..() old_owner.update_worn_gloves() - if(!held_index) return old_owner.on_lost_hand(src) + if(interaction_modifier != 0 || click_cd_modifier != 1) + old_owner.remove_status_effect(/datum/status_effect/arm_speed_penalty, held_index) if(!old_owner.hud_used) return @@ -199,7 +215,7 @@ /// We need to add hand hud items and appearance, so do that here /obj/item/bodypart/arm/apply_ownership(mob/living/carbon/new_owner) - ..() + . = ..() new_owner.update_worn_gloves() @@ -207,6 +223,8 @@ return new_owner.on_added_hand(src, held_index) + if(interaction_modifier != 0 || click_cd_modifier != 1) + new_owner.apply_status_effect(/datum/status_effect/arm_speed_penalty, held_index, interaction_modifier, click_cd_modifier) if(!new_owner.hud_used) return @@ -233,6 +251,63 @@ var/atom/movable/screen/inventory/hand/hand_screen_object = owner.hud_used.hand_slots["[held_index]"] hand_screen_object?.update_appearance() +/datum/status_effect/arm_speed_penalty + id = "arm_speed_penalty" + alert_type = null + status_type = STATUS_EFFECT_MULTIPLE + duration = STATUS_EFFECT_PERMANENT + tick_interval = STATUS_EFFECT_NO_TICK + /// Typepath of the actionspeed modifier applied by this status effect + VAR_FINAL/actionspeed_typepath = /datum/actionspeed_modifier/arm_speed_penalty + /// Index this status effect is applied for + var/hand_index + /// Actionspeed modifier amount + var/actionspeed_mod = 0 + /// Click cd modifier amount + var/click_cd_mod = 1 + +/datum/status_effect/arm_speed_penalty/on_creation(mob/living/new_owner, hand_index, new_actionspeed = 0, new_click_cd = 1) + src.hand_index = hand_index + src.actionspeed_mod = new_actionspeed + src.click_cd_mod = new_click_cd + + switch(hand_index) + if(1) + actionspeed_typepath = /datum/actionspeed_modifier/arm_speed_penalty/left_hand + if(2) + actionspeed_typepath = /datum/actionspeed_modifier/arm_speed_penalty/right_hand + + return ..() + +/datum/status_effect/arm_speed_penalty/before_remove(hand_index) + return (src.hand_index == hand_index) + +/datum/status_effect/arm_speed_penalty/on_apply() + RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_handswap)) + on_handswap(owner) + return TRUE + +/datum/status_effect/arm_speed_penalty/on_remove() + owner.remove_actionspeed_modifier(actionspeed_typepath) + UnregisterSignal(owner, COMSIG_MOB_SWAP_HANDS) + +/datum/status_effect/arm_speed_penalty/proc/on_handswap(mob/living/carbon/source) + SIGNAL_HANDLER + if(owner.active_hand_index == hand_index) + owner.add_or_update_variable_actionspeed_modifier(actionspeed_typepath, update = TRUE, multiplicative_slowdown = actionspeed_mod) + else + owner.remove_actionspeed_modifier(actionspeed_typepath) + +/datum/status_effect/arm_speed_penalty/nextmove_modifier() + return (owner.active_hand_index == hand_index) ? click_cd_mod : 1 + +/datum/actionspeed_modifier/arm_speed_penalty + variable = TRUE + +/datum/actionspeed_modifier/arm_speed_penalty/left_hand + +/datum/actionspeed_modifier/arm_speed_penalty/right_hand + /obj/item/bodypart/arm/left name = "left arm" desc = "Did you know that the word 'sinister' stems originally from the \ @@ -416,6 +491,8 @@ unarmed_damage_high = 15 unarmed_effectiveness = 15 biological_state = BIO_STANDARD_JOINTED + /// A speed modifier we apply to the owner when attached, if any. Positive numbers make it move slower, negative numbers make it move faster. + var/speed_modifier = 0 /// Datum describing how to offset things worn on the foot of this leg, note that an x offset won't do anything here var/datum/worn_feature_offset/worn_foot_offset /// Used by the bloodysoles component to make footprints @@ -458,6 +535,23 @@ else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) +/obj/item/bodypart/leg/apply_ownership(mob/living/carbon/new_owner) + . = ..() + if(speed_modifier) + new_owner.update_bodypart_speed_modifier() + +/obj/item/bodypart/leg/clear_ownership(mob/living/carbon/old_owner) + . = ..() + if(speed_modifier) + old_owner.update_bodypart_speed_modifier() + +/obj/item/bodypart/leg/proc/set_speed_modifier(new_modifier) + if(speed_modifier == new_modifier) + return + + speed_modifier = new_modifier + owner?.update_bodypart_speed_modifier() + /obj/item/bodypart/leg/left name = "left leg" desc = "Some athletes prefer to tie their left shoelaces first for good \ diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index 07a9c3330bd..dfe4a7d4d4d 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -297,12 +297,13 @@ for(var/datum/wound/iter_wound as anything in wounds) dam_mul *= iter_wound.damage_multiplier_penalty + var/obj/item/stack/medical/wrap/current_gauze = LAZYACCESS(applied_items, LIMB_ITEM_GAUZE) if(!LAZYLEN(wounds) && current_gauze && !replaced) // no more wounds = no need for the gauze anymore if (owner) owner.visible_message(span_notice("\The [current_gauze.name] on [owner]'s [name] falls away."), span_notice("\The [current_gauze] on your [plaintext_zone] falls away.")) else visible_message(span_notice("\The [current_gauze.name] on [name] falls away.")) - QDEL_NULL(current_gauze) + qdel(current_gauze) wound_damage_multiplier = dam_mul refresh_bleed_rate() diff --git a/code/modules/surgery/operations/operation_add_limb.dm b/code/modules/surgery/operations/operation_add_limb.dm index ecdd579312e..3f12368ff12 100644 --- a/code/modules/surgery/operations/operation_add_limb.dm +++ b/code/modules/surgery/operations/operation_add_limb.dm @@ -169,8 +169,8 @@ desc = "Ensure that an arbitrary prosthetic is properly attached to a patient's body." implements = list( /obj/item/stack/medical/suture = 1, - /obj/item/stack/sticky_tape/surgical = 1.25, - /obj/item/stack/sticky_tape = 2, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1.25, + /obj/item/stack/medical/wrap/sticky_tape = 2, ) time = 4.8 SECONDS operation_flags = OPERATION_SELF_OPERABLE | OPERATION_STANDING_ALLOWED | OPERATION_IGNORE_CLOTHES @@ -179,7 +179,7 @@ /datum/surgery_operation/limb/secure_arbitrary_prosthetic/get_default_radial_image() return image(/obj/item/stack/medical/suture) -/datum/surgery_operation/limb/secure_arbitrary_prosthetic/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/stack/tool, list/operation_args) +/datum/surgery_operation/limb/secure_arbitrary_prosthetic/on_preop(obj/item/bodypart/limb, mob/living/surgeon, obj/item/stack/medical/tool, list/operation_args) display_results( surgeon, limb.owner, @@ -190,7 +190,7 @@ var/obj/item/bodypart/chest = limb.owner.get_bodypart(BODY_ZONE_CHEST) display_pain(limb.owner, "[surgeon] begins to [tool.singular_name] [limb] to your body!", IS_ROBOTIC_LIMB(chest)) -/datum/surgery_operation/limb/secure_arbitrary_prosthetic/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/stack/tool, list/operation_args) +/datum/surgery_operation/limb/secure_arbitrary_prosthetic/on_success(obj/item/bodypart/limb, mob/living/surgeon, obj/item/stack/medical/tool, list/operation_args) display_results( surgeon, limb.owner, diff --git a/code/modules/surgery/operations/operation_bone_repair.dm b/code/modules/surgery/operations/operation_bone_repair.dm index 7f9821a4493..33088956928 100644 --- a/code/modules/surgery/operations/operation_bone_repair.dm +++ b/code/modules/surgery/operations/operation_bone_repair.dm @@ -72,9 +72,9 @@ implements = list( TOOL_BONESET = 1, /obj/item/stack/medical/bone_gel = 1, - /obj/item/stack/sticky_tape/surgical = 1, - /obj/item/stack/sticky_tape/super = 2, - /obj/item/stack/sticky_tape = 3.33, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1, + /obj/item/stack/medical/wrap/sticky_tape/super = 2, + /obj/item/stack/medical/wrap/sticky_tape = 3.33, ) time = 4 SECONDS any_surgery_states_required = ALL_SURGERY_SKIN_STATES @@ -124,9 +124,9 @@ operation_flags = OPERATION_PRIORITY_NEXT_STEP | OPERATION_NO_PATIENT_REQUIRED implements = list( TOOL_BONESET = 1, - /obj/item/stack/sticky_tape/surgical = 1.66, - /obj/item/stack/sticky_tape/super = 2.5, - /obj/item/stack/sticky_tape = 5, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1.66, + /obj/item/stack/medical/wrap/sticky_tape/super = 2.5, + /obj/item/stack/medical/wrap/sticky_tape = 5, ) time = 6 SECONDS all_surgery_states_required = SURGERY_SKIN_OPEN @@ -178,9 +178,9 @@ operation_flags = OPERATION_PRIORITY_NEXT_STEP | OPERATION_NO_PATIENT_REQUIRED implements = list( /obj/item/stack/medical/bone_gel = 1, - /obj/item/stack/sticky_tape/surgical = 1, - /obj/item/stack/sticky_tape/super = 2, - /obj/item/stack/sticky_tape = 3.33, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1, + /obj/item/stack/medical/wrap/sticky_tape/super = 2, + /obj/item/stack/medical/wrap/sticky_tape = 3.33, ) time = 4 SECONDS any_surgery_states_required = ALL_SURGERY_SKIN_STATES @@ -275,9 +275,9 @@ operation_flags = OPERATION_PRIORITY_NEXT_STEP | OPERATION_NO_PATIENT_REQUIRED implements = list( /obj/item/stack/medical/bone_gel = 1, - /obj/item/stack/sticky_tape/surgical = 1, - /obj/item/stack/sticky_tape/super = 2, - /obj/item/stack/sticky_tape = 3.33, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1, + /obj/item/stack/medical/wrap/sticky_tape/super = 2, + /obj/item/stack/medical/wrap/sticky_tape = 3.33, ) time = 4 SECONDS diff --git a/code/modules/surgery/operations/operation_generic.dm b/code/modules/surgery/operations/operation_generic.dm index c670c09c873..20d106e8d66 100644 --- a/code/modules/surgery/operations/operation_generic.dm +++ b/code/modules/surgery/operations/operation_generic.dm @@ -368,15 +368,15 @@ operation_flags = OPERATION_NO_PATIENT_REQUIRED implements = list( /obj/item/stack/medical/bone_gel = 1, - /obj/item/stack/sticky_tape/surgical = 1, - /obj/item/stack/sticky_tape/super = 2, - /obj/item/stack/sticky_tape = 3.33, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 1, + /obj/item/stack/medical/wrap/sticky_tape/super = 2, + /obj/item/stack/medical/wrap/sticky_tape = 3.33, ) preop_sound = list( /obj/item/stack/medical/bone_gel = 'sound/misc/soggy.ogg', - /obj/item/stack/sticky_tape/surgical = 'sound/items/duct_tape/duct_tape_rip.ogg', - /obj/item/stack/sticky_tape/super = 'sound/items/duct_tape/duct_tape_rip.ogg', - /obj/item/stack/sticky_tape = 'sound/items/duct_tape/duct_tape_rip.ogg', + /obj/item/stack/medical/wrap/sticky_tape/surgical = 'sound/items/duct_tape/duct_tape_rip.ogg', + /obj/item/stack/medical/wrap/sticky_tape/super = 'sound/items/duct_tape/duct_tape_rip.ogg', + /obj/item/stack/medical/wrap/sticky_tape = 'sound/items/duct_tape/duct_tape_rip.ogg', ) time = 4 SECONDS all_surgery_states_required = SURGERY_SKIN_OPEN diff --git a/code/modules/surgery/surgery_tray.dm b/code/modules/surgery/surgery_tray.dm index 7d0653f7bdf..e34c644880f 100644 --- a/code/modules/surgery/surgery_tray.dm +++ b/code/modules/surgery/surgery_tray.dm @@ -178,7 +178,7 @@ /obj/item/retractor, /obj/item/scalpel, /obj/item/stack/medical/bone_gel, - /obj/item/stack/sticky_tape/surgical, + /obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/surgical_drapes, /obj/item/surgicaldrill, ) @@ -201,7 +201,7 @@ /obj/item/retractor/cruel, /obj/item/scalpel/cruel, /obj/item/stack/medical/bone_gel, - /obj/item/stack/sticky_tape/surgical, + /obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/surgical_drapes, /obj/item/surgicaldrill/cruel, ) @@ -221,7 +221,7 @@ /obj/item/blood_filter, /obj/item/shears, /obj/item/stack/medical/bone_gel, - /obj/item/stack/sticky_tape/surgical, + /obj/item/stack/medical/wrap/sticky_tape/surgical, /obj/item/clothing/mask/surgical, ) diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 9696cd1bbb7..8fc403ea9c8 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -231,7 +231,7 @@ name = "Super Pointy Tape" desc = "An all-purpose super pointy tape roll. The tape is built with hundreds of tiny metal needles, the roll comes with in 5 pieces. When added to items the \ item that was taped will embed when thrown at people. Taping people's mouthes with it will hurt them if pulled off by someone else." - item = /obj/item/stack/sticky_tape/pointy/super + item = /obj/item/stack/medical/wrap/sticky_tape/pointy/super cost = 1 /datum/uplink_item/device_tools/hacked_module diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 1f368e4afdd..a724d263996 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -15,7 +15,7 @@ /obj/item/stock_parts/micro_laser = 3, /obj/item/stock_parts/scanning_module = 3, /obj/item/wirecutters = 2, - /obj/item/stack/sticky_tape/duct = 3, + /obj/item/stack/medical/wrap/sticky_tape/duct = 3, ) contraband = list( /obj/item/assembly/health = 2, diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 13e30e1783f..3f9894e140c 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -17,7 +17,7 @@ /obj/item/electronics/airalarm = 10, /obj/item/electronics/firealarm = 10, /obj/item/electronics/firelock = 10, - /obj/item/stack/sticky_tape/duct = 10, + /obj/item/stack/medical/wrap/sticky_tape/duct = 10, ) contraband = list( /obj/item/stock_parts/power_store/cell/potato = 3, diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 0cba3928f67..16e3921c1c3 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -6,12 +6,12 @@ panel_type = "panel11" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" products = list( - /obj/item/stack/medical/gauze = 8, + /obj/item/stack/medical/wrap/gauze = 8, /obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/healthanalyzer = 4, /obj/item/wrench/medical = 1, - /obj/item/stack/sticky_tape/surgical = 3, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 3, /obj/item/healthanalyzer/simple = 4, /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/suture = 2, @@ -33,6 +33,7 @@ /obj/item/sensor_device = 2, /obj/item/storage/medkit/advanced = 2, /obj/item/shears = 1, + /obj/item/tourniquet = 6, /obj/item/storage/organbox = 1, ) refill_canister = /obj/item/vending_refill/medical @@ -52,12 +53,12 @@ /obj/machinery/vending/medical/infested_frigate products = list( - /obj/item/stack/medical/gauze = 0, + /obj/item/stack/medical/wrap/gauze = 0, /obj/item/reagent_containers/syringe = 7, /obj/item/reagent_containers/dropper = 3, /obj/item/healthanalyzer = 0, /obj/item/wrench/medical = 0, - /obj/item/stack/sticky_tape/surgical = 0, + /obj/item/stack/medical/wrap/sticky_tape/surgical = 0, /obj/item/healthanalyzer/simple = 0, /obj/item/stack/medical/ointment = 0, /obj/item/stack/medical/suture = 1, diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 612493db94f..90bb9823e10 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -9,7 +9,7 @@ /obj/item/stack/medical/bandage = 4, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/applicator/pill/multiver = 2, - /obj/item/stack/medical/gauze = 4, + /obj/item/stack/medical/wrap/gauze = 4, /obj/item/reagent_containers/hypospray/medipen/ekit = 2, /obj/item/healthanalyzer/simple = 2, ) diff --git a/icons/map_icons/items/_item.dmi b/icons/map_icons/items/_item.dmi index f1e1a9f5f02887f6994272774e0a615b77696f67..ce998dbb391a07dfa7803958c89243dd3340e43e 100644 GIT binary patch delta 626 zcmV-&0*(ERn*o)Z0gxnrS9(-fbVOxyV{&P5bZKvH004NLt(L(~8!-@u&&g9*aE+LT za?PazAr9~gt66*2JH%_dV|$nF)Atb6RsxFbaL8c~-{*g3Y-KLhkGuPaCw2Syu$@T~ z2d@t5=IYyav#`mdI;ij0+s#O9$9(!o88fMay13YG3`G`gDdK9r@1`kZVUCBC}O z<-r%{B$y^o@_3|wbAlwtQ-dI7)JK@euto=qV1$%eAJ;Bp{5lb&606?AC%PEe=k=?7 zU!5`)v8?ff_t;`IMdxbUA{Zlk+eM5d@G@bla0IdF!4+>4Xq4E9I-Jp=H(-Nf%wx4C z2X70tMR;Xx@FqBH#RY46e?ogf_HCh0XluJhLdk6hpV0Gv4sLDriEioiD;ZEX+%04W z1E+d2VV70xdw`qJB=b- zwGKqKcI|p(^hcOVqB6CyGZt5K8-Et`xlG-WR*h0~O_CN`jPP7lrp`k*IJD5aLNJlx z#5JXA5}JZ%bY1Vz)Xe1>J!_QQm1qSGL0^WUD*PM6jJkY0sY`YDbgOP3AGW^%+Omm( MnG2JqvwQ*(OCzZ?HUIzs delta 618 zcmV-w0+s!hn*oiR0gxnrPkK~XbVOxyV{&P5bZKvH004NLt(L(~+%OP^&$~}y!F9!S zDc8MJAjAP)A)43|XIRH}$96*c^gS$UD*``x>u99D>~q!AqdKrvl(C5=pAg~(SV`kQD?8eL6!AIefheNHxw5?@{C z^5Bbe5=@gPc|6j8IYE-+sX>r3>LaAg`nYx(<5?`E603InTSE-&^ZE&jPsoyrSl0N# zar#e*DLPjR7QqM))ZvT{y#X5>V;-wDIe1&BEy62n zgEzrpD=t{m`xDv=vTqB0LR;H45=w4c_=KLfaBHhibW5jyU&(;FVQ(Qj7&z6FDTfL5 zcpltR?k~2fV8=5_Tj&$oI^PrB7MfN{;MtD3n>lf4KOApOEhE4f$s2yDE@!U08E1?H zLN!l;86!dOO7$|aNUVBG%^2%nOfyD;m7EJpEfoa4tq!=1oNJ&+xzi}ZRhNEbYuBzv ze}t(dDpMO=J7aM*yYYKLpUc!8Y1Jq-+azhB#R$(;W$HY1gF_3wD+Ci6PFz!}CZQ>K zM%VQYP0d`M(X&R$U5QrE5cFjjs=~i9%&5!9le$!QPq*s!@nQQD(Qs@R1OC|avxEW> EOXsH~b^rhX diff --git a/icons/obj/medical/firstaid.dmi b/icons/obj/medical/firstaid.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9744a12f29f6e489752ce53dffca8881b9332166 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iW*8>L*h>0j^s+$-aI0-o2 zWH3G>EGYZx)hiAT4o-G{E-tR^+pc;86*HCu`2{mLJiCzw z=P@u;%n1%FC@TH_CAi?@*C$%ux?1PXoDbd*YH-o`!6TjXKAI;Pih6o?SQrNxUpDqq znDc1Tkx3y6!7EkvZ_&`-yuoCvOJ}#S>gE*^8W|^!&J3F}V>VZ!w)T!+I~&fjF}w(t z$zHpERVL8p5>FS$5RHk+2@8}3g3R0=8gprCN-p5w&|1l&%+0}Nv_VUeTZPNOVCr;b z&Lx}%8^RShH!L+Yn6h1b0p}Fy1zZLSw@-5lB?K)CP+-((cylF_lSf8YgUP`*N|x7S xpQv|2K#;@NbwaBc7B3L!`tIl@BJqNQ;mbe4%?DHiRe<(0c)I$ztaD0e0s!JqcsBq5 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 9999e7e906b..8db0f8b03b9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1229,6 +1229,7 @@ #include "code\datums\components\leash.dm" #include "code\datums\components\life_link.dm" #include "code\datums\components\light_eater.dm" +#include "code\datums\components\limb_applicable.dm" #include "code\datums\components\ling_decoy_brain.dm" #include "code\datums\components\listen_and_repeat.dm" #include "code\datums\components\lock_on_cursor.dm" @@ -2602,6 +2603,7 @@ #include "code\game\objects\items\tail_pin.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" +#include "code\game\objects\items\tourniquet.dm" #include "code\game\objects\items\toy_mechs.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" diff --git a/tools/UpdatePaths/Scripts/95041_tape.txt b/tools/UpdatePaths/Scripts/95041_tape.txt new file mode 100644 index 00000000000..21cf45c7c4a --- /dev/null +++ b/tools/UpdatePaths/Scripts/95041_tape.txt @@ -0,0 +1,2 @@ +/obj/item/stack/sticky_tape/@SUBTYPES : /obj/item/stack/medical/wrap/sticky_tape/@SUBTYPES {@OLD} +/obj/item/stack/medical/gauze/@SUBTYPES : /obj/item/stack/medical/wrap/gauze/@SUBTYPES {@OLD}