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