diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 533df3bfd8c..3ea35232b7d 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -70649,8 +70649,8 @@
"cBx" = (
/obj/structure/rack,
/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/mesh,
/obj/item/reagent_containers/syringe/epinephrine{
pixel_x = -3;
pixel_y = 3
@@ -78135,8 +78135,8 @@
"cPs" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/mesh,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
@@ -84020,8 +84020,8 @@
},
/obj/item/book/manual/wiki/medicine,
/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/mesh,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -86137,8 +86137,8 @@
"ddp" = (
/obj/structure/table/glass,
/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/mesh,
/obj/structure/sign/warning/nosmoking{
pixel_y = 32
},
@@ -90939,8 +90939,8 @@
/obj/structure/table/reinforced,
/obj/effect/turf_decal/bot,
/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/mesh,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 1ff144f42b4..4da950582ed 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -4411,11 +4411,11 @@
/area/maintenance/solars/port/fore)
"ajj" = (
/obj/structure/table,
-/obj/item/stack/medical/ointment{
+/obj/item/stack/medical/mesh{
pixel_x = 3;
pixel_y = -2
},
-/obj/item/stack/medical/bruise_pack{
+/obj/item/stack/medical/suture{
pixel_x = -3;
pixel_y = 2
},
@@ -42141,8 +42141,8 @@
/area/bridge/showroom/corporate)
"bOG" = (
/obj/structure/rack,
-/obj/item/stack/medical/ointment,
-/obj/item/stack/medical/bruise_pack,
+/obj/item/stack/medical/mesh,
+/obj/item/stack/medical/suture,
/obj/item/reagent_containers/syringe/multiver,
/obj/item/reagent_containers/syringe/epinephrine{
pixel_x = -1;
@@ -47206,8 +47206,8 @@
"cap" = (
/obj/structure/table,
/obj/item/stack/medical/gauze,
-/obj/item/stack/medical/ointment,
-/obj/item/stack/medical/bruise_pack,
+/obj/item/stack/medical/mesh,
+/obj/item/stack/medical/suture,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -52983,11 +52983,11 @@
pixel_y = -1
},
/obj/item/reagent_containers/dropper,
-/obj/item/stack/medical/bruise_pack{
+/obj/item/stack/medical/suture{
pixel_x = -2;
pixel_y = 6
},
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/mesh,
/obj/item/healthanalyzer,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -54397,9 +54397,9 @@
/obj/effect/decal/cleanable/blood/gibs/limb,
/obj/structure/rack,
/obj/item/storage/firstaid/regular,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/bruise_pack,
-/obj/item/stack/medical/ointment,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/suture,
+/obj/item/stack/medical/mesh,
/obj/item/clothing/glasses/hud/health,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index c3d053473af..e705dfa4ed9 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -31415,8 +31415,8 @@
/area/maintenance/department/engine)
"bBY" = (
/obj/structure/closet/crate/medical,
-/obj/item/stack/medical/ointment,
-/obj/item/stack/medical/bruise_pack,
+/obj/item/stack/medical/mesh,
+/obj/item/stack/medical/suture,
/turf/open/floor/plating,
/area/maintenance/department/engine)
"bBZ" = (
@@ -36877,7 +36877,7 @@
/turf/open/space,
/area/space/nearstation)
"bNF" = (
-/obj/item/stack/medical/bruise_pack,
+/obj/item/stack/medical/suture,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/engine)
"bNG" = (
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 3bf4dc7740c..b005ae5ad6e 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/airlock_painter = 1,
/obj/item/stack/cable_coil = 4,
/obj/item/stack/cable_coil/five = 6,
- /obj/item/stack/medical/bruise_pack = 1,
+ /obj/item/stack/medical/suture = 1,
/obj/item/stack/rods/ten = 9,
/obj/item/stack/rods/twentyfive = 1,
/obj/item/stack/rods/fifty = 1,
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index a06b96ad9c9..5e02437e04b 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -12,6 +12,7 @@
full_w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
var/value = 0
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/spacecash/Initialize()
. = ..()
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index c9b517e3f57..4633cd685bc 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -13,19 +13,33 @@
novariants = FALSE
item_flags = NOBLUDGEON
var/self_delay = 50
+ var/other_delay = 0
+ var/repeating = FALSE
/obj/item/stack/medical/attack(mob/living/M, mob/user)
. = ..()
+ try_heal(M, user)
+
+
+/obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE)
if(!M.can_inject(user, TRUE))
return
if(M == user)
- user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...")
+ if(!silent)
+ user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...")
if(!do_mob(user, M, self_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
return
+ else if(other_delay)
+ if(!silent)
+ user.visible_message("[user] starts to apply \the [src] on [M].", "You begin applying \the [src] on [M]...")
+ if(!do_mob(user, M, other_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
+ return
+
if(heal(M, user))
log_combat(user, M, "healed", src.name)
use(1)
-
+ if(repeating && amount > 0)
+ try_heal(M, user, TRUE)
/obj/item/stack/medical/proc/heal(mob/living/M, mob/user)
return
@@ -88,6 +102,7 @@
var/stop_bleeding = 1800
self_delay = 20
max_amount = 12
+ grind_results = list(/datum/reagent/cellulose = 2)
/obj/item/stack/medical/gauze/heal(mob/living/M, mob/user)
if(ishuman(M))
@@ -149,3 +164,117 @@
/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?")
return TOXLOSS
+
+/obj/item/stack/medical/suture
+ name = "suture"
+ desc = "Sterile sutures used to seal up cuts and lacerations."
+ gender = PLURAL
+ singular_name = "suture"
+ icon_state = "suture"
+ self_delay = 30
+ other_delay = 10
+ amount = 15
+ max_amount = 15
+ repeating = TRUE
+ var/heal_brute = 10
+ grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
+
+/obj/item/stack/medical/suture/medicated
+ name = "medicated suture"
+ icon_state = "suture_purp"
+ desc = "A suture infused with drugs that speed up wound healing of the treated laceration."
+ heal_brute = 15
+ grind_results = list(/datum/reagent/medicine/polypyr = 2)
+
+/obj/item/stack/medical/suture/heal(mob/living/M, mob/user)
+ . = ..()
+ if(M.stat == DEAD)
+ to_chat(user, "[M] is dead! You can not help [M.p_them()].")
+ return
+ if(iscarbon(M))
+ return heal_carbon(M, user, heal_brute, 0)
+ if(isanimal(M))
+ var/mob/living/simple_animal/critter = M
+ if (!(critter.healable))
+ to_chat(user, "You cannot use \the [src] on [M]!")
+ return FALSE
+ else if (critter.health == critter.maxHealth)
+ to_chat(user, "[M] is at full health.")
+ return FALSE
+ user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].")
+ M.heal_bodypart_damage(heal_brute)
+ return TRUE
+
+ to_chat(user, "You can't heal [M] with the \the [src]!")
+
+/obj/item/stack/medical/mesh
+ name = "regenerative mesh"
+ desc = "A bacteriostatic mesh used to dress burns."
+ gender = PLURAL
+ singular_name = "regenerative mesh"
+ icon_state = "regen_mesh"
+ self_delay = 30
+ other_delay = 10
+ amount = 15
+ max_amount = 15
+ repeating = TRUE
+ var/heal_burn = 10
+ var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened.
+ grind_results = list(/datum/reagent/medicine/spaceacillin = 2)
+
+/obj/item/stack/medical/mesh/Initialize()
+ ..()
+ if(amount == max_amount) //only seal full mesh packs
+ is_open = FALSE
+ icon_state = "regen_mesh_closed"
+
+
+/obj/item/stack/medical/mesh/update_icon()
+ if(!is_open)
+ return
+ . = ..()
+
+/obj/item/stack/medical/mesh/heal(mob/living/M, mob/user)
+ . = ..()
+ if(M.stat == DEAD)
+ to_chat(user, "[M] is dead! You can not help [M.p_them()].")
+ return
+ if(iscarbon(M))
+ return heal_carbon(M, user, 0, heal_burn)
+ to_chat(user, "You can't heal [M] with the \the [src]!")
+
+
+/obj/item/stack/medical/mesh/try_heal(mob/living/M, mob/user, silent = FALSE)
+ if(!is_open)
+ to_chat(user, "You need to open [src] first.")
+ return
+ . = ..()
+
+/obj/item/stack/medical/mesh/AltClick(mob/living/user)
+ if(!is_open)
+ to_chat(user, "You need to open [src] first.")
+ return
+ . = ..()
+
+/obj/item/stack/medical/mesh/attack_hand(mob/user)
+ if(!is_open & user.get_inactive_held_item() == src)
+ to_chat(user, "You need to open [src] first.")
+ return
+ . = ..()
+
+/obj/item/stack/medical/mesh/attack_self(mob/user)
+ if(!is_open)
+ is_open = TRUE
+ to_chat(user, "You open the sterile mesh package.")
+ update_icon()
+ playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE)
+ . = ..()
+
+ /*
+ The idea is for these medical devices to work like a hybrid of the old brute packs and tend wounds,
+ they heal a little at a time, have reduced healing density and does not allow for rapid healing while in combat.
+ However they provice graunular control of where the healing is directed, this makes them better for curing work-related cuts and scrapes.
+
+ The interesting limb targeting mechanic is retained and i still believe they will be a viable choice, especially when healing others in the field.
+ */
+
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 20125f5fe92..5ed1f66a30b 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -230,7 +230,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/wood
novariants = TRUE
- grind_results = list(/datum/reagent/carbon = 20)
+ grind_results = list(/datum/reagent/cellulose = 20) //no lignocellulose or lignin reagents yet,
/obj/item/stack/sheet/mineral/wood/get_main_recipes()
. = ..()
@@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/bamboo
- grind_results = list("carbon" = 5)
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/sheet/mineral/bamboo/get_main_recipes()
. = ..()
@@ -308,6 +308,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
merge_type = /obj/item/stack/sheet/cloth
drop_sound = 'sound/items/handling/cloth_drop.ogg'
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
+ grind_results = list(/datum/reagent/cellulose = 20)
/obj/item/stack/sheet/cloth/get_main_recipes()
. = ..()
@@ -354,6 +355,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
merge_type = /obj/item/stack/sheet/cotton
var/pull_effort = 30
var/loom_result = /obj/item/stack/sheet/cloth
+ grind_results = list(/datum/reagent/cellulose = 20)
/obj/item/stack/sheet/cotton/durathread
name = "raw durathread bundle"
@@ -363,7 +365,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
merge_type = /obj/item/stack/sheet/cotton/durathread
pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
-
+ grind_results = list()
/*
* Cardboard
@@ -429,6 +431,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
throwforce = 0
merge_type = /obj/item/stack/sheet/cardboard
novariants = TRUE
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/sheet/cardboard/get_main_recipes()
. = ..()
@@ -624,6 +627,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
item_state = "sheet-paper"
merge_type = /obj/item/stack/sheet/paperframes
resistance_flags = FLAMMABLE
+ grind_results = list(/datum/reagent/cellulose = 20)
/obj/item/stack/sheet/paperframes/get_main_recipes()
. = ..()
diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm
index b438c863a80..4e5248ac445 100644
--- a/code/game/objects/items/stacks/wrap.dm
+++ b/code/game/objects/items/stacks/wrap.dm
@@ -35,6 +35,7 @@
amount = 25
max_amount = 25
resistance_flags = FLAMMABLE
+ grind_results = list(/datum/reagent/cellulose = 5)
/obj/item/stack/packageWrap/suicide_act(mob/living/user)
user.visible_message("[user] begins wrapping [user.p_them()]self in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index db96eafce5b..16d9a29c0d0 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -32,8 +32,8 @@
return
var/static/items_inside = list(
/obj/item/stack/medical/gauze = 1,
- /obj/item/stack/medical/bruise_pack = 2,
- /obj/item/stack/medical/ointment = 2,
+ /obj/item/stack/medical/suture = 2,
+ /obj/item/stack/medical/mesh = 2,
/obj/item/reagent_containers/hypospray/medipen = 1)
generate_items_inside(items_inside,src)
@@ -103,8 +103,8 @@
return
var/static/items_inside = list(
/obj/item/stack/medical/gauze = 1,
- /obj/item/stack/medical/bruise_pack = 2,
- /obj/item/stack/medical/ointment = 2,
+ /obj/item/stack/medical/suture = 2,
+ /obj/item/stack/medical/mesh = 2,
/obj/item/reagent_containers/hypospray/medipen = 1,
/obj/item/surgical_drapes = 1,
/obj/item/scalpel = 1,
diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm
index 6c852c426d5..4b72ad7df7b 100644
--- a/code/modules/hydroponics/grown/corn.dm
+++ b/code/modules/hydroponics/grown/corn.dm
@@ -38,6 +38,7 @@
throwforce = 0
throw_speed = 3
throw_range = 7
+ grind_results = list(/datum/reagent/cellulose = 10) //really partially hemicellulose
/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, params)
if(W.get_sharpness())
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 9fc1575199b..44ef6fd5775 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -23,6 +23,7 @@
dog_fashion = /datum/dog_fashion/head
drop_sound = 'sound/items/handling/paper_drop.ogg'
pickup_sound = 'sound/items/handling/paper_pickup.ogg'
+ grind_results = list(/datum/reagent/cellulose = 3)
var/extra_headers //For additional styling or other js features.
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 39e79784262..2d8031525ef 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1921,3 +1921,11 @@
color = "#9C5A19"
taste_description = "bananas"
can_synth = TRUE
+
+/datum/reagent/cellulose
+ name = "Cellulose Fibers"
+ description = "A crystaline polydextrose polymer, plants swear by this stuff."
+ reagent_state = SOLID
+ color = "#E6E6DA"
+ taste_mult = 0
+
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 7138851b590..270ee3efb7a 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -232,3 +232,15 @@
results = list(/datum/reagent/medicine/granibitaluri = 1)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/space_cleaner/sterilizine = 1) //haha guys totally not some sort of saline reference!
required_temp = 373
+
+/datum/chemical_reaction/medsuture
+ name = "Medicated Suture"
+ id = "med_suture"
+ required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 30, /datum/reagent/medicine/polypyr = 30) //This might be a bit much, reagent cost should be reviewed after implementation.
+
+/datum/chemical_reaction/medsuture/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/stack/medical/suture/medicated(location)
+ return
+
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index da4da9949e3..650a28a0821 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -700,3 +700,10 @@
/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/slime_extract/grey(location)
+
+/datum/chemical_reaction/cellulose_carbonization
+ name = "Cellulose_Carbonization"
+ id = /datum/reagent/carbon
+ results = list(/datum/reagent/carbon = 1)
+ required_reagents = list(/datum/reagent/cellulose = 1)
+ required_temp = 512
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 94adc210c18..b31426d8c1e 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ