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)