diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm
index 38b6376716..d78bd799a2 100644
--- a/code/datums/components/gps.dm
+++ b/code/datums/components/gps.dm
@@ -44,6 +44,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_AltClick)
+ RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
///Called on COMSIG_ITEM_ATTACK_SELF
/datum/component/gps/item/proc/interact(datum/source, mob/user)
@@ -54,6 +55,17 @@ GLOBAL_LIST_EMPTY(GPS_list)
/datum/component/gps/item/proc/on_examine(datum/source, mob/user, list/examine_list)
examine_list += "Alt-click to switch it [tracking ? "off":"on"]."
+/datum/component/gps/item/proc/on_requesting_context_from_item(
+ obj/source,
+ list/context,
+ obj/item/held_item,
+ mob/living/user,
+)
+ SIGNAL_HANDLER
+
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, tracking ? "Turn off" : "Turn on")
+ return CONTEXTUAL_SCREENTIP_SET
+
///Called on COMSIG_ATOM_EMP_ACT
/datum/component/gps/item/proc/on_emp_act(datum/source, severity)
emped = TRUE
diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm
index b8d629273b..4b0e58df18 100644
--- a/code/datums/components/rotation.dm
+++ b/code/datums/components/rotation.dm
@@ -44,6 +44,7 @@
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage)
if(rotation_flags & ROTATION_WRENCH)
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot)
+ RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
/datum/component/simple_rotation/proc/add_verbs()
if(rotation_flags & ROTATION_VERBS)
@@ -63,7 +64,7 @@
AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise
/datum/component/simple_rotation/proc/remove_signals()
- UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY))
+ UnregisterSignal(parent, list(COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE, COMSIG_PARENT_ATTACKBY))
/datum/component/simple_rotation/RegisterWithParent()
add_verbs()
@@ -157,6 +158,21 @@
/datum/component/simple_rotation/proc/default_after_rotation(mob/user, rotation_type)
to_chat(user,"You [rotation_type == ROTATION_FLIP ? "flip" : "rotate"] [parent].")
+/datum/component/simple_rotation/proc/on_requesting_context_from_item(
+ obj/source,
+ list/context,
+ obj/item/held_item,
+ mob/living/user,
+)
+ var/rotation = (rotation_flags & ROTATION_FLIP) ? "Flip" : "Rotate [rotation_flags & ROTATION_CLOCKWISE ? "clockwise" : "counter-clockwise"]"
+
+ if(rotation_flags & ROTATION_ALTCLICK)
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, rotation)
+ . = CONTEXTUAL_SCREENTIP_SET
+ if(held_item?.tool_behaviour == TOOL_WRENCH && (rotation_flags & ROTATION_WRENCH))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, rotation)
+ . = CONTEXTUAL_SCREENTIP_SET
+
/atom/movable/proc/simple_rotate_clockwise()
set name = "Rotate Clockwise"
set category = "Object"
diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm
index 0a56095437..5f57b4fce3 100644
--- a/code/datums/elements/mob_holder.dm
+++ b/code/datums/elements/mob_holder.dm
@@ -23,18 +23,30 @@
src.proctype = proctype
src.escape_on_find = escape_on_find
+ RegisterSignal(target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
RegisterSignal(target, COMSIG_CLICK_ALT, .proc/mob_try_pickup)
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine)
/datum/element/mob_holder/Detach(datum/source, force)
. = ..()
- UnregisterSignal(source, COMSIG_CLICK_ALT)
- UnregisterSignal(source, COMSIG_PARENT_EXAMINE)
+ UnregisterSignal(source, list(COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, COMSIG_CLICK_ALT, COMSIG_PARENT_EXAMINE))
/datum/element/mob_holder/proc/on_examine(mob/living/source, mob/user, list/examine_list)
if(ishuman(user) && !istype(source.loc, /obj/item/clothing/head/mob_holder))
examine_list += "Looks like [source.p_they(TRUE)] can be picked up with Alt+Click!"
+/datum/element/mob_holder/proc/on_requesting_context_from_item(
+ obj/source,
+ list/context,
+ obj/item/held_item,
+ mob/living/user,
+)
+ SIGNAL_HANDLER
+
+ if(ishuman(user))
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Pick up")
+ return CONTEXTUAL_SCREENTIP_SET
+
/datum/element/mob_holder/proc/mob_try_pickup(mob/living/source, mob/user)
if(!ishuman(user) || !user.Adjacent(source) || user.incapacitated())
return FALSE
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 80621e2bcd..b59e71d62e 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -13,6 +13,16 @@
var/cooldown_time = 100
req_access = list(ACCESS_AI_UPLOAD)
+/obj/machinery/ai_slipper/Initialize(mapload)
+ . = ..()
+ register_context()
+
+/obj/machinery/ai_slipper/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(issilicon(user))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Dispense foam")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/machinery/ai_slipper/examine(mob/user)
. = ..()
. += "It has [uses] uses of foam remaining."
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 0b31ecdf9f..d9d6f65e93 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -700,6 +700,14 @@
/obj/machinery/door/airlock/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
. = ..()
+ if(hasSiliconAccessInArea(user))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Open interface")
+ LAZYSET(context[SCREENTIP_CONTEXT_SHIFT_LMB], INTENT_ANY, density ? "Open" : "Close")
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, locked ? "Unbolt" : "Bolt")
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, secondsElectrified ? "Un-electrify" : "Electrify")
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB], INTENT_ANY, emergency ? "Disable emergency access" : "Enable emergency access")
+ . = CONTEXTUAL_SCREENTIP_SET
+
if(istype(held_item, /obj/item/stack/sheet/plasteel))
LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Reinforce")
return CONTEXTUAL_SCREENTIP_SET
@@ -720,12 +728,12 @@
return CONTEXTUAL_SCREENTIP_SET
if (TOOL_WELDER)
- LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Weld shut")
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Weld shut")
if (panel_open)
switch (security_level)
if (AIRLOCK_SECURITY_METAL, AIRLOCK_SECURITY_PLASTEEL_I, AIRLOCK_SECURITY_PLASTEEL_O)
- LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Cut shielding")
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Cut shielding")
return CONTEXTUAL_SCREENTIP_SET
LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Repair")
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 755894d906..cd87a858b8 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -80,6 +80,19 @@ Possible to do for anyone motivated enough:
/// If we are currently calling another holopad
var/calling = FALSE
+/obj/machinery/holopad/Initialize(mapload)
+ . = ..()
+ register_context()
+
+/obj/machinery/holopad/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(isAI(user) && on_network)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Project yourself")
+ if(LAZYLEN(masters) && masters[user])
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Stop projecting")
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Stop projecting")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/machinery/holopad/secure
name = "secure holopad"
desc = "It's a floor-mounted device for projecting holographic images. This one will refuse to auto-connect incoming calls."
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 8a084353e4..f849d2f31b 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -52,8 +52,15 @@ Buildable meters
update()
pixel_x += rand(-5, 5)
pixel_y += rand(-5, 5)
+ register_context()
return ..()
+/obj/item/pipe/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(held_item?.tool_behaviour == TOOL_WRENCH)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Fasten")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/pipe/proc/make_from_existing(obj/machinery/atmospherics/make_from)
setDir(make_from.dir)
pipename = make_from.name
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index f4a82cb883..b94e51b813 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -930,6 +930,14 @@ DEFINE_BITFIELD(turret_flags, list(
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
power_change() //Checks power and initial settings
+ register_context()
+
+/obj/machinery/turretid/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(issilicon(user) && !(stat & BROKEN))
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, enabled ? "Disable" : "Enable")
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, lethal ? "Set to stun" : "Set to kill")
+ return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/turretid/Destroy()
turrets.Cut()
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 5aaed2a808..2f2bfffcb0 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -299,6 +299,12 @@
/obj/machinery/status_display/Initialize(mapload, ndir, building)
. = ..()
update_appearance()
+ register_context()
+
+/obj/machinery/status_display/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(isAI(user))
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Start streaming") // funny
/obj/machinery/status_display/evac/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index f361e557d0..9366f5f935 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -16,6 +16,16 @@
var/used = 0
+/obj/item/dnainjector/Initialize(mapload)
+ . = ..()
+ register_item_context()
+
+/obj/item/dnainjector/add_item_context(obj/item/source, list/context, mob/living/target, mob/living/user)
+ . = ..()
+ if(isliving(target) && target.has_dna() && !used)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Inject")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/dnainjector/attack_paw(mob/user)
return attack_hand(user)
@@ -524,6 +534,12 @@
var/research = FALSE //Set to true to get expended and filled injectors for chromosomes
var/filled = FALSE
+/obj/item/dnainjector/activator/add_item_context(obj/item/source, list/context, atom/target, mob/living/user)
+ . = ..()
+ if(istype(target, /obj/machinery/computer/scan_consolenew) && used)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Recycle")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/dnainjector/activator/inject(mob/living/carbon/M, mob/user)
if(M.has_dna() && !HAS_TRAIT_NOT_FROM(M, TRAIT_RADIMMUNE,BLOODSUCKER_TRAIT) && !HAS_TRAIT(M,TRAIT_NOCLONE))
M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2))
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 1403eb999c..2c3b0545f8 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -65,6 +65,13 @@ GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double,
if(bedsheet_type == BEDSHEET_DOUBLE)
stack_amount *= 2
dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET
+ register_item_context()
+
+/obj/item/bedsheet/add_item_context(obj/item/source, list/context, atom/target, mob/living/user)
+ . = ..()
+ if(iscarbon(target))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Prepare Surgery")
+ return CONTEXTUAL_SCREENTIP_SET
/obj/item/bedsheet/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 90407264ad..19b94eb64e 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -233,6 +233,12 @@
power_change()
set_frequency(frequency)
+ register_context()
+
+/obj/machinery/airalarm/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, locked ? "Unlock" : "Lock")
+ return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/airalarm/Destroy()
SSradio.remove_object(src, frequency)
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 49fc0322df..a59cd5b304 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -41,6 +41,10 @@
var/on = FALSE
var/interacts_with_air = FALSE
+/obj/machinery/atmospherics/Initialize(mapload)
+ . = ..()
+ register_context()
+
/obj/machinery/atmospherics/examine(mob/user)
. = ..()
if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user))
@@ -48,6 +52,17 @@
if(SEND_SIGNAL(L, COMSIG_CHECK_VENTCRAWL))
. += "Alt-click to crawl through it."
+/obj/machinery/atmospherics/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if(can_unwrench && held_item?.tool_behaviour == TOOL_WRENCH)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Unfasten")
+ . = CONTEXTUAL_SCREENTIP_SET
+
+ if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user) && SEND_SIGNAL(user, COMSIG_CHECK_VENTCRAWL))
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Crawl into")
+ . = CONTEXTUAL_SCREENTIP_SET
+
/obj/machinery/atmospherics/New(loc, process = TRUE, setdir)
if(!isnull(setdir))
setDir(setdir)
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 2fc5270a6b..04a39ac8cf 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -99,12 +99,13 @@
has_sensor = BROKEN_SENSORS
sensordamage = sensormaxintegrity
-/obj/item/clothing/under/New()
+/obj/item/clothing/under/Initialize(mapload)
if(sensor_flags & SENSOR_RANDOM)
//make the sensor mode favor higher levels, except coords.
sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS)
sensor_mode_intended = sensor_mode
- ..()
+ register_context()
+ return ..()
/obj/item/clothing/under/equipped(mob/user, slot)
..()
@@ -360,5 +361,20 @@
return TRUE
+/obj/item/clothing/under/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if (!(item_flags & IN_INVENTORY))
+ return
+
+ if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Set to highest sensor")
+ if(attached_accessory)
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Remove [attached_accessory]")
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Adjust [src]")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/clothing/under/rank
dying_key = DYE_REGISTRY_UNDER
diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm
index 113a0b33fa..f495dadbf2 100644
--- a/code/modules/modular_computers/computers/item/tablet.dm
+++ b/code/modules/modular_computers/computers/item/tablet.dm
@@ -36,6 +36,17 @@
inserted_item = new inserted_item(src)
else
inserted_item = new /obj/item/pen(src)
+ register_context()
+
+/obj/item/modular_computer/tablet/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(can_have_pen)
+ if(inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Remove [inserted_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(is_type_in_list(held_item, contained_item))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert [held_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
/obj/item/modular_computer/tablet/proc/insert_pen(obj/item/pen)
if(!usr.transferItemToLoc(pen, src))
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 5e7872b92e..9896cc4088 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -290,6 +290,13 @@
set_machine_stat(stat | MAINT)
update_appearance()
addtimer(CALLBACK(src, .proc/update), 5)
+ register_context()
+
+/obj/machinery/power/apc/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ if(operating)
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, locked ? "Unlock" : "Lock")
+ return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/power/apc/Destroy()
GLOB.apcs_list -= src
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 75c9f3c117..8eff48a3f8 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -15,6 +15,16 @@
var/ignore_flags = 0
var/infinite = FALSE
+/obj/item/reagent_containers/hypospray/Initialize(mapload, vol)
+ . = ..()
+ register_item_context()
+
+/obj/item/reagent_containers/add_item_context(obj/item/source, list/context, atom/target, mob/living/user)
+ . = ..()
+ if(iscarbon(target))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Inject")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/reagent_containers/hypospray/attack_paw(mob/user)
return attack_hand(user)
@@ -378,6 +388,23 @@
if(start_vial)
vial = new start_vial
update_icon()
+ register_context()
+ register_item_context()
+
+/obj/item/hypospray/mkii/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+ // Did you know that clicking something while you're holding it is the same as attack_self()?
+ if(vial && (held_item == src))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Remove [vial]")
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Set to [mode ? "spray" : "inject"]")
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Set transfer amount")
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/item/hypospray/mkii/add_item_context(obj/item/source, list/context, atom/target, mob/living/user)
+ . = ..()
+ if(iscarbon(target))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, mode ? "Inject" : "Spray")
+ return CONTEXTUAL_SCREENTIP_SET
/obj/item/hypospray/mkii/ComponentInitialize()
. = ..()
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index b193e5917a..f916180b4c 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -349,6 +349,16 @@
w_class = WEIGHT_CLASS_TINY
attack_verb = list("slapped")
+/obj/item/surgical_drapes/Initialize(mapload)
+ . = ..()
+ register_item_context()
+
+/obj/item/surgical_drapes/add_item_context(obj/item/source, list/context, atom/target, mob/living/user)
+ . = ..()
+ if(iscarbon(target))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Prepare Surgery")
+ return CONTEXTUAL_SCREENTIP_SET
+
/obj/item/surgical_drapes/attack(mob/living/M, mob/user)
if(!attempt_initiate_surgery(src, M, user))
..()