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 f1e1a9f5f02..ce998dbb391 100644
Binary files a/icons/map_icons/items/_item.dmi and b/icons/map_icons/items/_item.dmi differ
diff --git a/icons/obj/medical/firstaid.dmi b/icons/obj/medical/firstaid.dmi
new file mode 100644
index 00000000000..9744a12f29f
Binary files /dev/null and b/icons/obj/medical/firstaid.dmi differ
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}