diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 270e70472849..64bffb07e0a4 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -1063,7 +1063,7 @@ /area/ruin/space/has_grav/dangerous_research/lab) "oJ" = ( /obj/structure/closet/crate/medical, -/obj/item/stack/medical/suture/emergency, +/obj/item/stack/medical/suture/ekit, /obj/item/stack/medical/gauze/twelve, /obj/item/reagent_containers/hypospray/medipen/blood_loss, /obj/effect/spawner/random/medical/injector, diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index a6f9737bea90..7215b5fcfd84 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -8302,7 +8302,7 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /obj/structure/table/glass, /obj/item/stack/medical/mesh, -/obj/item/stack/medical/suture/emergency, +/obj/item/stack/medical/suture/ekit, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 725db497bb99..551494a6ce6e 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -54524,7 +54524,7 @@ /area/station/science/breakroom) "nWM" = ( /obj/structure/table, -/obj/item/stack/medical/suture/emergency, +/obj/item/stack/medical/suture/ekit, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -71110,7 +71110,7 @@ /turf/open/floor/iron/white/textured, /area/station/medical/office) "ssx" = ( -/obj/item/stack/medical/suture/emergency, +/obj/item/stack/medical/suture/ekit, /obj/item/stack/medical/gauze/improvised{ pixel_y = 12 }, diff --git a/code/__DEFINES/living.dm b/code/__DEFINES/living.dm index a8e6b86f8de2..5d3f2c52145b 100644 --- a/code/__DEFINES/living.dm +++ b/code/__DEFINES/living.dm @@ -19,6 +19,8 @@ #define COMSIG_CARBON_PAIN_GAINED "pain_gain" /// Sent when a carbon loses pain. (source = mob/living/carbon/human, obj/item/bodypart/affected_bodypart, amount, type) #define COMSIG_CARBON_PAIN_LOST "pain_loss" +/// Sent when a temperature pack is applied to a mob. (source = obj/item/temperature_pack) +#define COMISG_TEMPERATURE_PACK_ENABLED "temperature_pack_enabled" /// Sent when a temperature pack runs out of juice. (source = obj/item/temperature_pack) #define COMSIG_TEMPERATURE_PACK_EXPIRED "temp_pack_expired" @@ -134,6 +136,11 @@ /// Calculates oxyloss cap #define MAX_OXYLOSS(maxHealth) (maxHealth * 2) +// Frozen item temperature pack defaults +#define FROZEN_ITEM_PAIN_RATE 0.1 // so cold that it barely heals +#define FROZEN_ITEM_PAIN_MODIFIER 0.25 +#define FROZEN_ITEM_TEMPERATURE_CHANGE -2 KELVIN + // Some source defines for pain and consciousness // Consciousness ones are human readable because of laziness (they are shown in cause of death) #define PAINSHOCK "traumatic shock" diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm index 4de4454c8904..de94a313fef4 100644 --- a/code/datums/elements/frozen.dm +++ b/code/datums/elements/frozen.dm @@ -31,6 +31,8 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 RegisterSignal(target, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(shatter_on_landed)) RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(shatter_on_throw)) RegisterSignal(target, COMSIG_OBJ_UNFREEZE, PROC_REF(on_unfreeze)) + // NON-MODULE CHANGE + target.AddElement(/datum/element/temperature_pack, FROZEN_ITEM_PAIN_RATE, FROZEN_ITEM_PAIN_MODIFIER, FROZEN_ITEM_TEMPERATURE_CHANGE) /datum/element/frozen/Detach(datum/source, ...) var/obj/obj_source = source @@ -39,6 +41,8 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 obj_source.name = replacetext(obj_source.name, "frozen ", "") obj_source.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLOB.freon_color_matrix) obj_source.alpha += 25 + // NON-MODULE CHANGE + obj_source.RemoveElement(/datum/element/temperature_pack, FROZEN_ITEM_PAIN_RATE, FROZEN_ITEM_PAIN_MODIFIER, FROZEN_ITEM_TEMPERATURE_CHANGE) if (isorgan(source)) var/obj/item/organ/organ = source diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index bb40bbc3b581..3a7ee8ca33c2 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -349,10 +349,10 @@ icon_state = "brutepack" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - heal_brute = 40 + heal_brute = 25 self_delay = 4 SECONDS other_delay = 2 SECONDS - grind_results = list(/datum/reagent/medicine/c2/libital = 10) + grind_results = list(/datum/reagent/medicine/c2/libital = 3) merge_type = /obj/item/stack/medical/bruise_pack can_inject_flags = INJECT_CHECK_IGNORE_SPECIES @@ -360,6 +360,9 @@ 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/bruise_pack/ekit + amount = 2 + /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. " @@ -592,14 +595,8 @@ merge_type = /obj/item/stack/medical/suture heal_sound = 'maplestation_modules/sound/items/snip.ogg' -/obj/item/stack/medical/suture/emergency - name = "emergency sutures" - desc = "A value pack of cheap sutures, not very good at repairing damage, but still decent at stopping bleeding." - singular_name = "emergency suture" - heal_brute = 5 - amount = 5 - max_amount = 5 - merge_type = /obj/item/stack/medical/suture/emergency +/obj/item/stack/medical/suture/ekit + amount = 4 /obj/item/stack/medical/suture/medicated name = "medicated sutures" @@ -627,7 +624,7 @@ heal_burn = 5 flesh_regeneration = 5 sanitization = 1 - grind_results = list(/datum/reagent/medicine/c2/lenturi = 10) + grind_results = list(/datum/reagent/medicine/c2/lenturi = 3) merge_type = /obj/item/stack/medical/ointment can_inject_flags = INJECT_CHECK_IGNORE_SPECIES @@ -635,6 +632,9 @@ user.visible_message(span_suicide("[user] is squeezing [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/ointment/ekit + amount = 4 + /obj/item/stack/medical/mesh name = "regenerative mesh" desc = "A bacteriostatic mesh used to dress burns." diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 21adeac18aa6..40f9c5c67ac8 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -756,7 +756,8 @@ /obj/item/stack/update_name(updates) . = ..() - maptext = (ismob(loc) || loc?.atom_storage) ? MAPTEXT("[amount]") : "" + if(max_amount != 1) + maptext = (ismob(loc) || loc?.atom_storage) ? MAPTEXT("[amount]") : "" if(!singular_name) return if(amount > 1) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index cb7b9a3584e1..31f7f57814aa 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -97,8 +97,7 @@ return var/static/items_inside = list( /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/bruise_pack = 1, - /obj/item/stack/medical/suture = 1, + /obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, /obj/item/reagent_containers/hypospray/medipen/morphine = 1, @@ -121,13 +120,15 @@ return var/static/items_inside = list( /obj/item/healthanalyzer/simple = 1, + /obj/item/hemostat/tweezers = 1, /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/suture/emergency = 1, - /obj/item/stack/medical/ointment = 1, - /obj/item/reagent_containers/hypospray/medipen/ekit = 2, - /obj/item/reagent_containers/hypospray/medipen/emergency_painkiller = 1, - /obj/item/storage/pill_bottle/iron = 1, + /obj/item/stack/medical/bruise_pack/ekit = 1, + /obj/item/stack/medical/ointment/ekit = 1, + /obj/item/temperature_pack/cold = 1, /obj/item/shock_blanket/emergency = 1, + /obj/item/reagent_containers/hypospray/medipen/ekit = 1, + /obj/item/reagent_containers/hypospray/medipen/blood_loss = 1, + /obj/item/reagent_containers/hypospray/medipen/emergency_painkiller = 1, ) generate_items_inside(items_inside,src) @@ -222,12 +223,12 @@ if(empty) return var/static/items_inside = list( - /obj/item/storage/pill_bottle/multiver/less = 1, /obj/item/reagent_containers/syringe/syriniver = 3, + /obj/item/storage/pill_bottle/multiver/less = 1, /obj/item/storage/pill_bottle/potassiodide = 1, /obj/item/reagent_containers/hypospray/medipen/penacid = 1, /obj/item/healthanalyzer/simple/disease = 1, - ) + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/o2 @@ -249,9 +250,11 @@ return var/static/items_inside = list( /obj/item/reagent_containers/syringe/convermol = 3, + /obj/item/storage/pill_bottle/iron = 1, + /obj/item/reagent_containers/hypospray/medipen/blood_loss = 1, /obj/item/reagent_containers/hypospray/medipen/salbutamol = 1, /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/storage/pill_bottle/iron = 1) + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/brute @@ -273,8 +276,8 @@ return var/static/list/items_inside = list( /obj/item/reagent_containers/pill/patch/libital = 3, - /obj/item/stack/medical/gauze = 1, /obj/item/storage/pill_bottle/probital = 1, + /obj/item/stack/medical/suture = 1, /obj/item/reagent_containers/hypospray/medipen/salacid = 1, /obj/item/reagent_containers/hypospray/medipen/brute_painkiller = 1, ) diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 0cb8e0acd5e6..3df0c3197020 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -90,7 +90,6 @@ /obj/item/reagent_containers/cup/bottle/morphine, /obj/item/reagent_containers/cup/bottle/toxin, /obj/item/reagent_containers/cup/beaker/large, - /obj/item/reagent_containers/pill/insulin, /obj/item/stack/medical/gauze, /obj/item/storage/box/bandages, /obj/item/storage/box/beakers, @@ -105,7 +104,6 @@ /obj/item/defibrillator/loaded, /obj/item/reagent_containers/blood/o_minus, /obj/item/storage/pill_bottle/mining, - /obj/item/reagent_containers/pill/neurine, /obj/item/stack/medical/bone_gel = 2, /obj/item/vending_refill/medical, /obj/item/vending_refill/drugs, diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 2264a9a5be98..b63235d6b929 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -124,7 +124,7 @@ ignore_flags = 1 //so you can medipen through spacesuits reagent_flags = DRAWABLE flags_1 = null - list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/medicine/coagulant = 2) + list_reagents = list(/datum/reagent/medicine/epinephrine = 12.5, /datum/reagent/toxin/formaldehyde = 2.5) custom_price = PAYCHECK_CREW custom_premium_price = PAYCHECK_COMMAND var/label_examine = TRUE diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index bc23238acc16..a12fc5e5a57d 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -160,6 +160,9 @@ list_reagents = list(/datum/reagent/medicine/mutadone = 50) rename_with_volume = TRUE +/obj/item/reagent_containers/pill/mutadone/less + list_reagents = list(/datum/reagent/medicine/mutadone = 5) + /obj/item/reagent_containers/pill/salicylic name = "salicylic acid pill" desc = "Used to dull pain." diff --git a/code/modules/surgery/surgery_tools.dm b/code/modules/surgery/surgery_tools.dm index 4a647227e068..895174208baf 100644 --- a/code/modules/surgery/surgery_tools.dm +++ b/code/modules/surgery/surgery_tools.dm @@ -62,6 +62,15 @@ icon = 'icons/mob/silicon/robot_items.dmi' icon_state = "toolkit_medborg_hemostat" +/obj/item/hemostat/tweezers + name = "tweezers" + desc = "Precision instrument for grasping small objects." + toolspeed = 1.5 + +/obj/item/hemostat/tweezers/Initialize(mapload) + . = ..() + transform = transform.Scale(0.5, 0.5) + /obj/item/cautery name = "cautery" desc = "This stops bleeding." diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 8f45312f4adc..acb12398c5bd 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -78,26 +78,23 @@ 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/reagent_containers/pill/patch/libital = 5, - /obj/item/reagent_containers/pill/patch/aiuri = 5, - /obj/item/reagent_containers/syringe/convermol = 2, - /obj/item/reagent_containers/pill/insulin = 5, - /obj/item/reagent_containers/cup/bottle/multiver = 2, - /obj/item/reagent_containers/cup/bottle/syriniver = 2, /obj/item/reagent_containers/cup/bottle/epinephrine = 3, /obj/item/reagent_containers/cup/bottle/morphine = 4, + /obj/item/reagent_containers/cup/bottle/multiver = 2, /obj/item/reagent_containers/cup/bottle/potass_iodide = 1, /obj/item/reagent_containers/cup/bottle/salglu_solution = 3, + /obj/item/reagent_containers/cup/bottle/syriniver = 2, /obj/item/reagent_containers/cup/bottle/toxin = 3, - /obj/item/reagent_containers/syringe/antiviral = 6, - /obj/item/reagent_containers/medigel/libital = 2, /obj/item/reagent_containers/medigel/aiuri = 2, + /obj/item/reagent_containers/medigel/libital = 2, /obj/item/reagent_containers/medigel/sterilizine = 1, - ) - contraband = list( - /obj/item/reagent_containers/pill/tox = 3, - /obj/item/reagent_containers/pill/morphine = 4, - /obj/item/reagent_containers/pill/multiver = 6, + /obj/item/reagent_containers/pill/insulin = 6, + /obj/item/reagent_containers/pill/mutadone/less = 3, + /obj/item/reagent_containers/pill/neurine = 3, + /obj/item/reagent_containers/pill/patch/aiuri = 5, + /obj/item/reagent_containers/pill/patch/libital = 5, + /obj/item/reagent_containers/syringe/antiviral = 6, + /obj/item/reagent_containers/syringe/convermol = 2, ) premium = list( /obj/item/reagent_containers/medigel/synthflesh = 2, diff --git a/maplestation_modules/code/datums/elements/temperature_pack.dm b/maplestation_modules/code/datums/elements/temperature_pack.dm index 6b1d366b2b08..00a192104b9c 100644 --- a/maplestation_modules/code/datums/elements/temperature_pack.dm +++ b/maplestation_modules/code/datums/elements/temperature_pack.dm @@ -23,13 +23,13 @@ src.pain_modifier_on_limb = pain_modifier_on_limb src.temperature_change = temperature_change - RegisterSignal(target, COMSIG_ITEM_ATTACK_SECONDARY, PROC_REF(try_apply_to_limb)) + RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM_SECONDARY, PROC_REF(try_apply_to_limb)) RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_text)) /datum/element/temperature_pack/Detach(obj/target) . = ..() UnregisterSignal(target, list( - COMSIG_ITEM_ATTACK_SECONDARY, + COMSIG_ITEM_INTERACTING_WITH_ATOM_SECONDARY, COMSIG_ATOM_EXAMINE, )) @@ -45,52 +45,50 @@ /** * Try to apply [source] item onto [target] mob from [user]. */ -/datum/element/temperature_pack/proc/try_apply_to_limb(obj/item/source, atom/target, mob/user, params) +/datum/element/temperature_pack/proc/try_apply_to_limb(obj/item/source, mob/user, atom/target, params) SIGNAL_HANDLER - . = SECONDARY_ATTACK_CALL_NORMAL // Normal operations + if(!isliving(target)) + return NONE - if(!ishuman(target)) - return - - var/mob/living/carbon/human/target_mob = target + var/mob/living/target_mob = target var/targeted_zone = target_mob.zone_selected - if(!target_mob.pain_controller) - return + return NONE if(target_mob.stat == DEAD) target_mob.balloon_alert(user, "[target_mob.p_theyre()] dead!") - return - - . = SECONDARY_ATTACK_CONTINUE_CHAIN // Past this point, no afterattacks + return ITEM_INTERACT_BLOCKING for(var/datum/status_effect/temperature_pack/pre_existing_effect in target_mob.status_effects) if(pre_existing_effect.pressed_item == source) - return + return ITEM_INTERACT_BLOCKING // Already applying this item if(pre_existing_effect.targeted_zone == targeted_zone) target_mob.balloon_alert(user, "something's pressed there!") - return - - . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN // And past THIS point, no attack + return ITEM_INTERACT_BLOCKING // Already an effect on this limb INVOKE_ASYNC(src, PROC_REF(apply_to_limb), source, target, user, targeted_zone) + return ITEM_INTERACT_SUCCESS /** * Actually apply [parent] temperature pack to [targeted_zone] limb on [target] mob from [user]. */ -/datum/element/temperature_pack/proc/apply_to_limb(obj/item/parent, mob/living/carbon/target, mob/user, targeted_zone) +/datum/element/temperature_pack/proc/apply_to_limb(obj/item/parent, mob/living/target, mob/user, targeted_zone) + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(targeted_zone) + if(!targeted_bodypart) + target.balloon_alert(user, "no [parse_zone(targeted_zone)]!") + return + if(!IS_ORGANIC_LIMB(targeted_bodypart)) + target.balloon_alert(user, "not organic!") + return if(!do_after(user, 0.5 SECONDS, target)) return - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(targeted_zone) user.visible_message( span_notice("[user] press [parent] against [target == user ? "[target.p_their()]" : "[target]'s" ] [targeted_bodypart.plaintext_zone]."), span_notice("You press [parent] against [target == user ? "your" : "[target]'s" ] [targeted_bodypart.plaintext_zone].") ) - var/selected_effect = temperature_change > 0 \ - ? /datum/status_effect/temperature_pack/heat \ - : /datum/status_effect/temperature_pack/cold + var/selected_effect = temperature_change > 0 ? /datum/status_effect/temperature_pack/heat : /datum/status_effect/temperature_pack/cold target.apply_status_effect( selected_effect, diff --git a/maplestation_modules/code/datums/pain/pain_implements.dm b/maplestation_modules/code/datums/pain/pain_implements.dm index 7ced35481f86..0d4e2a69973c 100644 --- a/maplestation_modules/code/datums/pain/pain_implements.dm +++ b/maplestation_modules/code/datums/pain/pain_implements.dm @@ -1,35 +1,15 @@ // -- Implements and equipment to help reduce pain. -- // Temperature pack stuff - things you can press to people to help reduce pain. -/// Heal rate and modifier for generic items that are frozen. -#define FROZEN_ITEM_PAIN_RATE 2 -#define FROZEN_ITEM_PAIN_MODIFIER 0.5 -#define FROZEN_ITEM_TEMPERATURE_CHANGE -5 - // Holding a beer to your busted arm, now that's classic /obj/item/reagent_containers/cup/glass/bottle/beer/Initialize(mapload) . = ..() if(reagents.get_reagent_amount(/datum/reagent/consumable/ethanol/beer) > 1) - AddElement(/datum/element/temperature_pack, \ + AddElement( \ + /datum/element/temperature_pack, \ pain_heal_rate = 0.3, \ pain_modifier_on_limb = 0.9, \ - temperature_change = -2) - -// Frozen items become usable temperature packs. -/datum/element/frozen/Attach(datum/target) - . = ..() - if(. == ELEMENT_INCOMPATIBLE) - return - if(!isitem(target)) - return - - target.AddElement(/datum/element/temperature_pack, FROZEN_ITEM_PAIN_RATE, FROZEN_ITEM_PAIN_MODIFIER, FROZEN_ITEM_TEMPERATURE_CHANGE) - -/datum/element/frozen/Detach(datum/source, ...) - . = ..() - if(!isitem(source)) - return - - source.RemoveElement(/datum/element/temperature_pack, FROZEN_ITEM_PAIN_RATE, FROZEN_ITEM_PAIN_MODIFIER, FROZEN_ITEM_TEMPERATURE_CHANGE) + temperature_change = COLD_DRINK, \ + ) /// Temperature packs (heat packs, cold packs). Apply to hurt limb to un-hurty. /obj/item/temperature_pack @@ -100,11 +80,13 @@ * Activate [src] from [user], making it into a temperature pack that can be used, that expires in 5 minutes. */ /obj/item/temperature_pack/proc/activate_pack(mob/user) + SEND_SIGNAL(src, COMISG_TEMPERATURE_PACK_ENABLED) addtimer(CALLBACK(src, PROC_REF(deactivate_pack)), 5 MINUTES) to_chat(user, span_notice("You crack [src], [temperature_change > 0 ? "heating it up" : "cooling it down"].")) AddElement(/datum/element/temperature_pack, pain_heal_amount, pain_limb_modifier, temperature_change) active = TRUE update_appearance() + playsound(src, 'sound/effects/wounds/crack2.ogg', 25, TRUE) /** * Deactivate [src], making it unusable, and sending signal [COMSIG_TEMPERATURE_PACK_EXPIRED]. @@ -118,21 +100,21 @@ desc = "A used up [name]. It's no use to anyone anymore." update_appearance() -// Head packs have a stronger modifier, but heals less. +// Heat packs heal pain directly /obj/item/temperature_pack/heat name = "heat pack" desc = "A heat pack. Crack it to turn it on and apply it to an aching limb to reduce joint stress and moderate pain." - temperature_change = 5 - pain_heal_amount = 2 - pain_limb_modifier = 0.5 + temperature_change = 1 KELVIN + pain_heal_amount = 3 + pain_limb_modifier = 0.8 -// Cold packs heal more, but have a weaker modifier. +// Cold packs cause the limb to go numb - combined with a mild painkiller like paracetamol and the limb loses feeling entirely /obj/item/temperature_pack/cold name = "cold pack" desc = "A cold pack. Crack it on and apply it to a hurt limb to abate sharp pain." - temperature_change = -5 - pain_heal_amount = 3 - pain_limb_modifier = 0.75 + temperature_change = -1 KELVIN + pain_heal_amount = 1 + pain_limb_modifier = 0.5 /obj/item/reagent_containers/pill/aspirin name = "aspirin pill" @@ -323,6 +305,80 @@ inhand_icon_state = "oxapen" list_reagents = list(/datum/reagent/medicine/painkiller/specialized/anurifen = 10) // ~20-25 pain healing (if burn pain, per limb) +/obj/item/reagent_containers/chem_pack/saline + name = "saline-glucose pack" + desc = "A plastic pressure bag filled with a sterile saline-glucose solution for IV administration. \ + Used to treat hypovolemia and dehydration." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/saline/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/medicine/salglu_solution, volume) + +/obj/item/reagent_containers/chem_pack/potassium_iodide + name = "potassium iodide pack" + desc = "A plastic pressure bag filled with a potassium iodide solution for IV administration. \ + Used to treat radiation exposure." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/potassium_iodide/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/medicine/potass_iodide, volume * 0.5) + +/obj/item/reagent_containers/chem_pack/epinephrine + name = "epinephrine pack" + desc = "A plastic pressure bag filled with a epinephrine solution, diluted with saline-glucose, for IV administration. \ + Used to treat severe allergic reactions, shock, or cardiac arrest." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/epinephrine/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/medicine/epinephrine, volume * 0.25) + reagents.add_reagent(/datum/reagent/medicine/salglu_solution, volume * 0.25) + +/obj/item/reagent_containers/chem_pack/morphine + name = "morphine pack" + desc = "A plastic pressure bag filled with a morphine solution, diluted with paracetamol, for IV administration. \ + Used to treat major to severe pain or shock." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/morphine/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/medicine/painkiller/morphine, volume * 0.2) + reagents.add_reagent(/datum/reagent/medicine/painkiller/paracetamol, volume * 0.3) + +/obj/item/reagent_containers/chem_pack/ondasteron + name = "ondansetron pack" + desc = "A plastic pressure bag filled with an ondansetron solution, diluted with saline-glucose, for IV administration. \ + Used to combat nausea caused by other strong painkillers or surgical anesthesia." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/ondasteron/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/medicine/ondansetron, volume * 0.25) + reagents.add_reagent(/datum/reagent/medicine/salglu_solution, volume * 0.25) + +/obj/item/reagent_containers/chem_pack/vitamins + name = "vitamin pack" + desc = "A plastic pressure bag filled with a mixture of vitamins and minerals for IV administration. \ + Used to treat malnutrition and vitamin deficiencies, particularly for patients incapable of (or unwilling to) eat." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/vitamins/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, volume * 0.1) + reagents.add_reagent(/datum/reagent/consumable/nutriment, volume * 0.4) + +/obj/item/reagent_containers/chem_pack/syriniver + name = "syriniver pack" + desc = "A plastic pressure bag filled with a syriniver solution for IV administration. \ + Used to treat toxin exposure." + sealed = TRUE + +/obj/item/reagent_containers/chem_pack/syriniver/Initialize(mapload, vol) + . = ..() + reagents.add_reagent(/datum/reagent/medicine/c2/syriniver, volume * 0.5) + /datum/armor/shock_blanket laser = 20 energy = 20 @@ -502,6 +558,15 @@ ) ), ) + added_premium = list( + /obj/item/reagent_containers/chem_pack/epinephrine = 2, + /obj/item/reagent_containers/chem_pack/morphine = 2, + /obj/item/reagent_containers/chem_pack/ondasteron = 2, + /obj/item/reagent_containers/chem_pack/potassium_iodide = 2, + /obj/item/reagent_containers/chem_pack/syriniver = 2, + /obj/item/reagent_containers/chem_pack/vitamins = 1, + /obj/item/reagent_containers/chem_pack/saline = 3, + ) /obj/machinery/vending/medical theme = "operating_computer" diff --git a/maplestation_modules/code/datums/pain/pain_reagents/painkiller_reactions.dm b/maplestation_modules/code/datums/pain/pain_reagents/painkiller_reactions.dm index dece97c37bc4..6a9dc0c5eb61 100644 --- a/maplestation_modules/code/datums/pain/pain_reagents/painkiller_reactions.dm +++ b/maplestation_modules/code/datums/pain/pain_reagents/painkiller_reactions.dm @@ -30,7 +30,7 @@ required_temp = 250 optimal_temp = 200 overheat_temp = 50 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPONENT /datum/chemical_reaction/medicine/aspirin_para_coffee results = list(/datum/reagent/medicine/painkiller/aspirin_para_coffee = 3) @@ -83,3 +83,21 @@ results = list(/datum/reagent/medicine/painkiller/local_anesthetic/lidocaine = 3) required_reagents = list(/datum/reagent/medicine/epinephrine = 1, /datum/reagent/hydrogen = 1, /datum/reagent/consumable/salt = 1) reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_HEALING | REACTION_TAG_OTHER | REACTION_TAG_DRUG | REACTION_TAG_PAIN + +/datum/chemical_reaction/medicine/glutamic_acid + results = list(/datum/reagent/glutamic_acid = 3) + required_reagents = list(/datum/reagent/consumable/flour = 1, /datum/reagent/consumable/caramel = 1, /datum/reagent/ammonia = 1) + required_catalysts = list(/datum/reagent/toxin/acid = 1) + reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_COMPONENT + optimal_ph_min = 2 + optimal_ph_max = 4 + required_temp = 425 + optimal_temp = 450 + overheat_temp = 475 + +/datum/chemical_reaction/medicine/coagulant + results = list(/datum/reagent/medicine/coagulant = 3) + // i based this off of the irl recipe for "thrombin" which is made from glutamic acid, potassium, and calcium + // but we don't have calcium, and using milk would be a bit goofy, so sugar will do + required_reagents = list(/datum/reagent/glutamic_acid = 1, /datum/reagent/potassium = 1, /datum/reagent/consumable/sugar = 1) + reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_HEALING | REACTION_TAG_OXY | REACTION_TAG_OTHER diff --git a/maplestation_modules/code/datums/pain/pain_reagents/painkiller_related_chems.dm b/maplestation_modules/code/datums/pain/pain_reagents/painkiller_related_chems.dm index 948531773b9f..0fe6f57856ff 100644 --- a/maplestation_modules/code/datums/pain/pain_reagents/painkiller_related_chems.dm +++ b/maplestation_modules/code/datums/pain/pain_reagents/painkiller_related_chems.dm @@ -6,8 +6,23 @@ description = "A pungent liquid that's often used in preservatives and synthesizing of other chemicals." reagent_state = LIQUID chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 2 * REAGENTS_METABOLISM color = "#c7a9c9" ph = 7 + taste_description = "salt" + +// Component in sanguirite, also umami +/datum/reagent/glutamic_acid + name = "Glutamic Acid" + description = "An amino acid synthesized from the fermentation of gluten. Known for its novel flavor, \ + which is often described as 'umami' or savory. Also used in synthesizing other chemicals." + reagent_state = SOLID + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 3 * REAGENTS_METABOLISM + color = "#ffdead" + ph = 3.2 + taste_description = "umami" + taste_mult = 4 // Diphenhydramine can be upgraded into Dimenhydrinate, less good against allergens but better against nausea /datum/reagent/medicine/dimenhydrinate diff --git a/maplestation_modules/code/datums/pain/pain_status_effects/temp_pack.dm b/maplestation_modules/code/datums/pain/pain_status_effects/temp_pack.dm index 59d67bb203d6..116abae63f92 100644 --- a/maplestation_modules/code/datums/pain/pain_status_effects/temp_pack.dm +++ b/maplestation_modules/code/datums/pain/pain_status_effects/temp_pack.dm @@ -3,7 +3,7 @@ id = "temp_pack" status_type = STATUS_EFFECT_MULTIPLE on_remove_on_mob_delete = TRUE - tick_interval = 5 SECONDS + tick_interval = 3 SECONDS processing_speed = STATUS_EFFECT_NORMAL_PROCESS alert_type = null /// The item we're using to heal pain. @@ -38,11 +38,7 @@ return ..() /datum/status_effect/temperature_pack/on_apply() - if(!ishuman(owner)) - return FALSE - - var/mob/living/carbon/human/human_owner = owner - if(!human_owner.pain_controller || human_owner.stat == DEAD) + if(!owner.pain_controller || owner.stat == DEAD) return FALSE if(QDELETED(pressed_item)) @@ -52,34 +48,34 @@ return FALSE for(var/datum/status_effect/temperature_pack/pre_existing_effect in owner.status_effects) - if(pre_existing_effect == src) - continue if(pre_existing_effect.targeted_zone == targeted_zone) return FALSE var/obj/item/bodypart/held_bodypart = owner.get_bodypart(targeted_zone) - if(!held_bodypart) + if(!held_bodypart || !IS_ORGANIC_LIMB(held_bodypart)) return FALSE held_bodypart.bodypart_pain_modifier *= pain_modifier pressed_item.AddComponent(/datum/component/make_item_slow) - RegisterSignals(pressed_item, list(COMSIG_QDELETING, COMSIG_ITEM_DROPPED, COMSIG_TEMPERATURE_PACK_EXPIRED), PROC_REF(stop_effects)) + RegisterSignals(pressed_item, list(COMSIG_QDELETING, COMSIG_ITEM_DROPPED, COMSIG_TEMPERATURE_PACK_EXPIRED), PROC_REF(stop_effects_comsig)) if(holder != owner) RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(check_adjacency)) return TRUE -/datum/status_effect/temperature_pack/tick() - if(QDELETED(holder) || QDELETED(pressed_item) || owner.stat == DEAD || !holder.is_holding(pressed_item)) +/datum/status_effect/temperature_pack/tick(seconds_between_ticks) + var/obj/item/bodypart/held_bodypart = owner.get_bodypart(targeted_zone) + if(QDELETED(holder) || QDELETED(pressed_item) || owner.stat == DEAD || !holder.is_holding(pressed_item) || QDELETED(held_bodypart)) stop_effects(silent = TRUE) return - if(temperature_change) - owner.adjust_body_temperature(temperature_change, owner.bodytemp_cold_damage_limit + 5 KELVIN, owner.bodytemp_heat_damage_limit - 5 KELVIN) - var/obj/item/bodypart/held_bodypart = owner.get_bodypart(targeted_zone) - if(held_bodypart && prob(66)) - owner.heal_pain(pain_heal_amount, targeted_zone) - if(prob(10) && held_bodypart.get_modified_pain() > 0) - to_chat(owner, span_italics(span_notice("[pressed_item] dulls the pain in your [held_bodypart.name] a little."))) + if(temperature_change != 0) + owner.adjust_body_temperature(temperature_change * seconds_between_ticks, owner.bodytemp_cold_damage_limit + 5 KELVIN, owner.bodytemp_heat_damage_limit - 5 KELVIN) + if(temperature_change < 0) + held_bodypart.heal_damage(1 * seconds_between_ticks) + if(pain_heal_amount > 0) + owner.heal_pain(pain_heal_amount * seconds_between_ticks, targeted_zone) + if(SPT_PROB(10, seconds_between_ticks) && held_bodypart.get_modified_pain() > 0) + to_chat(owner, span_smallnoticeital("[pressed_item] dulls the pain in your [held_bodypart.name] a little.")) /** * Check on move whether [holder] is still adjacent to [owner]. @@ -91,11 +87,16 @@ stop_effects(silent = FALSE) /** - * Stop the effects of this status effect, deleting it, and sending a message if [silent] is TRUE. + * Signal handler to stop effects when [pressed_item] is deleted, dropped, or expired. */ -/datum/status_effect/temperature_pack/proc/stop_effects(datum/source, silent = FALSE) +/datum/status_effect/temperature_pack/proc/stop_effects_comsig(datum/source) SIGNAL_HANDLER + stop_effects(silent = FALSE) +/** + * Stop the effects of this status effect, deleting it, and sending a message if [silent] is TRUE. + */ +/datum/status_effect/temperature_pack/proc/stop_effects(datum/source, silent = FALSE) if(!silent && !QDELETED(holder) && !QDELETED(pressed_item)) to_chat(holder, span_notice("You stop pressing [pressed_item] against [owner == holder ? "yourself":"[owner]"].")) qdel(src)