diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index ac03465773..14c48fbcaa 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -176,6 +176,10 @@
toggle_on()
add_fingerprint(usr)
+/* Holopads */
+/obj/machinery/holopad/AIAltClick(mob/living/silicon/ai/user)
+ hangup_all_calls()
+
//
// Override TurfAdjacent for AltClicking
//
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 548cdb8f97..830f2d9a42 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -78,7 +78,7 @@
requested_amount = input(user, "How much do you want to insert?", "Inserting [S.singular_name]s") as num|null
if(isnull(requested_amount) || (requested_amount <= 0))
return
- if(QDELETED(I) || QDELETED(user) || QDELETED(src) || parent != current_parent || !user.canUseTopic(current_parent) || !user.is_holding(I) || !user.Adjacent(current_parent))
+ if(QDELETED(I) || QDELETED(user) || QDELETED(src) || parent != current_parent || !user.canUseTopic(current_parent, BE_CLOSE) || !user.is_holding(I))
return
if(!user.temporarilyRemoveItemFromInventory(I))
to_chat(user, "[I] is stuck to you and cannot be placed into [parent].")
diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm
index 23d5fda5d4..0a985a69cc 100644
--- a/code/datums/components/rotation.dm
+++ b/code/datums/components/rotation.dm
@@ -12,11 +12,11 @@
var/rotation_flags = NONE
var/default_rotation_direction = ROTATION_CLOCKWISE
-
+
/datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation)
if(!ismovableatom(parent))
return COMPONENT_INCOMPATIBLE
-
+
//throw if no rotation direction is specificed ?
src.rotation_flags = rotation_flags
@@ -25,7 +25,7 @@
src.can_user_rotate = can_user_rotate
else
src.can_user_rotate = CALLBACK(src,.proc/default_can_user_rotate)
-
+
if(can_be_rotated)
src.can_be_rotated = can_be_rotated
else
@@ -89,7 +89,7 @@
after_rotation.Invoke(user,rotation_type)
/datum/component/simple_rotation/proc/default_can_user_rotate(mob/living/user, rotation_type)
- if(!istype(user) || !user.Adjacent(parent) || user.incapacitated())
+ if(!istype(user) || !user.canUseTopic(parent, BE_CLOSE, NO_DEXTERY))
to_chat(user, "You can't do that right now!")
return FALSE
return TRUE
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index 4d4f1cb71f..03da8e2891 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -94,7 +94,7 @@
/obj/machinery/computer/apc_control/Topic(href, href_list)
if(..())
return
- if(!usr || !usr.canUseTopic(src) || usr.incapacitated() || stat || QDELETED(src))
+ if(!usr || !usr.canUseTopic(src) || stat || QDELETED(src))
return
if(href_list["authenticate"])
var/obj/item/card/id/ID = usr.get_active_held_item()
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 1cf95877dd..e32114340f 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -147,7 +147,7 @@
/obj/structure/frame/computer/AltClick(mob/user)
..()
- if(!in_range(src, user) || !isliving(user) || user.incapacitated())
+ if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if(anchored)
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index c9b9670191..7f66045a81 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -118,8 +118,8 @@
update_icon()
return TRUE
-/obj/machinery/defibrillator_mount/AltClick(mob/living/user)
- if(!user.Adjacent(src) || !istype(user))
+/obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
if(!defib)
to_chat(user, "It'd be hard to remove a defib unit from a mount that has none.")
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 0af5e832bf..007ef8e986 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -135,8 +135,8 @@
..()
to_chat(user, "Alt-click to toggle modes.")
-/obj/item/grenade/barrier/AltClick(mob/living/user)
- if(!istype(user) || user.incapacitated())
+/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
toggle_mode(user)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 0642f1bef8..594394ea8a 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -137,10 +137,6 @@ Possible to do for anyone motivated enough:
return ..()
-/obj/machinery/holopad/AltClick(mob/living/carbon/human/user)
- if(isAI(user))
- hangup_all_calls()
- return
/obj/machinery/holopad/interact(mob/living/carbon/human/user) //Carn: Hologram requests.
if(!istype(user))
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index d66427b9bc..e00e172e68 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -168,10 +168,10 @@
/obj/machinery/launchpad/briefcase/MouseDrop(over_object, src_location, over_location)
. = ..()
- if(over_object == usr && Adjacent(usr))
+ if(over_object == usr)
if(!briefcase || !usr.can_hold_items())
return
- if(usr.incapacitated())
+ if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)))
to_chat(usr, "You can't do that right now!")
return
usr.visible_message("[usr] starts closing [src]...", "You start closing [src]...")
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index 480c24b87f..eee71818c5 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -138,7 +138,7 @@
chassis.toggle_strafe()
/obj/mecha/AltClick(mob/living/user)
- if(user == occupant)
+ if((user == occupant) && user.canUseTopic(src))
toggle_strafe()
/obj/mecha/proc/toggle_strafe()
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 9e83a92847..f3940115d1 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -113,10 +113,11 @@
update_label()
/obj/item/card/id/attack_self(mob/user)
- user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \
+ if(Adjacent(user))
+ user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \
"You show \the [src.name].")
- src.add_fingerprint(user)
- return
+ add_fingerprint(user)
+ return
/obj/item/card/id/examine(mob/user)
..()
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index afdeb4c658..428412e11a 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -145,7 +145,7 @@
ui.open()
/obj/item/toy/crayon/spraycan/AltClick(mob/user)
- if(user.canUseTopic(src, be_close=TRUE))
+ if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(has_cap)
is_capped = !is_capped
to_chat(user, "The cap on [src] is now [is_capped ? "on" : "off"].")
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 6eb1017ae5..481ca2a722 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -183,7 +183,7 @@
return ..()
/obj/item/device/geiger_counter/AltClick(mob/living/user)
- if(!istype(user) || user.incapacitated())
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return ..()
if(!scanning)
to_chat(usr, "[src] must be on to reset its radiation level!")
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 2c75166789..b3e33ec8ba 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -41,10 +41,12 @@ GLOBAL_LIST_EMPTY(GPS_list)
add_overlay("working")
/obj/item/device/gps/AltClick(mob/user)
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
toggletracking(user)
/obj/item/device/gps/proc/toggletracking(mob/user)
- if(!user.canUseTopic(src, be_close=TRUE))
+ if(!user.canUseTopic(src, BE_CLOSE))
return //user not valid to use gps
if(emped)
to_chat(user, "It's busted!")
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index b184868676..ecbb4de4a0 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -191,6 +191,8 @@
return ..()
/obj/item/extinguisher/AltClick(mob/user)
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
EmptyExtinguisher(user)
/obj/item/extinguisher/proc/EmptyExtinguisher(var/mob/user)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index 8cc6d6b179..4bea9053a7 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -135,7 +135,7 @@
toggle_igniter(user)
/obj/item/flamethrower/AltClick(mob/user)
- if(ptank && isliving(user) && !user.incapacitated() && Adjacent(user))
+ if(ptank && isliving(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
user.put_in_hands(ptank)
ptank = null
to_chat(user, "You remove the plasma tank from [src]!")
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 4acebd6a34..fbdacfdbda 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -70,7 +70,7 @@
update_icon()
/obj/item/pet_carrier/AltClick(mob/living/user)
- if(open || !user.canUseTopic(src, be_close=TRUE))
+ if(open || !user.canUseTopic(src, BE_CLOSE))
return
locked = !locked
to_chat(user, "You flip the lock switch [locked ? "down" : "up"].")
@@ -151,7 +151,7 @@
add_overlay("[locked ? "" : "un"]locked")
/obj/item/pet_carrier/MouseDrop(atom/over_atom)
- if(isopenturf(over_atom) && usr.Adjacent(over_atom) && open && occupants.len)
+ if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)) && usr.Adjacent(over_atom) && open && occupants.len)
usr.visible_message("[usr] unloads [src].", \
"You unload [src] onto [over_atom].")
for(var/V in occupants)
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index ccf4cfa860..d12f787d7d 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -310,10 +310,7 @@
..()
/obj/item/stack/AltClick(mob/living/user)
- if(!istype(user) || !user.canUseTopic(src))
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if(is_cyborg)
return
@@ -324,7 +321,7 @@
var/min = 0
var/max = get_amount()
var/stackmaterial = round(input(user,"How many sheets do you wish to take out of this stack? (Maximum [max])") as num)
- if(stackmaterial == null || stackmaterial <= min || stackmaterial >= get_amount() || !user.canUseTopic(src))
+ if(stackmaterial == null || stackmaterial <= min || stackmaterial >= get_amount() || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else
change_stack(user,stackmaterial)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 3300f64948..8a44571220 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -511,7 +511,7 @@
to_chat(user, "Alt-click it to quickly draw the blade.")
/obj/item/storage/belt/sabre/AltClick(mob/user)
- if(!ishuman(user) || !user.canUseTopic(src, be_close=TRUE))
+ if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if(contents.len)
var/obj/item/I = contents[1]
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index d21e6988f2..2baf26abae 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -129,8 +129,8 @@
..()
to_chat(user, "Alt-click to extract contents.")
-/obj/item/storage/fancy/cigarettes/AltClick(mob/user)
- if(user.stat || user.restrained())
+/obj/item/storage/fancy/cigarettes/AltClick(mob/living/carbon/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents
if(W && contents.len > 0)
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index 195d5b25f5..51a0d476c3 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -129,7 +129,7 @@
to_chat(user, "Alt-click to [open ? "close":"open"] it.")
/obj/item/storage/lockbox/medal/AltClick(mob/user)
- if(user.canUseTopic(src, be_close=TRUE))
+ if(user.canUseTopic(src, BE_CLOSE))
if(!locked)
open = (open ? FALSE : TRUE)
update_icon()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index dd3ef50a39..8350fce2b5 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -856,7 +856,7 @@
set name = "Flip Card"
set category = "Object"
set src in range(1)
- if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
+ if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE))
return
if(!flipped)
src.flipped = 1
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index b7013f5210..a6f4a52f69 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -516,7 +516,7 @@
qdel(src)
/obj/item/twohanded/spear/AltClick(mob/user)
- if(user.canUseTopic(src, be_close=TRUE))
+ if(user.canUseTopic(src, BE_CLOSE))
..()
if(!explosive)
return
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 72764f436d..b4b05e20a8 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -78,13 +78,10 @@
/obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location)
. = ..()
if(over_object == usr && Adjacent(usr))
- if(!ishuman(usr))
+ if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE))
return 0
if(has_buckled_mobs())
return 0
- if(usr.incapacitated())
- to_chat(usr, "You can't do that right now!")
- return 0
usr.visible_message("[usr] collapses \the [src.name].", "You collapse \the [src.name].")
var/obj/structure/bed/roller/B = new foldabletype(get_turf(src))
usr.put_in_hands(B)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 9c5fa40c62..913d22aa74 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -36,7 +36,7 @@
var/mob/living/L = user
if(istype(L))
- if(!user.Adjacent(src) || user.incapacitated())
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
to_chat(user, "You can't do that right now!")
return FALSE
else
@@ -225,7 +225,7 @@
if(over_object == usr && Adjacent(usr))
if(!item_chair || !usr.can_hold_items() || has_buckled_mobs() || src.flags_1 & NODECONSTRUCT_1)
return
- if(usr.incapacitated())
+ if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)))
to_chat(usr, "You can't do that right now!")
return
usr.visible_message("[usr] grabs \the [src.name].", "You grab \the [src.name].")
@@ -383,7 +383,7 @@
/obj/structure/chair/brass/AltClick(mob/living/user)
turns = 0
- if(!user.canUseTopic(src, be_close = TRUE))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if(!isprocessing)
user.visible_message("[user] spins [src] around, and Ratvarian technology keeps it spinning FOREVER.", \
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index de833f2bb1..08700369b9 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -394,8 +394,7 @@
/obj/structure/closet/AltClick(mob/user)
..()
- if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc))
return
if(opened || !secure)
return
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 0a3574b1a6..bb223b2e04 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -98,7 +98,7 @@
attack_hand(user)
/obj/structure/extinguisher_cabinet/AltClick(mob/living/user)
- if(user.incapacitated() || !Adjacent(user) || !istype(user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
toggle_cabinet(user)
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index 25073853ad..dd1f5609be 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -81,7 +81,7 @@
var/obj/item/O = locate(href_list["retrieve"]) in contents
if(!O || !istype(O))
return
- if(!usr.canUseTopic(src) || !open)
+ if(!usr.canUseTopic(src, BE_CLOSE) || !open)
return
if(ishuman(usr))
if(!usr.put_in_hands(O))
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 6a2c763f4a..91c42f41af 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -150,8 +150,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/morgue/AltClick(mob/user)
..()
- if(user.incapacitated())
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, BE_CLOSE))
return
beeper = !beeper
to_chat(user, "You turn the speaker function [beeper ? "off" : "on"].")
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index a8ca42bff5..c8ef972a63 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -161,7 +161,7 @@
to_chat(user, "The rotation is locked!")
return FALSE
var/new_angle = input(user, "Input a new angle for primary reflection face.", "Reflector Angle", rotation_angle) as null|num
- if(!user.canUseTopic(src, be_close=TRUE))
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
to_chat(user, "You can't do that right now!")
return
if(!isnull(new_angle))
@@ -169,8 +169,7 @@
return TRUE
/obj/structure/reflector/AltClick(mob/user)
- if(!user.canUseTopic(src, be_close=TRUE))
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else if(finished)
rotate(user)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index fd8674f96f..01160e8b2e 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -160,7 +160,7 @@
access_display(user)
/obj/item/clockwork/slab/AltClick(mob/living/user)
- if(is_servant_of_ratvar(user) && linking)
+ if(is_servant_of_ratvar(user) && linking && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
linking = null
to_chat(user, "Object link canceled.")
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
index 499dfd5941..3ad71af961 100644
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm
@@ -94,10 +94,10 @@
/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated())
- return 0
+ return FALSE
if(be_close && !in_range(M, src))
- return 0
- return 1
+ return FALSE
+ return TRUE
/mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
return 666
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 279834223a..d1f1ff3f87 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -1,411 +1,410 @@
-
-//Apprenticeship contract - moved to antag_spawner.dm
-
-///////////////////////////Veil Render//////////////////////
-
-/obj/item/veilrender
- name = "veil render"
- desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "render"
- item_state = "knife"
- lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
- force = 15
- throwforce = 10
- w_class = WEIGHT_CLASS_NORMAL
- hitsound = 'sound/weapons/bladeslice.ogg'
- var/charges = 1
- var/spawn_type = /obj/singularity/wizard
- var/spawn_amt = 1
- var/activate_descriptor = "reality"
- var/rend_desc = "You should run now."
- var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning
-
-/obj/item/veilrender/attack_self(mob/user)
- if(charges > 0)
- new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast)
- charges--
- user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!")
- else
- to_chat(user, "The unearthly energies that powered the blade are now dormant.")
-
-/obj/effect/rend
- name = "tear in the fabric of reality"
- desc = "You should run now."
- icon = 'icons/effects/effects.dmi'
- icon_state = "rift"
- density = TRUE
- anchored = TRUE
- var/spawn_path = /mob/living/simple_animal/cow //defaulty cows to prevent unintentional narsies
- var/spawn_amt_left = 20
- var/spawn_fast = 0
-
-/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc, var/spawn_fast)
- src.spawn_path = spawn_type
- src.spawn_amt_left = spawn_amt
- src.desc = desc
- src.spawn_fast = spawn_fast
- START_PROCESSING(SSobj, src)
- return
-
-/obj/effect/rend/process()
- if(!spawn_fast)
- if(locate(/mob) in loc)
- return
- new spawn_path(loc)
- spawn_amt_left--
- if(spawn_amt_left <= 0)
- qdel(src)
-
-/obj/effect/rend/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/nullrod))
- user.visible_message("[user] seals \the [src] with \the [I].")
- qdel(src)
- return
- else
- return ..()
-
-/obj/effect/rend/singularity_pull()
- return
-
-/obj/effect/rend/singularity_pull()
- return
-
-/obj/item/veilrender/vealrender
- name = "veal render"
- desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
- spawn_type = /mob/living/simple_animal/cow
- spawn_amt = 20
- activate_descriptor = "hunger"
- rend_desc = "Reverberates with the sound of ten thousand moos."
-
-/obj/item/veilrender/honkrender
- name = "honk render"
- desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus."
- spawn_type = /mob/living/simple_animal/hostile/retaliate/clown
- spawn_amt = 10
- activate_descriptor = "depression"
- rend_desc = "Gently wafting with the sounds of endless laughter."
- icon_state = "clownrender"
-
-////TEAR IN REALITY
-
-/obj/singularity/wizard
- name = "tear in the fabric of reality"
- desc = "This isn't right."
- icon = 'icons/effects/224x224.dmi'
- icon_state = "reality"
- pixel_x = -96
- pixel_y = -96
- grav_pull = 6
- consume_range = 3
- current_size = STAGE_FOUR
- allowed_size = STAGE_FOUR
-
-/obj/singularity/wizard/process()
- move()
- eat()
- return
-/////////////////////////////////////////Scrying///////////////////
-
-/obj/item/scrying
- name = "scrying orb"
- desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
- icon = 'icons/obj/projectiles.dmi'
- icon_state ="bluespace"
- throw_speed = 3
- throw_range = 7
- throwforce = 15
- damtype = BURN
- force = 15
- hitsound = 'sound/items/welder2.ogg'
-
- var/xray_granted = FALSE
-
-/obj/item/scrying/equipped(mob/user)
- if(!xray_granted && ishuman(user))
- var/mob/living/carbon/human/H = user
- if(!(H.dna.check_mutation(XRAY)))
- H.dna.add_mutation(XRAY)
- xray_granted = TRUE
- . = ..()
-
-/obj/item/scrying/attack_self(mob/user)
- to_chat(user, "You can see...everything!")
- visible_message("[user] stares into [src], their eyes glazing over.")
- user.ghostize(1)
-
-/////////////////////////////////////////Necromantic Stone///////////////////
-
-/obj/item/device/necromantic_stone
- name = "necromantic stone"
- desc = "A shard capable of resurrecting humans as skeleton thralls."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "necrostone"
- item_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- w_class = WEIGHT_CLASS_TINY
- var/list/spooky_scaries = list()
- var/unlimited = 0
-
-/obj/item/device/necromantic_stone/unlimited
- unlimited = 1
-
-/obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
- if(!istype(M))
- return ..()
-
- if(!istype(user) || !user.canUseTopic(M,1))
- return
-
- if(M.stat != DEAD)
- to_chat(user, "This artifact can only affect the dead!")
- return
-
- if(!M.mind || !M.client)
- to_chat(user, "There is no soul connected to this body...")
- return
-
- check_spooky()//clean out/refresh the list
- if(spooky_scaries.len >= 3 && !unlimited)
- to_chat(user, "This artifact can only affect three undead at a time!")
- return
-
- M.set_species(/datum/species/skeleton, icon_update=0)
- M.revive(full_heal = 1, admin_revive = 1)
- spooky_scaries |= M
- to_chat(M, "You have been revived by [user.real_name]!")
- to_chat(M, "[user.p_they(TRUE)] [user.p_are()] your master now, assist them even if it costs you your new life!")
-
- equip_roman_skeleton(M)
-
- desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]"
-
-/obj/item/device/necromantic_stone/proc/check_spooky()
- if(unlimited) //no point, the list isn't used.
- return
-
- for(var/X in spooky_scaries)
- if(!ishuman(X))
- spooky_scaries.Remove(X)
- continue
- var/mob/living/carbon/human/H = X
- if(H.stat == DEAD)
- H.dust(TRUE)
- spooky_scaries.Remove(X)
- continue
- listclearnulls(spooky_scaries)
-
-//Funny gimmick, skeletons always seem to wear roman/ancient armour
-/obj/item/device/necromantic_stone/proc/equip_roman_skeleton(mob/living/carbon/human/H)
- for(var/obj/item/I in H)
- H.dropItemToGround(I)
-
- var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
- H.equip_to_slot_or_del(new hat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
- H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
- H.put_in_hands(new /obj/item/claymore(H), TRUE)
- H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
-
-
-/obj/item/voodoo
- name = "wicker doll"
- desc = "Something creepy about it."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "voodoo"
- item_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- var/mob/living/carbon/human/target = null
- var/list/mob/living/carbon/human/possible = list()
- var/obj/item/voodoo_link = null
- var/cooldown_time = 30 //3s
- var/cooldown = 0
- max_integrity = 10
- resistance_flags = FLAMMABLE
-
-/obj/item/voodoo/attackby(obj/item/I, mob/user, params)
- if(target && cooldown < world.time)
- if(I.is_hot())
- to_chat(target, "You suddenly feel very hot")
- target.bodytemperature += 50
- GiveHint(target)
- else if(is_pointed(I))
- to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!")
- target.Knockdown(40)
- GiveHint(target)
- else if(istype(I, /obj/item/bikehorn))
- to_chat(target, "HONK")
- SEND_SOUND(target, 'sound/items/airhorn.ogg')
- target.adjustEarDamage(0,3)
- GiveHint(target)
- cooldown = world.time +cooldown_time
- return
-
- if(!voodoo_link)
- if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
- if (user.transferItemToLoc(I,src))
- voodoo_link = I
- to_chat(user, "You attach [I] to the doll.")
- update_targets()
-
-/obj/item/voodoo/check_eye(mob/user)
- if(loc != user)
- user.reset_perspective(null)
- user.unset_machine()
-
-/obj/item/voodoo/attack_self(mob/user)
- if(!target && possible.len)
- target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
- return
-
- if(user.zone_selected == "chest")
- if(voodoo_link)
- target = null
- voodoo_link.forceMove(drop_location())
- to_chat(user, "You remove the [voodoo_link] from the doll.")
- voodoo_link = null
- update_targets()
- return
-
- if(target && cooldown < world.time)
- switch(user.zone_selected)
- if("mouth")
- var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
- target.say(wgw)
- log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.")
- if("eyes")
- user.set_machine(src)
- user.reset_perspective(target)
- spawn(100)
- user.reset_perspective(null)
- user.unset_machine()
- if("r_leg","l_leg")
- to_chat(user, "You move the doll's legs around.")
- var/turf/T = get_step(target,pick(GLOB.cardinals))
- target.Move(T)
- if("r_arm","l_arm")
- target.click_random_mob()
- GiveHint(target)
- if("head")
- to_chat(user, "You smack the doll's head with your hand.")
- target.Dizzy(10)
- to_chat(target, "You suddenly feel as if your head was hit with a hammer!")
- GiveHint(target,user)
- cooldown = world.time + cooldown_time
-
-/obj/item/voodoo/proc/update_targets()
- possible = list()
- if(!voodoo_link)
- return
- var/list/prints = voodoo_link.return_fingerprints()
- if(!length(prints))
- return FALSE
- for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
- if(prints[md5(H.dna.uni_identity)])
- possible |= H
-
-/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
- if(prob(50) || force)
- var/way = dir2text(get_dir(victim,get_turf(src)))
- to_chat(victim, "You feel a dark presence from [way]")
- if(prob(20) || force)
- var/area/A = get_area(src)
- to_chat(victim, "You feel a dark presence from [A.name]")
-
-/obj/item/voodoo/suicide_act(mob/living/carbon/user)
- user.visible_message("[user] links the voodoo doll to themself and sits on it, infinitely crushing themself! It looks like [user.p_theyre()] trying to commit suicide!")
- user.gib()
- return(BRUTELOSS)
-
-/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume)
- if(target)
- target.adjust_fire_stacks(20)
- target.IgniteMob()
- GiveHint(target,1)
- return ..()
-
-//Provides a decent heal, need to pump every 6 seconds
-/obj/item/organ/heart/cursed/wizard
- pump_delay = 60
- heal_brute = 25
- heal_burn = 25
- heal_oxy = 25
-
-//Warp Whistle: Provides uncontrolled long distance teleportation.
-
-/obj/item/warpwhistle
- name = "warp whistle"
- desc = "One toot on this whistle will send you to a far away land!"
- icon = 'icons/obj/wizard.dmi'
- icon_state = "whistle"
- var/on_cooldown = 0 //0: usable, 1: in use, 2: on cooldown
- var/mob/living/carbon/last_user
-
-/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user)
- if(!user || QDELETED(src) || user.notransform)
- on_cooldown = FALSE
- return TRUE
- return FALSE
-
-/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
- if(!istype(user) || on_cooldown)
- return
- on_cooldown = TRUE
- last_user = user
- var/turf/T = get_turf(user)
- playsound(T,'sound/magic/warpwhistle.ogg', 200, 1)
- user.canmove = 0
- new /obj/effect/temp_visual/tornado(T)
- sleep(20)
- if(interrupted(user))
- return
- user.invisibility = INVISIBILITY_MAXIMUM
- user.status_flags |= GODMODE
- sleep(20)
- if(interrupted(user))
- return
- var/breakout = 0
- while(breakout < 50)
- var/turf/potential_T = find_safe_turf()
- if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
- user.forceMove(potential_T)
- user.canmove = 0
- T = potential_T
- break
- breakout += 1
- new /obj/effect/temp_visual/tornado(T)
- sleep(20)
- if(interrupted(user))
- return
- user.invisibility = initial(user.invisibility)
- user.status_flags &= ~GODMODE
- user.canmove = 1
- on_cooldown = 2
- sleep(40)
- on_cooldown = 0
-
-/obj/item/warpwhistle/Destroy()
- if(on_cooldown == 1 && last_user) //Flute got dunked somewhere in the teleport
- last_user.invisibility = initial(last_user.invisibility)
- last_user.status_flags &= ~GODMODE
- last_user.canmove = 1
- return ..()
-
-/obj/effect/temp_visual/tornado
- icon = 'icons/obj/wizard.dmi'
- icon_state = "tornado"
- name = "tornado"
- desc = "This thing sucks!"
- layer = FLY_LAYER
- randomdir = 0
- duration = 40
- pixel_x = 500
-
-/obj/effect/temp_visual/tornado/Initialize()
- . = ..()
- animate(src, pixel_x = -500, time = 40)
+//Apprenticeship contract - moved to antag_spawner.dm
+
+///////////////////////////Veil Render//////////////////////
+
+/obj/item/veilrender
+ name = "veil render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "render"
+ item_state = "knife"
+ lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+ force = 15
+ throwforce = 10
+ w_class = WEIGHT_CLASS_NORMAL
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ var/charges = 1
+ var/spawn_type = /obj/singularity/wizard
+ var/spawn_amt = 1
+ var/activate_descriptor = "reality"
+ var/rend_desc = "You should run now."
+ var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning
+
+/obj/item/veilrender/attack_self(mob/user)
+ if(charges > 0)
+ new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast)
+ charges--
+ user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!")
+ else
+ to_chat(user, "The unearthly energies that powered the blade are now dormant.")
+
+/obj/effect/rend
+ name = "tear in the fabric of reality"
+ desc = "You should run now."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "rift"
+ density = TRUE
+ anchored = TRUE
+ var/spawn_path = /mob/living/simple_animal/cow //defaulty cows to prevent unintentional narsies
+ var/spawn_amt_left = 20
+ var/spawn_fast = 0
+
+/obj/effect/rend/New(loc, var/spawn_type, var/spawn_amt, var/desc, var/spawn_fast)
+ src.spawn_path = spawn_type
+ src.spawn_amt_left = spawn_amt
+ src.desc = desc
+ src.spawn_fast = spawn_fast
+ START_PROCESSING(SSobj, src)
+ return
+
+/obj/effect/rend/process()
+ if(!spawn_fast)
+ if(locate(/mob) in loc)
+ return
+ new spawn_path(loc)
+ spawn_amt_left--
+ if(spawn_amt_left <= 0)
+ qdel(src)
+
+/obj/effect/rend/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/nullrod))
+ user.visible_message("[user] seals \the [src] with \the [I].")
+ qdel(src)
+ return
+ else
+ return ..()
+
+/obj/effect/rend/singularity_pull()
+ return
+
+/obj/effect/rend/singularity_pull()
+ return
+
+/obj/item/veilrender/vealrender
+ name = "veal render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
+ spawn_type = /mob/living/simple_animal/cow
+ spawn_amt = 20
+ activate_descriptor = "hunger"
+ rend_desc = "Reverberates with the sound of ten thousand moos."
+
+/obj/item/veilrender/honkrender
+ name = "honk render"
+ desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus."
+ spawn_type = /mob/living/simple_animal/hostile/retaliate/clown
+ spawn_amt = 10
+ activate_descriptor = "depression"
+ rend_desc = "Gently wafting with the sounds of endless laughter."
+ icon_state = "clownrender"
+
+////TEAR IN REALITY
+
+/obj/singularity/wizard
+ name = "tear in the fabric of reality"
+ desc = "This isn't right."
+ icon = 'icons/effects/224x224.dmi'
+ icon_state = "reality"
+ pixel_x = -96
+ pixel_y = -96
+ grav_pull = 6
+ consume_range = 3
+ current_size = STAGE_FOUR
+ allowed_size = STAGE_FOUR
+
+/obj/singularity/wizard/process()
+ move()
+ eat()
+ return
+/////////////////////////////////////////Scrying///////////////////
+
+/obj/item/scrying
+ name = "scrying orb"
+ desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state ="bluespace"
+ throw_speed = 3
+ throw_range = 7
+ throwforce = 15
+ damtype = BURN
+ force = 15
+ hitsound = 'sound/items/welder2.ogg'
+
+ var/xray_granted = FALSE
+
+/obj/item/scrying/equipped(mob/user)
+ if(!xray_granted && ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!(H.dna.check_mutation(XRAY)))
+ H.dna.add_mutation(XRAY)
+ xray_granted = TRUE
+ . = ..()
+
+/obj/item/scrying/attack_self(mob/user)
+ to_chat(user, "You can see...everything!")
+ visible_message("[user] stares into [src], their eyes glazing over.")
+ user.ghostize(1)
+
+/////////////////////////////////////////Necromantic Stone///////////////////
+
+/obj/item/device/necromantic_stone
+ name = "necromantic stone"
+ desc = "A shard capable of resurrecting humans as skeleton thralls."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "necrostone"
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ var/list/spooky_scaries = list()
+ var/unlimited = 0
+
+/obj/item/device/necromantic_stone/unlimited
+ unlimited = 1
+
+/obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
+ if(!istype(M))
+ return ..()
+
+ if(!istype(user) || !user.canUseTopic(M, BE_CLOSE))
+ return
+
+ if(M.stat != DEAD)
+ to_chat(user, "This artifact can only affect the dead!")
+ return
+
+ if(!M.mind || !M.client)
+ to_chat(user, "There is no soul connected to this body...")
+ return
+
+ check_spooky()//clean out/refresh the list
+ if(spooky_scaries.len >= 3 && !unlimited)
+ to_chat(user, "This artifact can only affect three undead at a time!")
+ return
+
+ M.set_species(/datum/species/skeleton, icon_update=0)
+ M.revive(full_heal = 1, admin_revive = 1)
+ spooky_scaries |= M
+ to_chat(M, "You have been revived by [user.real_name]!")
+ to_chat(M, "[user.p_they(TRUE)] [user.p_are()] your master now, assist them even if it costs you your new life!")
+
+ equip_roman_skeleton(M)
+
+ desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]"
+
+/obj/item/device/necromantic_stone/proc/check_spooky()
+ if(unlimited) //no point, the list isn't used.
+ return
+
+ for(var/X in spooky_scaries)
+ if(!ishuman(X))
+ spooky_scaries.Remove(X)
+ continue
+ var/mob/living/carbon/human/H = X
+ if(H.stat == DEAD)
+ H.dust(TRUE)
+ spooky_scaries.Remove(X)
+ continue
+ listclearnulls(spooky_scaries)
+
+//Funny gimmick, skeletons always seem to wear roman/ancient armour
+/obj/item/device/necromantic_stone/proc/equip_roman_skeleton(mob/living/carbon/human/H)
+ for(var/obj/item/I in H)
+ H.dropItemToGround(I)
+
+ var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
+ H.equip_to_slot_or_del(new hat(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
+ H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
+ H.put_in_hands(new /obj/item/claymore(H), TRUE)
+ H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
+
+
+/obj/item/voodoo
+ name = "wicker doll"
+ desc = "Something creepy about it."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "voodoo"
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ var/mob/living/carbon/human/target = null
+ var/list/mob/living/carbon/human/possible = list()
+ var/obj/item/voodoo_link = null
+ var/cooldown_time = 30 //3s
+ var/cooldown = 0
+ max_integrity = 10
+ resistance_flags = FLAMMABLE
+
+/obj/item/voodoo/attackby(obj/item/I, mob/user, params)
+ if(target && cooldown < world.time)
+ if(I.is_hot())
+ to_chat(target, "You suddenly feel very hot")
+ target.bodytemperature += 50
+ GiveHint(target)
+ else if(is_pointed(I))
+ to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!")
+ target.Knockdown(40)
+ GiveHint(target)
+ else if(istype(I, /obj/item/bikehorn))
+ to_chat(target, "HONK")
+ SEND_SOUND(target, 'sound/items/airhorn.ogg')
+ target.adjustEarDamage(0,3)
+ GiveHint(target)
+ cooldown = world.time +cooldown_time
+ return
+
+ if(!voodoo_link)
+ if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
+ if (user.transferItemToLoc(I,src))
+ voodoo_link = I
+ to_chat(user, "You attach [I] to the doll.")
+ update_targets()
+
+/obj/item/voodoo/check_eye(mob/user)
+ if(loc != user)
+ user.reset_perspective(null)
+ user.unset_machine()
+
+/obj/item/voodoo/attack_self(mob/user)
+ if(!target && possible.len)
+ target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
+ return
+
+ if(user.zone_selected == "chest")
+ if(voodoo_link)
+ target = null
+ voodoo_link.forceMove(drop_location())
+ to_chat(user, "You remove the [voodoo_link] from the doll.")
+ voodoo_link = null
+ update_targets()
+ return
+
+ if(target && cooldown < world.time)
+ switch(user.zone_selected)
+ if("mouth")
+ var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
+ target.say(wgw)
+ log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.")
+ if("eyes")
+ user.set_machine(src)
+ user.reset_perspective(target)
+ spawn(100)
+ user.reset_perspective(null)
+ user.unset_machine()
+ if("r_leg","l_leg")
+ to_chat(user, "You move the doll's legs around.")
+ var/turf/T = get_step(target,pick(GLOB.cardinals))
+ target.Move(T)
+ if("r_arm","l_arm")
+ target.click_random_mob()
+ GiveHint(target)
+ if("head")
+ to_chat(user, "You smack the doll's head with your hand.")
+ target.Dizzy(10)
+ to_chat(target, "You suddenly feel as if your head was hit with a hammer!")
+ GiveHint(target,user)
+ cooldown = world.time + cooldown_time
+
+/obj/item/voodoo/proc/update_targets()
+ possible = list()
+ if(!voodoo_link)
+ return
+ var/list/prints = voodoo_link.return_fingerprints()
+ if(!length(prints))
+ return FALSE
+ for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
+ if(prints[md5(H.dna.uni_identity)])
+ possible |= H
+
+/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
+ if(prob(50) || force)
+ var/way = dir2text(get_dir(victim,get_turf(src)))
+ to_chat(victim, "You feel a dark presence from [way]")
+ if(prob(20) || force)
+ var/area/A = get_area(src)
+ to_chat(victim, "You feel a dark presence from [A.name]")
+
+/obj/item/voodoo/suicide_act(mob/living/carbon/user)
+ user.visible_message("[user] links the voodoo doll to themself and sits on it, infinitely crushing themself! It looks like [user.p_theyre()] trying to commit suicide!")
+ user.gib()
+ return(BRUTELOSS)
+
+/obj/item/voodoo/fire_act(exposed_temperature, exposed_volume)
+ if(target)
+ target.adjust_fire_stacks(20)
+ target.IgniteMob()
+ GiveHint(target,1)
+ return ..()
+
+//Provides a decent heal, need to pump every 6 seconds
+/obj/item/organ/heart/cursed/wizard
+ pump_delay = 60
+ heal_brute = 25
+ heal_burn = 25
+ heal_oxy = 25
+
+//Warp Whistle: Provides uncontrolled long distance teleportation.
+
+/obj/item/warpwhistle
+ name = "warp whistle"
+ desc = "One toot on this whistle will send you to a far away land!"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "whistle"
+ var/on_cooldown = 0 //0: usable, 1: in use, 2: on cooldown
+ var/mob/living/carbon/last_user
+
+/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user)
+ if(!user || QDELETED(src) || user.notransform)
+ on_cooldown = FALSE
+ return TRUE
+ return FALSE
+
+/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
+ if(!istype(user) || on_cooldown)
+ return
+ on_cooldown = TRUE
+ last_user = user
+ var/turf/T = get_turf(user)
+ playsound(T,'sound/magic/warpwhistle.ogg', 200, 1)
+ user.canmove = 0
+ new /obj/effect/temp_visual/tornado(T)
+ sleep(20)
+ if(interrupted(user))
+ return
+ user.invisibility = INVISIBILITY_MAXIMUM
+ user.status_flags |= GODMODE
+ sleep(20)
+ if(interrupted(user))
+ return
+ var/breakout = 0
+ while(breakout < 50)
+ var/turf/potential_T = find_safe_turf()
+ if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
+ user.forceMove(potential_T)
+ user.canmove = 0
+ T = potential_T
+ break
+ breakout += 1
+ new /obj/effect/temp_visual/tornado(T)
+ sleep(20)
+ if(interrupted(user))
+ return
+ user.invisibility = initial(user.invisibility)
+ user.status_flags &= ~GODMODE
+ user.canmove = 1
+ on_cooldown = 2
+ sleep(40)
+ on_cooldown = 0
+
+/obj/item/warpwhistle/Destroy()
+ if(on_cooldown == 1 && last_user) //Flute got dunked somewhere in the teleport
+ last_user.invisibility = initial(last_user.invisibility)
+ last_user.status_flags &= ~GODMODE
+ last_user.canmove = 1
+ return ..()
+
+/obj/effect/temp_visual/tornado
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "tornado"
+ name = "tornado"
+ desc = "This thing sucks!"
+ layer = FLY_LAYER
+ randomdir = 0
+ duration = 40
+ pixel_x = 500
+
+/obj/effect/temp_visual/tornado/Initialize()
+ . = ..()
+ animate(src, pixel_x = -500, time = 40)
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 071cfa7eef..8c46d30591 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -161,17 +161,14 @@
set category = "Object"
set src in usr
- if(usr.incapacitated())
+ if(!usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
return
setDir(turn(dir, -90))
/obj/item/device/assembly/infra/AltClick(mob/user)
..()
- if(user.incapacitated())
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
+ if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
return
else
rotate()
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 9880d0ba46..7925d586e7 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -734,8 +734,7 @@
/obj/machinery/airalarm/AltClick(mob/user)
..()
- if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)))
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
return
else
togglelock(user)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 9923e19803..0ea1328299 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -90,7 +90,7 @@
return ..()
/obj/item/clothing/AltClick(mob/user)
- if(pockets && pockets.quickdraw && pockets.contents.len && !user.incapacitated())
+ if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)) && pockets && pockets.quickdraw && pockets.contents.len)
var/obj/item/I = pockets.contents[1]
if(!I)
return
@@ -244,7 +244,7 @@ BLIND // can't see anything
if(..())
return 1
- if(!user.canUseTopic(src, be_close=TRUE))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
to_chat(user, "You can't do that right now!")
return
else
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index d540b5b963..0a1adb1dca 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -87,7 +87,7 @@
to_chat(user, "Alt-click to take a candy corn.")
/obj/item/clothing/head/fedora/det_hat/AltClick(mob/user)
- if(user.canUseTopic(src, be_close=TRUE))
+ if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
..()
if(loc == user)
if(candy_cooldown < world.time)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index ec99487b4b..6c5f0cb529 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -1,132 +1,131 @@
-/obj/item/clothing/head/soft
- name = "cargo cap"
- desc = "It's a baseball hat in a tasteless yellow colour."
- icon_state = "cargosoft"
- item_state = "helmet"
- item_color = "cargo"
-
- dog_fashion = /datum/dog_fashion/head/cargo_tech
-
- var/flipped = 0
-
-/obj/item/clothing/head/soft/dropped()
- src.icon_state = "[item_color]soft"
- src.flipped=0
- ..()
-
-/obj/item/clothing/head/soft/verb/flipcap()
- set category = "Object"
- set name = "Flip cap"
-
- flip(usr)
-
-
-/obj/item/clothing/head/soft/AltClick(mob/user)
- ..()
- if(!user.canUseTopic(src, be_close=TRUE))
- to_chat(user, "You can't do that right now!")
- return
- else
- flip(user)
-
-
-/obj/item/clothing/head/soft/proc/flip(mob/user)
- if(user.canmove && !user.stat && !user.restrained())
- src.flipped = !src.flipped
- if(src.flipped)
- icon_state = "[item_color]soft_flipped"
- to_chat(user, "You flip the hat backwards.")
- else
- icon_state = "[item_color]soft"
- to_chat(user, "You flip the hat back in normal position.")
- usr.update_inv_head() //so our mob-overlays update
-
-/obj/item/clothing/head/soft/examine(mob/user)
- ..()
- to_chat(user, "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"].")
-
-/obj/item/clothing/head/soft/red
- name = "red cap"
- desc = "It's a baseball hat in a tasteless red colour."
- icon_state = "redsoft"
- item_color = "red"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/blue
- name = "blue cap"
- desc = "It's a baseball hat in a tasteless blue colour."
- icon_state = "bluesoft"
- item_color = "blue"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/green
- name = "green cap"
- desc = "It's a baseball hat in a tasteless green colour."
- icon_state = "greensoft"
- item_color = "green"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/yellow
- name = "yellow cap"
- desc = "It's a baseball hat in a tasteless yellow colour."
- icon_state = "yellowsoft"
- item_color = "yellow"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/grey
- name = "grey cap"
- desc = "It's a baseball hat in a tasteful grey colour."
- icon_state = "greysoft"
- item_color = "grey"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/orange
- name = "orange cap"
- desc = "It's a baseball hat in a tasteless orange colour."
- icon_state = "orangesoft"
- item_color = "orange"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/mime
- name = "white cap"
- desc = "It's a baseball hat in a tasteless white colour."
- icon_state = "mimesoft"
- item_color = "mime"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/purple
- name = "purple cap"
- desc = "It's a baseball hat in a tasteless purple colour."
- icon_state = "purplesoft"
- item_color = "purple"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/black
- name = "black cap"
- desc = "It's a baseball hat in a tasteless black colour."
- icon_state = "blacksoft"
- item_color = "black"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/rainbow
- name = "rainbow cap"
- desc = "It's a baseball hat in a bright rainbow of colors."
- icon_state = "rainbowsoft"
- item_color = "rainbow"
- dog_fashion = null
-
-/obj/item/clothing/head/soft/sec
- name = "security cap"
- desc = "It's a robust baseball hat in tasteful red colour."
- icon_state = "secsoft"
- item_color = "sec"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
- strip_delay = 60
- dog_fashion = null
-
-/obj/item/clothing/head/soft/emt
- name = "EMT cap"
- desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top."
- icon_state = "emtsoft"
- item_color = "emt"
- dog_fashion = null
+/obj/item/clothing/head/soft
+ name = "cargo cap"
+ desc = "It's a baseball hat in a tasteless yellow colour."
+ icon_state = "cargosoft"
+ item_state = "helmet"
+ item_color = "cargo"
+
+ dog_fashion = /datum/dog_fashion/head/cargo_tech
+
+ var/flipped = 0
+
+/obj/item/clothing/head/soft/dropped()
+ src.icon_state = "[item_color]soft"
+ src.flipped=0
+ ..()
+
+/obj/item/clothing/head/soft/verb/flipcap()
+ set category = "Object"
+ set name = "Flip cap"
+
+ flip(usr)
+
+
+/obj/item/clothing/head/soft/AltClick(mob/user)
+ ..()
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ else
+ flip(user)
+
+
+/obj/item/clothing/head/soft/proc/flip(mob/user)
+ if(!user.incapacitated())
+ src.flipped = !src.flipped
+ if(src.flipped)
+ icon_state = "[item_color]soft_flipped"
+ to_chat(user, "You flip the hat backwards.")
+ else
+ icon_state = "[item_color]soft"
+ to_chat(user, "You flip the hat back in normal position.")
+ usr.update_inv_head() //so our mob-overlays update
+
+/obj/item/clothing/head/soft/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"].")
+
+/obj/item/clothing/head/soft/red
+ name = "red cap"
+ desc = "It's a baseball hat in a tasteless red colour."
+ icon_state = "redsoft"
+ item_color = "red"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/blue
+ name = "blue cap"
+ desc = "It's a baseball hat in a tasteless blue colour."
+ icon_state = "bluesoft"
+ item_color = "blue"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/green
+ name = "green cap"
+ desc = "It's a baseball hat in a tasteless green colour."
+ icon_state = "greensoft"
+ item_color = "green"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/yellow
+ name = "yellow cap"
+ desc = "It's a baseball hat in a tasteless yellow colour."
+ icon_state = "yellowsoft"
+ item_color = "yellow"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/grey
+ name = "grey cap"
+ desc = "It's a baseball hat in a tasteful grey colour."
+ icon_state = "greysoft"
+ item_color = "grey"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/orange
+ name = "orange cap"
+ desc = "It's a baseball hat in a tasteless orange colour."
+ icon_state = "orangesoft"
+ item_color = "orange"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/mime
+ name = "white cap"
+ desc = "It's a baseball hat in a tasteless white colour."
+ icon_state = "mimesoft"
+ item_color = "mime"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/purple
+ name = "purple cap"
+ desc = "It's a baseball hat in a tasteless purple colour."
+ icon_state = "purplesoft"
+ item_color = "purple"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/black
+ name = "black cap"
+ desc = "It's a baseball hat in a tasteless black colour."
+ icon_state = "blacksoft"
+ item_color = "black"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/rainbow
+ name = "rainbow cap"
+ desc = "It's a baseball hat in a bright rainbow of colors."
+ icon_state = "rainbowsoft"
+ item_color = "rainbow"
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/sec
+ name = "security cap"
+ desc = "It's a robust baseball hat in tasteful red colour."
+ icon_state = "secsoft"
+ item_color = "sec"
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 20, acid = 50)
+ strip_delay = 60
+ dog_fashion = null
+
+/obj/item/clothing/head/soft/emt
+ name = "EMT cap"
+ desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top."
+ icon_state = "emtsoft"
+ item_color = "emt"
+ dog_fashion = null
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 9fd328c2d6..f7c99a24d3 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -23,8 +23,7 @@ obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user)
/obj/item/clothing/mask/breath/AltClick(mob/user)
..()
- if(!user.canUseTopic(src, be_close=TRUE))
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else
adjustmask(user)
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index d036710ce4..d09db447a8 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -93,8 +93,7 @@
/obj/item/clothing/suit/toggle/AltClick(mob/user)
..()
- if(!user.canUseTopic(src, be_close=TRUE))
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
else
suit_toggle(user)
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 30105fecac..df0783e4e7 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -69,7 +69,7 @@
return
/obj/item/clothing/accessory/AltClick(mob/user)
- if(user.canUseTopic(src, be_close=TRUE))
+ if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(initial(above_suit))
above_suit = !above_suit
to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.")
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index b38712b375..5bc2be78ce 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -169,7 +169,7 @@
interact(user)
/obj/machinery/microwave/AltClick(mob/user)
- if(user.canUseTopic(src, be_close=TRUE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
+ if(user.canUseTopic(src, BE_CLOSE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
cook()
/*******************
diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm
index 00e513dcbd..5a4f949fcb 100644
--- a/code/modules/games/cas.dm
+++ b/code/modules/games/cas.dm
@@ -117,7 +117,7 @@
set name = "Flip Card"
set category = "Object"
set src in range(1)
- if(!usr.canUseTopic(src,1))
+ if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE))
return
if(!flipped)
name = "CAS card"
@@ -127,7 +127,7 @@
update_icon()
/obj/item/toy/cards/singlecard/cas/AltClick(mob/living/user)
- if(!user.canUseTopic(src,1))
+ if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE))
return
Flip()
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index fc4ac2e364..b039c1e968 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -24,7 +24,7 @@
armor = list(melee = 50, bullet = 70, laser = 70, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0)
/obj/item/device/electronic_assembly/proc/check_interactivity(mob/user)
- return user.canUseTopic(src,be_close = TRUE)
+ return user.canUseTopic(src, BE_CLOSE)
/obj/item/device/electronic_assembly/Initialize()
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index 43d7dd1ad1..82dead20c3 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -68,7 +68,7 @@ a creative player the means to solve many problems. Circuits are held inside an
if(assembly)
return assembly.check_interactivity(user)
else
- return user.canUseTopic(src,be_close = TRUE)
+ return user.canUseTopic(src, BE_CLOSE)
/obj/item/integrated_circuit/Initialize()
displayed_name = name
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index c5336094f1..f17744faae 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -10,7 +10,7 @@
var/list/program // Currently loaded save, in form of list
/obj/item/device/integrated_circuit_printer/proc/check_interactivity(mob/user)
- return user.canUseTopic(src, be_close = TRUE)
+ return user.canUseTopic(src, BE_CLOSE)
/obj/item/device/integrated_circuit_printer/upgraded
upgraded = TRUE
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index c20971fe9d..db11737a49 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -154,7 +154,7 @@
if(locked)
to_chat(user, "The crate is locked with a Deca-code lock.")
var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text
- if(user.canUseTopic(src, 1))
+ if(user.canUseTopic(src, BE_CLOSE))
var/list/sanitised = list()
var/sanitycheck = 1
for(var/i=1,i<=length(input),i++) //put the guess into a list
@@ -180,7 +180,7 @@
return ..()
/obj/structure/closet/crate/secure/loot/AltClick(mob/living/user)
- if(!user.canUseTopic(src))
+ if(!user.canUseTopic(src, BE_CLOSE))
return
attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom.
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index d2abbe6f74..e93e3713c3 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -57,13 +57,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
transfer_fingerprints_to(M)
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
- if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
if(input_color)
picked_color = input_color
@@ -129,13 +126,10 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list(
/obj/structure/marker_beacon/AltClick(mob/living/user)
..()
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
- if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
if(input_color)
picked_color = input_color
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 48b1c6b6b8..94d1cfef91 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -724,13 +724,13 @@
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated() || lying )
- return
+ return FALSE
if(!Adjacent(M) && (M.loc != src))
if((be_close == 0) && (dna.check_mutation(TK)))
if(tkMaxRangeCheck(src, M))
- return 1
- return
- return 1
+ return TRUE
+ return FALSE
+ return TRUE
/mob/living/carbon/human/resist_restraints()
if(wear_suit && wear_suit.breakouttime)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 9301e3b409..fd7ae7e22f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -787,13 +787,14 @@
/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated())
- return
+ return FALSE
if(no_dextery)
if(be_close && in_range(M, src))
- return 1
+ return TRUE
else
to_chat(src, "You don't have the dexterity to do this!")
- return
+ return FALSE
+
/mob/living/proc/can_use_guns(obj/item/G)
if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
to_chat(src, "You don't have the dexterity to do this!")
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 779d5dcded..cd6cbebbda 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -185,6 +185,8 @@
// See software.dm for Topic()
/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
+ if(be_close && !in_range(M, src))
+ return FALSE
return TRUE
/mob/proc/makePAI(delold)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 46b8612dda..c2e0abb349 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -879,10 +879,10 @@
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(stat || lockcharge || low_power_mode)
- return
+ return FALSE
if(be_close && !in_range(M, src))
- return
- return 1
+ return FALSE
+ return TRUE
/mob/living/silicon/robot/updatehealth()
..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 73bab3468b..631e4589d6 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -377,23 +377,23 @@
/mob/living/simple_animal/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE)
if(incapacitated())
- return 0
+ return FALSE
if(no_dextery || dextrous)
if(be_close && !in_range(M, src))
- return 0
+ return FALSE
else
to_chat(src, "You don't have the dexterity to do this!")
- return 0
- return 1
+ return FALSE
+ return TRUE
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who, where)
- if(!canUseTopic(who, TRUE))
+ if(!canUseTopic(who, BE_CLOSE))
return
else
..()
/mob/living/simple_animal/stripPanelEquip(obj/item/what, mob/who, where)
- if(!canUseTopic(who, TRUE))
+ if(!canUseTopic(who, BE_CLOSE))
return
else
..()
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index 3753febca2..e4908c57c7 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -99,12 +99,9 @@
H.emote("scream")
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
- if ( istype(user) )
- if( (!in_range(src, user)) || user.stat || user.restrained() )
- return
- to_chat(user, "You fold [src] into the shape of a plane!")
- user.temporarilyRemoveItemFromInventory(src)
- I = new /obj/item/paperplane(user, src)
- user.put_in_hands(I)
- else
- to_chat(user, " You lack the dexterity to fold \the [src]. ")
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ to_chat(user, "You fold [src] into the shape of a plane!")
+ user.temporarilyRemoveItemFromInventory(src)
+ I = new /obj/item/paperplane(user, src)
+ user.put_in_hands(I)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 4b093641d9..955f7e5810 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -128,12 +128,12 @@
if(isobj(O) && proximity)
if(O.obj_flags & UNIQUE_RENAME)
var/penchoice = input(user, "What would you like to edit?", "Rename or change description?") as null|anything in list("Rename","Change description")
- if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE))
+ if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE))
if(penchoice == "Rename")
var/input = stripped_input(user,"What do you want to name \the [O.name]?", ,"", MAX_NAME_LEN)
var/oldname = O.name
- if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE))
+ if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE))
if(oldname == input)
to_chat(user, "You changed \the [O.name] to... well... \the [O.name].")
return
@@ -146,7 +146,7 @@
if(penchoice == "Change description")
var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100)
- if(!QDELETED(O) && user.canUseTopic(O, be_close = TRUE))
+ if(!QDELETED(O) && user.canUseTopic(O, BE_CLOSE))
O.desc = input
to_chat(user, "You have successfully changed \the [O.name]'s description.")
return
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index b48f3392df..6fa13fe8c3 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -313,7 +313,7 @@
/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
- if (!istype(target) || target.anchored || target.buckled || !Adjacent(user) || !Adjacent(target) || !user.canUseTopic(src, 1) || target == ass || copier_blocked())
+ if (!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE) || target == ass || copier_blocked())
return
src.add_fingerprint(user)
if(target == user)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 695b01e0b7..a99ccd4d14 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -662,8 +662,7 @@
/obj/machinery/power/apc/AltClick(mob/user)
..()
- if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)))
- to_chat(user, "You can't do that right now!")
+ if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
return
else
togglelock(user)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 6382b231a8..315178368d 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -240,7 +240,7 @@
to_chat(user, "You switch to tube A.")
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/AltClick(mob/living/user)
- if(user.incapacitated() || !Adjacent(user) || !istype(user))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
pump()
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index ffa73aa994..c336e3b745 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -223,7 +223,7 @@
return
vol_each = min(reagents.total_volume / amount, 50)
var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
- if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
+ if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/pill/P
@@ -237,7 +237,7 @@
reagents.trans_to(P,vol_each)
else
var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)
- if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
+ if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location())
@@ -259,7 +259,7 @@
return
vol_each = min(reagents.total_volume / amount, 40)
var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
- if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
+ if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/pill/P
@@ -277,7 +277,7 @@
if(condi)
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
- if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
+ if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/food/condiment/P = new(drop_location())
P.originalname = name
@@ -290,7 +290,7 @@
amount_full = round(reagents.total_volume / 30)
vol_part = reagents.total_volume % 30
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
- if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, be_close=TRUE))
+ if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE))
return
var/obj/item/reagent_containers/glass/bottle/P
diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm
index 5690bb1ad4..408b37cf12 100644
--- a/code/modules/vehicles/ridden.dm
+++ b/code/modules/vehicles/ridden.dm
@@ -42,7 +42,7 @@
return ..()
/obj/vehicle/ridden/AltClick(mob/user)
- if(user.Adjacent(src) && inserted_key)
+ if(inserted_key && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
if(!is_occupant(user))
to_chat(user, "You must be riding the [src] to remove [src]'s key!")
return