diff --git a/code/_onclick/hud/hud_datum.dm b/code/_onclick/hud/hud_datum.dm index 79d799fa9a1..4d65d41e8cc 100644 --- a/code/_onclick/hud/hud_datum.dm +++ b/code/_onclick/hud/hud_datum.dm @@ -203,16 +203,12 @@ /datum/hud/proc/persistent_inventory_update() return -//Triggered when F12 is pressed (Unless someone changed something in the DMF) -/mob/verb/button_pressed_F12() - set name = "F12" - set hidden = TRUE - +/mob/proc/hide_hud() if(hud_used && client) hud_used.show_hud() //Shows the next hud preset - to_chat(usr, "Switched HUD mode. Press F12 to toggle.") + to_chat(src, "Switched HUD mode. Press the key you just pressed to toggle the HUD mode again.") else - to_chat(usr, "This mob type does not use a HUD.") + to_chat(src, "This mob type does not use a HUD.") /datum/hud/proc/update_locked_slots() return diff --git a/code/datums/keybindings/client.dm b/code/datums/keybindings/client.dm index c27fa2a0206..b9f6cc79a62 100644 --- a/code/datums/keybindings/client.dm +++ b/code/datums/keybindings/client.dm @@ -47,4 +47,4 @@ /datum/keybinding/client/toggle_min_hud/down(client/C) . = ..() - C.mob.button_pressed_F12() + C.mob.hide_hud() diff --git a/code/datums/keybindings/human_keybinds.dm b/code/datums/keybindings/human_keybinds.dm index e1bc0f54386..0005d17efb9 100644 --- a/code/datums/keybindings/human_keybinds.dm +++ b/code/datums/keybindings/human_keybinds.dm @@ -41,7 +41,7 @@ if(!M.w_uniform) return var/obj/item/clothing/accessory/holster/H = locate() in M.w_uniform - H?.holster_verb() + H?.handle_holster_usage(M) /datum/keybinding/human/parry name = "Parry" diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 702e103cab5..7fb1115727f 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -72,6 +72,11 @@ var/scan_level var/precision_coeff +/obj/machinery/dna_scannernew/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to eject its occupant." + . += "You can Click-drag someone to [src] to put them in." + /obj/machinery/dna_scannernew/Initialize(mapload) . = ..() component_parts = list() @@ -115,15 +120,11 @@ return go_out() -/obj/machinery/dna_scannernew/verb/eject() - set src in oview(1) - set category = null - set name = "Eject DNA Scanner" - - if(usr.incapacitated()) +/obj/machinery/dna_scannernew/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - eject_occupant(usr) - add_fingerprint(usr) + eject_occupant(user) + add_fingerprint(user) /obj/machinery/dna_scannernew/Destroy() eject_occupant(null, TRUE) @@ -141,32 +142,6 @@ for(var/mob/M in src)//Failsafe so you can get mobs out M.forceMove(get_turf(src)) -/obj/machinery/dna_scannernew/verb/move_inside() - set src in oview(1) - set category = null - set name = "Enter DNA Scanner" - - if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other - return - if(!ishuman(usr)) //Make sure they're a mob that has dna - to_chat(usr, "Try as you might, you can not climb up into [src].") - return - if(occupant) - to_chat(usr, "[src] is already occupied!") - return - if(usr.abiotic()) - to_chat(usr, "Subject may not hold anything in their hands.") - return - if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") - return - usr.stop_pulling() - usr.forceMove(src) - occupant = usr - icon_state = "scanner_occupied" - add_fingerprint(usr) - SStgui.update_uis(src) - /obj/machinery/dna_scannernew/update_icon_state() if(occupant) icon_state = "scanner_occupied" diff --git a/code/game/gamemodes/miniantags/guardian/host_actions.dm b/code/game/gamemodes/miniantags/guardian/host_actions.dm index 2872520747d..a6df9937431 100644 --- a/code/game/gamemodes/miniantags/guardian/host_actions.dm +++ b/code/game/gamemodes/miniantags/guardian/host_actions.dm @@ -102,6 +102,81 @@ dust_if_respawnable(new_stand) qdel(src) +/obj/effect/proc_holder/spell/summon_guardian_beacon + name = "Place Teleportation Beacon" + desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon requires an anchor, will not work on space tiles." + clothes_req = FALSE + base_cooldown = 300 SECONDS + action_icon_state = "no_state" + action_background_icon_state = "reset" + action_icon = 'icons/mob/guardian.dmi' + +/obj/effect/proc_holder/spell/summon_guardian_beacon/create_new_targeting() + return new /datum/spell_targeting/self + +/obj/effect/proc_holder/spell/summon_guardian_beacon/cast(list/targets, mob/living/user = usr) + var/target = targets[1] + var/mob/living/simple_animal/hostile/guardian/healer/guardian_user = user + var/turf/beacon_loc = get_turf(target) + if(isfloorturf(beacon_loc) && !islava(beacon_loc) && !ischasm(beacon_loc)) + QDEL_NULL(guardian_user.beacon) + guardian_user.beacon = new(beacon_loc) + to_chat(guardian_user, "Beacon placed! You may now warp targets to it, including your user, via Alt Click.") + + return TRUE + +/obj/effect/proc_holder/spell/surveillance_snare + name = "Set Surveillance Snare" + desc = "Places an invisible Surveillance Snare on the ground, if someone walks over it you'll be alerted. Max of 6 snares active at a time" + clothes_req = FALSE + base_cooldown = 3 SECONDS + action_icon_state = "no_state" + action_background_icon_state = "reset" + action_icon = 'icons/mob/guardian.dmi' + +/obj/effect/proc_holder/spell/surveillance_snare/create_new_targeting() + return new /datum/spell_targeting/self + +/obj/effect/proc_holder/spell/surveillance_snare/cast(list/targets, mob/living/user = usr) + var/target = targets[1] + var/mob/living/simple_animal/hostile/guardian/ranged/guardian_user = user + if(length(guardian_user.snares) < 6) + var/turf/snare_loc = get_turf(target) + var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) + S.spawner = guardian_user + S.name = "[get_area(snare_loc)] trap ([snare_loc.x],[snare_loc.y],[snare_loc.z])" + guardian_user.snares |= S + to_chat(guardian_user, "Surveillance trap deployed!") + return TRUE + else + to_chat(guardian_user, "You have too many traps deployed. Delete one to place another.") + var/picked_snare = input(guardian_user, "Pick which trap to disarm", "Disarm Trap") as null|anything in guardian_user.snares + if(picked_snare) + guardian_user.snares -= picked_snare + qdel(picked_snare) + to_chat(src, "Snare disarmed.") + revert_cast() + +/obj/effect/proc_holder/spell/choose_battlecry + name = "Change battlecry" + desc = "Changes your battlecry." + clothes_req = FALSE + base_cooldown = 1 SECONDS + action_icon_state = "no_state" + action_background_icon_state = "communicate" + action_icon = 'icons/mob/guardian.dmi' + +/obj/effect/proc_holder/spell/choose_battlecry/create_new_targeting() + return new /datum/spell_targeting/self + +/obj/effect/proc_holder/spell/choose_battlecry/cast(list/targets, mob/living/user = usr) + var/mob/living/simple_animal/hostile/guardian/punch/guardian_user = user + var/input = stripped_input(guardian_user, "What do you want your battlecry to be? Max length of 5 characters.", ,"", 6) + if(!input) + revert_cast() + return + guardian_user.battlecry = input + /** * Takes the action button off cooldown and makes it available again. */ diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index 7622b105ca0..466a448f728 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -34,6 +34,10 @@ melee_damage_type = STAMINA admin_spawned = TRUE +/mob/living/simple_animal/hostile/guardian/healer/Initialize(mapload, mob/living/host) + . = ..() + AddSpell(new /obj/effect/proc_holder/spell/summon_guardian_beacon(null)) + /mob/living/simple_animal/hostile/guardian/healer/Destroy() QDEL_NULL(beacon) return ..() @@ -109,21 +113,6 @@ else to_chat(src, "You have to be recalled to toggle modes!") -/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() - set name = "Place Bluespace Beacon" - set category = "Guardian" - set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." - if(beacon_cooldown < world.time) - var/turf/beacon_loc = get_turf(loc) - if(isfloorturf(beacon_loc) && !islava(beacon_loc) && !ischasm(beacon_loc)) - QDEL_NULL(beacon) - beacon = new(beacon_loc) - to_chat(src, "Beacon placed! You may now warp targets to it, including your user, via Alt+Click. ") - beacon_cooldown = world.time + default_beacon_cooldown - - else - to_chat(src, "Your power is on cooldown! You must wait another [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds before you can place another beacon.") - /obj/effect/bluespace_beacon name = "bluespace receiving pad" desc = "A receiving zone for bluespace teleportations. Building a wall over it should disable it." @@ -147,7 +136,7 @@ to_chat(src, "Your target can not be anchored!") return to_chat(src, "You begin to warp [A]") - if(do_mob(src, A, 50)) + if(do_mob(src, A, 5 SECONDS)) if(!A.anchored) if(!beacon) //Check that the beacon still exists and is in a safe place. No instant kills. to_chat(src, "You need a beacon to warp things!") diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index a89930f5d75..a47ea8fc521 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -25,6 +25,10 @@ var/list/snares = list() var/toggle = FALSE +/mob/living/simple_animal/hostile/guardian/ranged/Initialize(mapload, mob/living/host) + . = ..() + AddSpell(new /obj/effect/proc_holder/spell/surveillance_snare(null)) + /mob/living/simple_animal/hostile/guardian/ranged/ToggleMode() if(loc == summoner) if(toggle) @@ -74,30 +78,6 @@ to_chat(src, "[msg]") -/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() - set name = "Set Surveillance Trap" - set category = "Guardian" - set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5" - if(snares.len <6) - var/turf/snare_loc = get_turf(loc) - var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) - S.spawner = src - S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" - snares |= S - to_chat(src, "Surveillance trap deployed!") - else - to_chat(src, "You have too many traps deployed. Delete some first.") - -/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() - set name = "Remove Surveillance Trap" - set category = "Guardian" - set desc = "Disarm unwanted surveillance traps." - var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in snares - if(picked_snare) - snares -= picked_snare - qdel(picked_snare) - to_chat(src, "Snare disarmed.") - /obj/item/effect/snare name = "snare" desc = "You shouldn't be seeing this!" diff --git a/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm index bb08805bbe2..d08698bcacd 100644 --- a/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm @@ -10,13 +10,9 @@ bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies." var/battlecry = "AT" -/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() - set name = "Set Battlecry" - set category = "Guardian" - set desc = "Choose what you shout as you punch" - var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 5 characters.", ,"", 6) - if(input) - battlecry = input +/mob/living/simple_animal/hostile/guardian/punch/Initialize(mapload, mob/living/host) + . = ..() + AddSpell(new /obj/effect/proc_holder/spell/choose_battlecry(null)) /mob/living/simple_animal/hostile/guardian/punch/AttackingTarget() . = ..() diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index e878465904b..07b0cc95ee5 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -173,18 +173,14 @@ /obj/item/pinpointer/advpinpointer/AltClick(mob/user) if(!isliving(user) || !Adjacent(user)) return ..() - toggle_mode() + toggle_mode(user) -/obj/item/pinpointer/advpinpointer/verb/toggle_mode() - set category = "Object" - set name = "Toggle Pinpointer Mode" - set src in usr - - if(usr.stat || usr.restrained()) +/obj/item/pinpointer/advpinpointer/proc/toggle_mode(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(modelocked) - to_chat(usr, "[src] is locked. It can only track one specific target.") + to_chat(user, "[src] is locked. It can only track one specific target.") return target = null @@ -194,18 +190,18 @@ if("Location") setting = SETTING_LOCATION - var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num - if(!locationx || !(usr in view(1,src))) + var/locationx = input(user, "Please input the x coordinate to search for.", "Location?" , "") as num + if(!locationx || !(user in view(1,src))) return - var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num - if(!locationy || !(usr in view(1,src))) + var/locationy = input(user, "Please input the y coordinate to search for.", "Location?" , "") as num + if(!locationy || !(user in view(1,src))) return var/turf/Z = get_turf(src) location = locate(locationx,locationy,Z.z) - to_chat(usr, "You set the pinpointer to locate [locationx],[locationy]") + to_chat(user, "You set the pinpointer to locate [locationx],[locationy]") toggle_on() @@ -235,12 +231,12 @@ var/cand_z = (get_turf(candidate)).z if(is_admin_level(cand_z)) continue - if(usr.z != cand_z) + if(user.z != cand_z) if(!backup) backup = candidate continue // no candidate set yet, or check if there is a closer one - if(!priority || (get_dist(usr, candidate) < get_dist(usr, priority))) + if(!priority || (get_dist(user, candidate) < get_dist(user, priority))) priority = candidate if(priority) @@ -248,13 +244,13 @@ else target = backup if(target) - to_chat(usr, "Unable to find [targetitem] in this sector, falling back to off-sector tracking.") + to_chat(user, "Unable to find [targetitem] in this sector, falling back to off-sector tracking.") if(!target) - to_chat(usr, "Failed to locate [targetitem]!") + to_chat(user, "Failed to locate [targetitem]!") return - to_chat(usr, "You set the pinpointer to locate [targetitem].") + to_chat(user, "You set the pinpointer to locate [targetitem].") if("DNA") var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "") diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index fd36bd11c03..9f18c071cfe 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -38,8 +38,7 @@ . += "You see [occupant.name] inside. [occupant.p_they(TRUE)] [occupant.p_are()] dead!" else . += "You see [occupant.name] inside." - if(Adjacent(user)) - . += "You can Alt-Click to eject the current occupant. Click-drag someone to the sleeper to place them in it after a short delay." + . += "You can Alt-Click to eject the current occupant. Click-drag someone to the sleeper to place them in it after a short delay." /obj/machinery/sleeper/power_change() ..() //we don't check parent return here because we also care about BROKEN @@ -475,21 +474,16 @@ go_out() add_fingerprint(usr) -/obj/machinery/sleeper/verb/remove_beaker() - set name = "Remove Beaker" - set category = "Object" - set src in oview(1) - - if(usr.incapacitated() || !Adjacent(usr)) +/obj/machinery/sleeper/proc/remove_beaker(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(beaker) filtering = FALSE - usr.put_in_hands(beaker) + user.put_in_hands(beaker) beaker = null SStgui.update_uis(src) - add_fingerprint(usr) - return + add_fingerprint(user) /obj/machinery/sleeper/MouseDrop_T(atom/movable/O, mob/user) if(!permitted_check(O, user)) @@ -555,41 +549,6 @@ /obj/machinery/sleeper/AllowDrop() return FALSE -/obj/machinery/sleeper/verb/move_inside() - set name = "Enter Sleeper" - set category = "Object" - set src in oview(1) - if(usr.stat != 0 || !(ishuman(usr))) - return - if(occupant) - to_chat(usr, "The sleeper is already occupied!") - return - if(panel_open) - to_chat(usr, "Close the maintenance panel first.") - return - if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other - return - if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") - return - visible_message("[usr] starts climbing into the sleeper.") - if(do_after(usr, 20, target = usr)) - if(occupant) - to_chat(usr, "The sleeper is already occupied!") - return - usr.stop_pulling() - usr.forceMove(src) - occupant = usr - playsound(src, 'sound/machines/podclose.ogg', 5) - update_icon(UPDATE_ICON_STATE) - - for(var/obj/O in src) - qdel(O) - add_fingerprint(usr) - SStgui.update_uis(src) - return - return - /obj/machinery/sleeper/syndie icon_state = "sleeper_s-open" base_icon = "sleeper_s" diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 846d84f4012..af3ac05be9b 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -72,6 +72,10 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) QDEL_NULL(Radio) return ..() +/obj/machinery/computer/card/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to remove the ID cards in it." + /obj/machinery/computer/card/proc/is_centcom() return FALSE @@ -121,30 +125,29 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) "skin" = skin))) return formatted -/obj/machinery/computer/card/verb/eject_id() - set category = null - set name = "Eject ID Card" - set src in oview(1) - - if(usr.incapacitated()) +/obj/machinery/computer/card/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(scan) - to_chat(usr, "You remove \the [scan] from \the [src].") - scan.forceMove(get_turf(src)) - if(!usr.get_active_hand() && Adjacent(usr)) - usr.put_in_hands(scan) + to_chat(user, "You remove \the [scan] from \the [src].") + if(!user.get_active_hand()) + user.put_in_hands(scan) + else if(!user.put_in_inactive_hand(scan)) + scan.forceMove(get_turf(src)) scan = null playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + return else if(modify) - to_chat(usr, "You remove \the [modify] from \the [src].") - modify.forceMove(get_turf(src)) - if(!usr.get_active_hand() && Adjacent(usr)) - usr.put_in_hands(modify) + to_chat(user, "You remove \the [modify] from \the [src].") + if(!user.get_active_hand()) + user.put_in_hands(modify) + else if(!user.put_in_inactive_hand(modify)) + modify.forceMove(get_turf(src)) modify = null playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) else - to_chat(usr, "There is nothing to remove from the console.") + to_chat(user, "There is nothing to remove from the console.") /obj/machinery/computer/card/attackby(obj/item/card/id/id_card, mob/user, params) if(!istype(id_card)) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 31c2a4fa3e4..1d576eb7d27 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -27,22 +27,6 @@ do_sparks(5, TRUE, src) circuit = /obj/item/circuitboard/aiupload_broken -// What the fuck even is this -/obj/machinery/computer/aiupload/verb/AccessInternals() - set category = "Object" - set name = "Access Computer's Internals" - set src in oview(1) - if(get_dist(src, usr) > 1 || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.stat || issilicon(usr)) - return - - opened = !opened - if(opened) - to_chat(usr, "The access panel is now open.") - else - to_chat(usr, "The access panel is now closed.") - return - - /obj/machinery/computer/aiupload/attackby(obj/item/O, mob/user, params) if(!istype(O, /obj/item/aiModule)) return ..() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 650a813078a..8b9419c0da0 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -592,77 +592,6 @@ add_fingerprint(E) playsound(src, 'sound/machines/podclose.ogg', 5) -/obj/machinery/cryopod/verb/eject() - set name = "Eject Pod" - set category = "Object" - set src in oview(1) - - if(usr.stat != 0) - return - - if(usr != occupant) - to_chat(usr, "The cryopod is in use and locked!") - return - icon_state = base_icon_state - - //Eject any items that aren't meant to be in the pod. - var/list/items = contents - if(occupant) items -= occupant - if(announce) items -= announce - - for(var/obj/item/I in items) - I.forceMove(get_turf(src)) - - go_out() - add_fingerprint(usr) - - name = initial(name) - -/obj/machinery/cryopod/verb/move_inside() - set name = "Enter Pod" - set category = "Object" - set src in oview(1) - - if(usr.stat != 0 || !check_occupant_allowed(usr)) - return - - if(occupant) - to_chat(usr, "\The [src] is in use.") - return - - if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") - return - - if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other - return - - visible_message("[usr] starts climbing into [src].") - - if(do_after(usr, 20, target = usr)) - - if(!usr || !usr.client) - return - - if(occupant) - to_chat(usr, "\The [src] is in use.") - return - - usr.stop_pulling() - usr.forceMove(src) - occupant = usr - time_till_despawn = initial(time_till_despawn) / willing_time_divisor - icon_state = occupied_icon_state - to_chat(usr, "[on_enter_occupant_message]") - to_chat(usr, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") - occupant = usr - time_entered = world.time - - add_fingerprint(usr) - name = "[name] ([usr.name])" - - return - /obj/machinery/cryopod/proc/go_out() if(!occupant) return @@ -673,9 +602,6 @@ name = initial(name) playsound(src, 'sound/machines/podopen.ogg', 5) - return - - //Attacks/effects. /obj/machinery/cryopod/blob_act() return //Sorta gamey, but we don't really want these to be destroyed. diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index f96e5c8381d..750026ad908 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -70,14 +70,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) /obj/machinery/doppler_array/AltClick(mob/user) rotate(user) -/obj/machinery/doppler_array/verb/rotate(mob/user) - set name = "Rotate Tachyon-doppler Dish" - set category = "Object" - set src in oview(1) - - if(user.incapacitated()) - return - if(!Adjacent(user)) +/obj/machinery/doppler_array/proc/rotate(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do that!") diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 33f061bc1f6..fe00d9091f1 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -192,12 +192,8 @@ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE build = 1 -/obj/machinery/mass_driver_frame/verb/rotate() - set category = "Object" - set name = "Rotate Frame" - set src in view(1) - - if(usr.stat || usr.restrained() || HAS_TRAIT(usr, TRAIT_FAKEDEATH)) +/obj/machinery/mass_driver_frame/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return dir = turn(dir, -90) diff --git a/code/game/machinery/pipe/pipe_construction.dm b/code/game/machinery/pipe/pipe_construction.dm index 83f502d1e90..e904a75a357 100644 --- a/code/game/machinery/pipe/pipe_construction.dm +++ b/code/game/machinery/pipe/pipe_construction.dm @@ -214,14 +214,7 @@ // rotate the pipe item clockwise -/obj/item/pipe/verb/rotate() - set category = "Object" - set name = "Rotate Pipe" - set src in view(1) - - if(usr.stat || usr.restrained()) - return - +/obj/item/pipe/proc/rotate() if(pipe_type == PIPE_CIRCULATOR) flip() return @@ -230,16 +223,7 @@ fixdir() - return - -/obj/item/pipe/verb/flip() - set category = "Object" - set name = "Flip Pipe" - set src in view(1) - - if(usr.stat || usr.restrained()) - return - +/obj/item/pipe/proc/flip() if(pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_TVALVE, PIPE_DTVALVE, PIPE_CIRCULATOR)) if(flipped) icon_state = copytext(icon_state,3) @@ -252,8 +236,6 @@ fixdir() - return - /obj/item/pipe/Move() . = ..() if(is_bent_pipe() && (dir in GLOB.cardinal)) @@ -611,13 +593,13 @@ ..() /obj/item/pipe/AltClick(mob/user) - if(user.incapacitated() || !user.Adjacent(src)) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return rotate() /obj/item/pipe/AltShiftClick(mob/user) - if(user.incapacitated() || !user.Adjacent(src)) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return flip() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f917f92941b..6d9740b90d1 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -93,9 +93,9 @@ new /obj/effect/gibspawner/generic(get_turf(loc)) //I REPLACE YOUR TECHNOLOGY WITH FLESH! qdel(src) -/obj/machinery/recharge_station/Bumped(mob/AM) - if(ismob(AM)) - move_inside(AM) +/obj/machinery/recharge_station/Bumped(mob/bumper) + if(istype(bumper)) + move_inside(bumper, bumper) /obj/machinery/recharge_station/AllowDrop() return FALSE @@ -105,8 +105,7 @@ return if(user.stat) return - src.go_out() - return + go_out() /obj/machinery/recharge_station/emp_act(severity) if(stat & (BROKEN|NOPOWER)) @@ -170,40 +169,36 @@ occupant = null update_icon(UPDATE_ICON_STATE) change_power_mode(IDLE_POWER_USE) - return + +/obj/machinery/recharge_station/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return + go_out() /obj/machinery/recharge_station/force_eject_occupant(mob/target) go_out() -/obj/machinery/recharge_station/verb/move_eject() - set category = "Object" - set src in oview(1) - if(usr.stat != 0) +/obj/machinery/recharge_station/MouseDrop_T(mob/living/target, mob/user) + if(!istype(target)) return - src.go_out() - add_fingerprint(usr) - return + INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/machinery/recharge_station, move_inside), user, target) + return TRUE -/obj/machinery/recharge_station/verb/move_inside(mob/user = usr) - set category = "Object" - set src in oview(1) - if(!user || !usr) +/obj/machinery/recharge_station/proc/move_inside(mob/user, mob/target) + if(!user || user.stat) return - if(usr.stat != CONSCIOUS) - return - - if(get_dist(src, user) > 2 || get_dist(usr, user) > 1) - to_chat(usr, "They are too far away to put inside") + if(get_dist(src, user) > 2 || get_dist(target, user) > 1) + to_chat(user, "[target] is too far away to put inside [src].") return if(panel_open) - to_chat(usr, "Close the maintenance panel first.") + to_chat(user, "Close the maintenance panel first.") return var/can_accept_user - if(isrobot(user)) - var/mob/living/silicon/robot/R = user + if(isrobot(target)) + var/mob/living/silicon/robot/R = target if(R.stat == DEAD) //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO @@ -217,8 +212,8 @@ return can_accept_user = 1 - else if(ishuman(user)) - var/mob/living/carbon/human/H = user + else if(ishuman(target)) + var/mob/living/carbon/human/H = target if(H.stat == DEAD) return @@ -234,11 +229,10 @@ to_chat(user, "Only non-organics may enter the recharger!") return - user.stop_pulling() - user.forceMove(src) - occupant = user + target.stop_pulling() + target.forceMove(src) + occupant = target add_fingerprint(user) update_icon(UPDATE_ICON_STATE) change_power_mode(IDLE_POWER_USE) - return diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 478821874eb..c189c6cccf5 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -50,6 +50,7 @@ . += "The power light is [(stat & NOPOWER) ? "off" : "on"]." . += "The operation light is [emergency_mode ? "off. [src] has detected a forbidden object with its sensors, and has shut down temporarily." : "on. [src] is active."]" . += "The safety sensor light is [emagged ? "off!" : "on."]" + . += "The recycler current accepts items from [dir2text(eat_dir)]." /obj/machinery/recycler/power_change() if(!..()) @@ -205,38 +206,12 @@ L.adjustBruteLoss(crush_damage) -/obj/machinery/recycler/verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) - - var/mob/living/user = usr - - if(usr.incapacitated()) +/obj/machinery/recycler/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(anchored) - to_chat(usr, "[src] is fastened to the floor!") - return 0 - eat_dir = turn(eat_dir, 270) - to_chat(user, "[src] will now accept items from [dir2text(eat_dir)].") - return 1 -/obj/machinery/recycler/verb/rotateccw() - set name = "Rotate Counter Clockwise" - set category = "Object" - set src in oview(1) - - var/mob/living/user = usr - - if(usr.incapacitated()) - return - if(anchored) - to_chat(usr, "[src] is fastened to the floor!") - return 0 eat_dir = turn(eat_dir, 90) to_chat(user, "[src] will now accept items from [dir2text(eat_dir)].") - return 1 - /obj/machinery/recycler/deathtrap name = "dangerous old crusher" diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index f2e517c076c..19e11fbb30a 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -771,51 +771,6 @@ /obj/machinery/suit_storage_unit/force_eject_occupant(mob/target) eject_occupant() -/obj/machinery/suit_storage_unit/verb/get_out() - set name = "Eject Suit Storage Unit" - set category = "Object" - set src in oview(1) - - if(usr.stat != 0) - return - eject_occupant(usr) - add_fingerprint(usr) - SStgui.update_uis(src) - update_icon(UPDATE_OVERLAYS) - return - -/obj/machinery/suit_storage_unit/verb/move_inside() - set name = "Hide in Suit Storage Unit" - set category = "Object" - set src in oview(1) - - if(usr.stat != 0) - return - if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other - return - if(!state_open) - to_chat(usr, "The unit's doors are shut.") - return - if(broken) - to_chat(usr, "The unit is not operational.") - return - if((occupant) || (helmet) || (suit) || (storage)) - to_chat(usr, "It's too cluttered inside for you to fit in!") - return - visible_message("[usr] starts squeezing into the suit storage unit!") - if(do_after(usr, 10, target = usr)) - usr.stop_pulling() - usr.forceMove(src) - occupant = usr - state_open = FALSE //Close the thing after the guy gets inside - update_icon(UPDATE_OVERLAYS) - - add_fingerprint(usr) - SStgui.update_uis(src) - return - else - occupant = null - /obj/machinery/suit_storage_unit/attack_ai(mob/user as mob) return attack_hand(user) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index ce1ff42be70..9e355cfee20 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -1,5 +1,5 @@ /obj/machinery/washing_machine - name = "Washing Machine" + name = "washing machine" desc = "Gets rid of those pesky bloodstains, or your money back!" icon = 'icons/obj/machines/washing_machine.dmi' icon_state = "wm_10" @@ -21,16 +21,18 @@ var/gibs_ready = 0 var/obj/crayon -/obj/machinery/washing_machine/verb/start() - set name = "Start Washing" - set category = "Object" - set src in oview(1) +/obj/machinery/washing_machine/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to start its washing cycle." - if(!isliving(usr)) //ew ew ew usr, but it's the only way to check. +/obj/machinery/washing_machine/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return + start(user) - if( state != 4 ) - to_chat(usr, "The washing machine cannot run in this state.") +/obj/machinery/washing_machine/proc/start(mob/user) + if(state != 4) + to_chat(user, "The washing machine cannot run in this state.") return if( locate(/mob,contents) ) @@ -193,16 +195,6 @@ state = 4 update_icon(UPDATE_ICON_STATE) -/obj/machinery/washing_machine/verb/climb_out() - set name = "Climb out" - set category = "Object" - set src in usr.loc - - sleep(20) - if(state in list(1,3,6) ) - usr.loc = src.loc - - /obj/machinery/washing_machine/update_icon_state() icon_state = "wm_[state][panel]" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index bad62caa116..805333f1ce1 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -197,20 +197,6 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons if(B && B.loc == loc) qdel(src) -/obj/item/verb/move_to_top() - set name = "Move To Top" - set category = null - set src in oview(1) - - if(!isturf(src.loc) || usr.stat || usr.restrained() ) - return - - var/turf/T = src.loc - - src.loc = null - - src.loc = T - /obj/item/examine(mob/user) var/size switch(src.w_class) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2d0e55a1c73..af29ad36d32 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -128,6 +128,10 @@ materials = list() on = TRUE +/obj/item/flashlight/lamp/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to turn it on/off." + // green-shaded desk lamp /obj/item/flashlight/lamp/green desc = "A classic green-shaded desk lamp." @@ -137,13 +141,11 @@ /obj/item/flashlight/lamp/green/off on = FALSE -/obj/item/flashlight/lamp/verb/toggle_light() - set name = "Toggle light" - set category = "Object" - set src in oview(1) +/obj/item/flashlight/lamp/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return - if(!usr.stat) - attack_self(usr) + attack_self(user) //Bananalamp /obj/item/flashlight/lamp/bananalamp diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 1ec3d7a4773..e4a969b1446 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -3,7 +3,6 @@ desc = "A beacon used by a teleporter." icon_state = "beacon" item_state = "signaler" - var/code = "Beacon" origin_tech = "bluespace=1" var/syndicate = FALSE var/area_bypass = FALSE @@ -11,7 +10,6 @@ /obj/item/radio/beacon/New() ..() - code = "[code] ([GLOB.beacons.len + 1])" GLOB.beacons += src /obj/item/radio/beacon/Destroy() @@ -31,20 +29,6 @@ /obj/item/radio/beacon/send_hear() return null -/obj/item/radio/beacon/verb/alter_signal(t as text) - set name = "Alter Beacon's Signal" - set category = "Object" - set src in usr - - if(usr.stat || usr.restrained()) - return - - code = t - if(isnull(code)) - code = initial(code) - src.add_fingerprint(usr) - return - /obj/item/radio/beacon/bacon //Probably a better way of doing this, I'm lazy. /obj/item/radio/beacon/bacon/proc/digest_delay() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 16dd31e682b..bb294fdf341 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -106,6 +106,10 @@ REAGENT SCANNER var/mode = 1 var/advanced = FALSE +/obj/item/healthanalyzer/examine(mob/user) + . = ..() + . += "Use [src] in hand to swap between showing specific limb damage." + /obj/item/healthanalyzer/attack(mob/living/M, mob/living/user) if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50)) var/list/msgs = list() @@ -284,18 +288,12 @@ REAGENT SCANNER to_chat(user, chat_box_healthscan(msgs.Join("
"))) /obj/item/healthanalyzer/attack_self(mob/user) - toggle_mode() - -/obj/item/healthanalyzer/verb/toggle_mode() - set name = "Switch Verbosity" - set category = "Object" - mode = !mode switch(mode) if(1) - to_chat(usr, "The scanner now shows specific limb damage.") + to_chat(user, "The scanner now shows specific limb damage.") if(0) - to_chat(usr, "The scanner no longer shows limb damage.") + to_chat(user, "The scanner no longer shows limb damage.") /obj/item/healthanalyzer/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/healthupgrade)) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index b66e0040a5c..1b9e637beb1 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -300,6 +300,7 @@ . += "It has [remaining_capacity] seconds remaining." // to avoid having 0 minutes else . += "It has [seconds_to_time(remaining_capacity)] remaining." + . += "You can Alt-Click [src] to wipe the current tape." /obj/item/tape/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) ..() @@ -309,16 +310,16 @@ if(!ruined) ruin(user) -/obj/item/tape/verb/wipe() - set name = "Wipe Tape" - set category = "Object" - - if(usr.stat) +/obj/item/tape/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(ruined) + to_chat(user, "This tape is already ruined!") + return + if(!do_after(user, 3 SECONDS, target = src)) return - to_chat(usr, "You erase the data from [src].") + to_chat(user, "You erase the data from [src].") used_capacity = 0 storedinfo.Cut() timestamp.Cut() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 3f6d592dbc6..eebe95f2bef 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1207,23 +1207,18 @@ . += "Has [fake_bullets] round\s remaining." . += "Use in hand to empty the gun's ammo reserves." . += "[fake_bullets] of those are live rounds." + . += "You can Alt-Click [src] to spin it's barrel." /obj/item/toy/russian_revolver/trick_revolver/post_shot(user) to_chat(user, "[src] did look pretty dodgey!") SEND_SOUND(user, sound('sound/misc/sadtrombone.ogg')) //HONK -/obj/item/toy/russian_revolver/trick_revolver/verb/trick_spin() - set name = "Spin Chamber" - set category = "Object" - set desc = "Click to spin your revolver's chamber." - - var/mob/M = usr - - if(M.stat || !in_range(M, src)) +/obj/item/toy/russian_revolver/trick_revolver/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - to_chat(M, "You go to spin the chamber... and it goes off in your face!") - shoot_gun(M) + to_chat(user, "You go to spin the chamber... and it goes off in your face!") + shoot_gun(user) /obj/item/toy/russian_revolver/trick_revolver/attack_self(mob/user) if(!bullets_left) //You can re-arm the trap... diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index a03903d39d0..5c1f5881cd1 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -6,11 +6,6 @@ * FINGERPRINT CARD */ - - -/* - * DATA CARDS - Used for the teleporter - */ /obj/item/card name = "card" desc = "A card." @@ -23,37 +18,6 @@ /obj/item/card/proc/get_card_account() return GLOB.station_money_database.find_user_account(associated_account_number) -/obj/item/card/data - name = "data card" - desc = "A disk containing data." - icon_state = "data" - var/function = "storage" - var/data = "null" - var/special = null - item_state = "card-id" - -/obj/item/card/data/verb/label(t as text) - set name = "Label Disk" - set category = "Object" - set src in usr - - if(t) - src.name = "Data Disk- '[t]'" - else - src.name = "Data Disk" - src.add_fingerprint(usr) - return - -/obj/item/card/data/clown - name = "coordinates to clown planet" - icon_state = "data" - item_state = "card-id" - layer = 3 - level = 2 - desc = "This card contains coordinates to the fabled Clown Planet. Handle with care." - function = "teleporter" - data = "Clown Land" - /* * ID CARDS */ @@ -154,7 +118,7 @@ else . += "It is too far away." if(guest_pass) - . += "There is a guest pass attached to this ID card" + . += "There is a guest pass attached to this ID card, Alt-Click to remove it." if(world.time < guest_pass.expiration_time) . += "It expires at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)]." else @@ -305,20 +269,16 @@ G.loc = src guest_pass = G -/obj/item/card/id/verb/remove_guest_pass() - set name = "Remove Guest Pass" - set category = "Object" - set src in range(0) - - if(usr.stat || HAS_TRAIT(usr, TRAIT_UI_BLOCKED) || usr.restrained()) +/obj/item/card/id/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(guest_pass) - to_chat(usr, "You remove the guest pass from this ID.") + to_chat(user, "You remove the guest pass from this ID.") guest_pass.forceMove(get_turf(src)) guest_pass = null else - to_chat(usr, "There is no guest pass attached to this ID") + to_chat(user, "There is no guest pass attached to this ID") /obj/item/card/id/serialize() var/list/data = ..() diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index fb7772b6389..daf394f7240 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -93,9 +93,9 @@ /obj/item/defibrillator/ui_action_click() toggle_paddles() -/obj/item/defibrillator/CtrlClick() - if(ishuman(usr) && Adjacent(usr)) - toggle_paddles() +/obj/item/defibrillator/CtrlClick(mob/user) + if(ishuman(user) && Adjacent(user)) + toggle_paddles(user) /obj/item/defibrillator/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell)) @@ -138,21 +138,17 @@ ..() update_icon(UPDATE_OVERLAYS) -/obj/item/defibrillator/verb/toggle_paddles() - set name = "Toggle Paddles" - set category = "Object" - - var/mob/living/carbon/human/user = usr +/obj/item/defibrillator/proc/toggle_paddles(mob/living/carbon/human/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return if(paddles_on_defib) //Detach the paddles into the user's hands - if(usr.incapacitated()) return - - if(!usr.put_in_hands(paddles)) + if(!user.put_in_hands(paddles)) to_chat(user, "You need a free hand to hold the paddles!") update_icon(UPDATE_OVERLAYS) return - paddles.loc = user + paddles.forceMove(user) paddles_on_defib = FALSE else if(user.is_in_active_hand(paddles)) //Remove from their hands and back onto the defib unit diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index e4f51fcda7e..fc6c9ada1ff 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -15,6 +15,10 @@ eject_case() return ..() +/obj/item/implantpad/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to remove it's stored implant." + /obj/item/implantpad/update_icon_state() if(case) icon_state = "implantpad-on" @@ -56,15 +60,11 @@ case = null update_icon(UPDATE_ICON_STATE) -/obj/item/implantpad/verb/remove_implant() - set category = "Object" - set name = "Remove Bio-chip" - set src in usr - - if(usr.stat || usr.restrained()) +/obj/item/implantpad/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - eject_case(usr) + eject_case(user) /obj/item/implantpad/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index a96eda7b808..55fb990a6d2 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -225,21 +225,20 @@ resistance_flags = FIRE_PROOF var/strap_side_straight = FALSE -/obj/item/storage/backpack/satchel/verb/switch_strap() - set name = "Switch Strap Side" - set category = "Object" - set src in usr +/obj/item/storage/backpack/satchel/examine(mob/user) + . = ..() + . += "You can Alt-Shift-Click [src] to flip it's strap side." - if(usr.incapacitated()) +/obj/item/storage/backpack/satchel/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return + strap_side_straight = !strap_side_straight item_state = strap_side_straight ? "satchel-flipped" : "satchel" if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.update_inv_back() - - /obj/item/storage/backpack/satcheldeluxe name = "leather satchel" desc = "An NT Deluxe satchel, with the finest quality leather and the company logo in a thin gold stitch" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 435612397d0..7d7ef8c5ba1 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -17,8 +17,8 @@ // Generic non-item /obj/item/storage/bag - allow_quick_gather = 1 - allow_quick_empty = 1 + allow_quick_gather = TRUE + allow_quick_empty = TRUE display_contents_with_number = 1 // should work fine now use_to_pickup = 1 slot_flags = SLOT_FLAG_BELT @@ -253,7 +253,7 @@ var/capacity = 300; //the number of sheets it can carry. w_class = WEIGHT_CLASS_NORMAL - allow_quick_empty = 1 // this function is superceded + allow_quick_empty = TRUE // this function is superceded /obj/item/storage/bag/sheetsnatcher/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood)) @@ -333,8 +333,7 @@ return -// Modified quick_empty verb drops appropriate sized stacks -/obj/item/storage/bag/sheetsnatcher/quick_empty() +/obj/item/storage/bag/sheetsnatcher/drop_inventory(mob/user) var/location = get_turf(src) for(var/obj/item/stack/sheet/S in contents) while(S.amount) @@ -344,8 +343,8 @@ S.amount -= stacksize if(!S.amount) qdel(S) // todo: there's probably something missing here - if(usr.s_active) - usr.s_active.show_to(usr) + if(user.s_active) + user.s_active.show_to(user) update_icon() // Instead of removing diff --git a/code/game/objects/items/weapons/storage/storage_base.dm b/code/game/objects/items/weapons/storage/storage_base.dm index d227af27b39..4511e5b807e 100644 --- a/code/game/objects/items/weapons/storage/storage_base.dm +++ b/code/game/objects/items/weapons/storage/storage_base.dm @@ -57,16 +57,6 @@ can_hold = typecacheof(can_hold) cant_hold = typecacheof(cant_hold) - typecacheof(cant_hold_override) - if(allow_quick_empty) - verbs += /obj/item/storage/verb/quick_empty - else - verbs -= /obj/item/storage/verb/quick_empty - - if(allow_quick_gather) - verbs += /obj/item/storage/verb/toggle_gathering_mode - else - verbs -= /obj/item/storage/verb/toggle_gathering_mode - populate_contents() boxes = new /obj/screen/storage() @@ -92,6 +82,13 @@ LAZYCLEARLIST(mobs_viewing) return ..() +/obj/item/storage/examine(mob/user) + . = ..() + if(allow_quick_empty) + . += "You can use [src] in hand to empty it's entire contents." + if(allow_quick_gather) + . += "You can Alt-Shift-Click [src] to switch it's gathering method." + /obj/item/storage/forceMove(atom/destination) . = ..() if(!ismob(destination.loc)) @@ -582,9 +579,7 @@ show_to(user) return ..() -/obj/item/storage/verb/toggle_gathering_mode() - set name = "Switch Gathering Method" - set category = "Object" +/obj/item/storage/AltShiftClick(mob/living/carbon/human/user) pickup_all_on_tile = !pickup_all_on_tile switch(pickup_all_on_tile) @@ -593,17 +588,6 @@ if(FALSE) to_chat(usr, "[src] now picks up one item at a time.") -/obj/item/storage/verb/quick_empty() - set name = "Empty Contents" - set category = "Object" - - if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained()) - return - if(!removal_allowed_check(usr)) - return - - drop_inventory(usr) - /obj/item/storage/proc/drop_inventory(user) var/turf/T = get_turf(src) hide_from(user) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 3bf5e0fcef7..a613ef07428 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -26,26 +26,22 @@ QDEL_NULL(noz) return ..() -/obj/item/watertank/ui_action_click() - toggle_mister() +/obj/item/watertank/ui_action_click(mob/user) + toggle_mister(user) /obj/item/watertank/item_action_slot_check(slot, mob/user) if(slot == SLOT_HUD_BACK) - return 1 + return TRUE -/obj/item/watertank/verb/toggle_mister() - set name = "Toggle Mister" - set category = "Object" - if(usr.get_item_by_slot(SLOT_HUD_BACK) != src) - to_chat(usr, "The watertank needs to be on your back to use.") +/obj/item/watertank/proc/toggle_mister(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(usr.incapacitated()) + if(user.get_item_by_slot(SLOT_HUD_BACK) != src) + to_chat(user, "The watertank needs to be on your back to use.") return on = !on - - var/mob/living/carbon/human/user = usr if(on) - if(noz == null) + if(!noz) noz = make_noz() //Detach the nozzle into the user's hands @@ -53,7 +49,7 @@ on = FALSE to_chat(user, "You need a free hand to hold the mister.") return - noz.loc = user + noz.forceMove(user) else //Remove from their hands and put back "into" the tank remove_noz() diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index d3eceff5ae8..0409a6004d3 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -1,94 +1,8 @@ /* Teleportation devices. * Contains: - * Locator * Hand-tele */ -/* - * Locator - */ -/obj/item/locator - name = "locator" - desc = "Used to track those with locater implants." - icon = 'icons/obj/implants.dmi' - icon_state = "locator" - var/temp = null - var/frequency = 1451 - var/broadcasting = FALSE - var/listening = TRUE - flags = CONDUCT - w_class = WEIGHT_CLASS_SMALL - item_state = "electronic" - throw_speed = 4 - throw_range = 20 - materials = list(MAT_METAL=400) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, RAD = 0, FIRE = 100, ACID = 100) - origin_tech = "magnets=3;bluespace=2" - -/obj/item/locator/attack_self(mob/user as mob) - add_fingerprint(usr) - var/dat - if(temp) - dat = "[src.temp]

Clear" - else - dat = {" -Persistent Signal Locator
-Frequency: -- -- [format_frequency(src.frequency)] -+ -+
- -Refresh"} - user << browse(dat, "window=radio") - onclose(user, "radio") - return - -/obj/item/locator/Topic(href, href_list) - if(..()) - return 1 - - var/turf/current_location = get_turf(usr)//What turf is the user on? - if(!current_location || is_admin_level(current_location.z))//If turf was not found or they're in the admin zone - to_chat(usr, "\The [src] is malfunctioning.") - return 1 - - if(href_list["refresh"]) - temp = "Persistent Signal Locator
" - var/turf/sr = get_turf(src) - - if(sr) - temp += "Located Beacons:
" - - for(var/obj/item/radio/beacon/W in GLOB.beacons) - if(W.frequency == frequency && !W.syndicate) - if(W && W.z == z) - var/turf/TB = get_turf(W) - temp += "[W.code]: [TB.x], [TB.y], [TB.z]
" - - temp += "Located Implants:
" - for(var/obj/item/implant/tracking/T in GLOB.tracked_implants) - if(!T.implanted || !T.imp_in) - continue - var/turf/Tr = get_turf(T) - - if(Tr && Tr.z == sr.z) - temp += " [Tr.x], [Tr.y], [Tr.z]
" - - temp += "You are at \[[sr.x],[sr.y],[sr.z]\]." - temp += "

Refresh
" - else - temp += "Processing error: Unable to locate orbital position.
" - else - if(href_list["freq"]) - frequency += text2num(href_list["freq"]) - frequency = sanitize_frequency(frequency) - else - if(href_list["temp"]) - temp = null - - attack_self(usr) - return 1 /* * Hand-tele diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f5b913dc184..02581d96f8d 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -17,8 +17,6 @@ QUEUE_SMOOTH_NEIGHBORS(src) if(smoothing_flags & SMOOTH_CORNERS) icon_state = "" - if(climbable) - verbs += /obj/structure/proc/climb_on if(SSticker) GLOB.cameranet.updateVisibility(src) @@ -52,15 +50,6 @@ ADD_TRAIT(loc, TRAIT_TURF_COVERED, UNIQUE_TRAIT_SOURCE(src)) return TRUE -/obj/structure/proc/climb_on() - - set name = "Climb structure" - set desc = "Climbs onto a structure." - set category = null - set src in oview(1) - - do_climb(usr) - /obj/structure/MouseDrop_T(atom/movable/C, mob/user as mob) if(..()) return TRUE @@ -186,6 +175,8 @@ var/examine_status = examine_status(user) if(examine_status) . += examine_status + if(climbable) + . += "You can Click-Drag someone to [src] to put them on the table after a short delay." /obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls. var/healthpercent = (obj_integrity/max_integrity) * 100 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 0902a0592d4..68175b9739b 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -287,20 +287,6 @@ add_fingerprint(user) toggle(user) -/obj/structure/closet/verb/verb_toggleopen() - set src in oview(1) - set category = null - set name = "Toggle Open" - - if(usr.incapacitated()) - return - - if(ishuman(usr) || isrobot(usr)) - add_fingerprint(usr) - toggle(usr) - return - to_chat(usr, "This mob type can't use this verb.") - /obj/structure/closet/update_icon_state() if(!opened) icon_state = "[icon_closed][transparent ? "_trans" : ""]" diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 36463ea6ac8..1bde25e8c79 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -127,38 +127,6 @@ // no, you can't shove people into a fireaxe cabinet either return FALSE -/obj/structure/closet/fireaxecabinet/verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri - set name = "Open/Close" - set category = "Object" - - if(isrobot(usr) || locked || smashed) - if(locked) - to_chat(usr, "The cabinet won't budge!") - else if(smashed) - to_chat(usr, "The protective glass is broken!") - return - - operate_panel() - -/obj/structure/closet/fireaxecabinet/verb/remove_fire_axe() - set name = "Remove Fire Axe" - set category = "Object" - - if(isrobot(usr)) - return - - if(localopened) - if(fireaxe) - usr.put_in_hands(fireaxe) - to_chat(usr, "You take \the [fireaxe] from [src].") - has_axe = "empty" - fireaxe = null - else - to_chat(usr, "[src] is empty.") - else - to_chat(usr, "[src] is closed.") - update_icon(UPDATE_ICON_STATE) - /obj/structure/closet/fireaxecabinet/attack_ai(mob/user as mob) if(smashed) to_chat(user, "The security of the cabinet is compromised.") diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index c12496aaca4..a1ad8350df0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -82,20 +82,6 @@ else toggle(user) -/obj/structure/closet/secure_closet/verb/verb_togglelock() - set src in oview(1) // One square distance - set category = "Object" - set name = "Toggle Lock" - - if(usr.incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain - return - - if(ishuman(usr)||isrobot(usr)) - add_fingerprint(usr) - togglelock(usr) - return - to_chat(usr, "This mob type can't use this verb.") - /obj/structure/closet/secure_closet/update_overlays() //Putting the welded stuff in update_overlays() so it's easy to overwrite for special cases (Fridges, cabinets, and whatnot) cut_overlays() if(opened) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 517dd7a808c..c07464d48ad 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -71,7 +71,7 @@ M.take_overall_damage((M.health - obj_integrity - 100),0) //any new damage the statue incurred is transfered to the mob ..() - + /obj/structure/closet/statue/shove_impact(mob/living/target, mob/living/attacker) return FALSE @@ -105,9 +105,6 @@ /obj/structure/closet/statue/attack_hand() return -/obj/structure/closet/statue/verb_toggleopen() - return - /obj/structure/closet/statue/update_icon_state() return diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index b6d9fd0399f..407e1a4a54a 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -229,25 +229,13 @@ /obj/structure/closet/crate/secure/AltClick(mob/user) if(Adjacent(user) && !opened) - verb_togglelock() + if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || user.stat) // Don't use it if you're not able to! Checks for stuns, ghost and restrain + return + togglelock() return . = ..() -/obj/structure/closet/crate/secure/verb/verb_togglelock() - set src in oview(1) // One square distance - set category = null - set name = "Toggle Lock" - - if(HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain - return - - if(ishuman(usr) || isrobot(usr)) - add_fingerprint(usr) - togglelock(usr) - return - to_chat(usr, "This mob type can't use this verb.") - /obj/structure/closet/crate/secure/attack_hand(mob/user) if(manifest) to_chat(user, "You tear the manifest off of the crate.") diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index cba1d3c799d..9eacf37ffb5 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -25,6 +25,10 @@ part.part1 = part1 part.part2 = part2 +/obj/structure/chair/e_chair/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to activate it." + /obj/structure/chair/e_chair/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/wrench)) var/obj/structure/chair/C = new /obj/structure/chair(loc) @@ -37,16 +41,13 @@ return return ..() -/obj/structure/chair/e_chair/verb/activate_e_chair() - set name = "Activate Electric Chair" - set category = "Object" - set src in oview(1) - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) +/obj/structure/chair/e_chair/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(last_time + delay_time > world.time) - to_chat(usr, "\The [src] is not ready yet!") + to_chat(user, "[src] is not ready yet!") return - to_chat(usr, "You activate \the [src].") + to_chat(user, "You activate [src].") shock() /obj/structure/chair/e_chair/rotate() diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index cc6e3d2f824..7177cc6937b 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -100,30 +100,14 @@ /obj/structure/reflector/proc/get_reflection(srcdir,pdir) return 0 - -/obj/structure/reflector/verb/rotate() - set name = "Rotate" - set category = "Object" - set src in oview(1) - - if(usr.incapacitated()) - return - if(anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - dir = turn(dir, 270) - return 1 - - /obj/structure/reflector/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(!in_range(src, user)) + + if(anchored) + to_chat(user, "You cannot rotate [src] right now. It is fastened to the floor!") return - else - rotate() + dir = turn(dir, 90) //TYPES OF REFLECTORS, SINGLE, DOUBLE, BOX diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index dc9d0605b68..125a515a2f2 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -21,6 +21,10 @@ /// Used to handle rotation properly, should only be 1, 4, or 8 var/possible_dirs = 4 +/obj/structure/chair/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to rotate it." + /obj/structure/chair/narsie_act() if(prob(20)) var/obj/structure/chair/wood/W = new/obj/structure/chair/wood(get_turf(src)) @@ -123,30 +127,22 @@ ..() handle_rotation(newdir) -/obj/structure/chair/verb/rotate() - set name = "Rotate Chair" - set category = "Object" - set src in oview(1) +/obj/structure/chair/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return + rotate() + +/obj/structure/chair/attack_ghost(mob/user) if(GLOB.configuration.general.ghost_interaction) - setDir(turn(dir, (360 / possible_dirs))) //90 for 4 possible dirs, 45 for 8. - handle_rotation() - return - - if(usr.incapacitated()) + rotate() return + ..() +/obj/structure/chair/proc/rotate() setDir(turn(dir, (360 / possible_dirs))) handle_rotation() -/obj/structure/chair/AltClick(mob/user) - if(!Adjacent(user)) - return - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - rotate() - // Chair types /obj/structure/chair/light name = "chair" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 8018707927d..0b5c57b0134 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -41,6 +41,8 @@ var/slippery = FALSE /// The minimum level of environment_smash required for simple animals to be able to one-shot this. var/minimum_env_smash = ENVIRONMENT_SMASH_WALLS + /// Can this table be flipped? + var/can_be_flipped = TRUE /obj/structure/table/Initialize(mapload) . = ..() @@ -50,6 +52,11 @@ /obj/structure/table/examine(mob/user) . = ..() . += deconstruction_hints(user) + if(can_be_flipped) + if(flipped) + . += "Alt-Shift-Click to right the table again." + else + . += "Alt-Shift-Click to flip over the table." /obj/structure/table/proc/deconstruction_hints(mob/user) return "The top is screwed on, but the main bolts are also visible." @@ -318,39 +325,22 @@ return 0 return T.straight_table_check(direction) -/obj/structure/table/verb/do_flip() - set name = "Flip table" - set desc = "Flips a non-reinforced table" - set category = null - set src in oview(1) - - if(!can_touch(usr) || ismouse(usr)) +/obj/structure/table/AltShiftClick(mob/living/carbon/human/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !can_be_flipped) return - if(!flip(get_cardinal_dir(usr,src))) - to_chat(usr, "It won't budge.") - return + if(!flipped) + if(!flip(get_cardinal_dir(user, src))) + to_chat(user, "It won't budge.") + return - usr.visible_message("[usr] flips \the [src]!") - - if(climbable) - structure_shaken() - - return - -/obj/structure/table/proc/do_put() - set name = "Put table back" - set desc = "Puts flipped table back" - set category = "Object" - set src in oview(1) - - if(!can_touch(usr) || ismouse(usr)) - return - - if(!unflip()) - to_chat(usr, "It won't budge.") - return + user.visible_message("[user] flips \the [src]!") + if(climbable) + structure_shaken() + else + if(!unflip()) + to_chat(user, "It won't budge.") /obj/structure/table/proc/flip(direction) if(flipped) @@ -359,9 +349,6 @@ if( !straight_table_check(turn(direction,90)) || !straight_table_check(turn(direction,-90)) ) return 0 - verbs -=/obj/structure/table/verb/do_flip - verbs +=/obj/structure/table/proc/do_put - dir = direction if(dir != NORTH) layer = 5 @@ -397,9 +384,6 @@ if(!can_flip) return 0 - verbs -=/obj/structure/table/proc/do_put - verbs +=/obj/structure/table/verb/do_flip - layer = initial(layer) flipped = FALSE // Initial smoothing flags doesn't add the required SMOOTH_OBJ flag, thats done on init @@ -800,12 +784,12 @@ icon_state = "tray" buildstack = /obj/item/stack/sheet/mineral/titanium buildstackamount = 2 + can_be_flipped = FALSE var/list/typecache_can_hold = list(/mob, /obj/item) var/list/held_items = list() /obj/structure/table/tray/Initialize() . = ..() - verbs -= /obj/structure/table/verb/do_flip typecache_can_hold = typecacheof(typecache_can_hold) for(var/atom/movable/held in get_turf(src)) if(!held.anchored && held.move_resist != INFINITY && is_type_in_typecache(held, typecache_can_hold)) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index bb76a2c5266..09f57dede18 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -47,7 +47,8 @@ else . += "The maintenance panel is wired, but the circuit slot is empty." - . += "Alt-click to rotate it clockwise." + . += "Alt-Click to rotate it." + . += "Alt-Shift-Click to flip it." /obj/structure/windoor_assembly/Initialize(mapload, set_dir) . = ..() @@ -337,55 +338,38 @@ to_chat(user, "You [polarized_glass ? "enable" : "disable"] the electrochromic panel in the windoor assembly.") -//Rotates the windoor assembly clockwise -/obj/structure/windoor_assembly/verb/revrotate() - set name = "Rotate Windoor Assembly" - set category = "Object" - set src in oview(1) - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) + +/obj/structure/windoor_assembly/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return + if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") - return FALSE - var/target_dir = turn(dir, 270) + to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") + return + var/target_dir = turn(dir, 90) if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") - return FALSE + to_chat(user, "[src] cannot be rotated in that direction!") + return setDir(target_dir) ini_dir = dir update_icon(UPDATE_ICON_STATE) - return TRUE - -/obj/structure/windoor_assembly/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - revrotate() //Flips the windoor assembly, determines whather the door opens to the left or the right -/obj/structure/windoor_assembly/verb/flip() - set name = "Flip Windoor Assembly" - set category = "Object" - set src in oview(1) - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) +/obj/structure/windoor_assembly/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(facing == "l") - to_chat(usr, "The windoor will now slide to the right.") + to_chat(user, "The windoor will now slide to the right.") facing = "r" else facing = "l" - to_chat(usr, "The windoor will now slide to the left.") + to_chat(user, "The windoor will now slide to the left.") update_icon(UPDATE_ICON_STATE) - return #undef EMPTY_ASSEMBLY #undef WIRED_ASSEMBLY diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 38d06228570..f919cf8e33c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -53,7 +53,7 @@ else . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." if(!anchored && !fulltile) - . += "Alt-click to rotate it." + . += "Alt-Click to rotate it." /obj/structure/window/Initialize(mapload, direct) . = ..() @@ -372,61 +372,10 @@ if(fulltile) . += new shardtype(location) -/obj/structure/window/verb/rotate() - set name = "Rotate Window Counter-Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.incapacitated()) - return - - if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") - return FALSE - - var/target_dir = turn(dir, 90) - if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") - return FALSE - - setDir(target_dir) - air_update_turf(1) - ini_dir = dir - add_fingerprint(usr) - return TRUE - -/obj/structure/window/verb/revrotate() - set name = "Rotate Window Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.incapacitated()) - return - - if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") - return FALSE - - var/target_dir = turn(dir, 270) - - if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") - return FALSE - - setDir(target_dir) - ini_dir = dir - add_fingerprint(usr) - return TRUE - /obj/structure/window/AltClick(mob/user) if(fulltile) // Can't rotate these. return ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - - if(!Adjacent(user)) - to_chat(user, "Move closer to the window!") + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(anchored) @@ -444,7 +393,6 @@ setDir(target_dir) ini_dir = dir add_fingerprint(user) - return TRUE /obj/structure/window/Destroy() density = FALSE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index f61e8b1ae55..238e3ec310a 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -28,6 +28,7 @@ /obj/item/assembly/infra/examine(mob/user) . = ..() . += "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]." + . += "Alt-Click to rotate it." /obj/item/assembly/infra/activate() if(!..()) @@ -159,25 +160,24 @@ if(first) first.vis_spread(visible) if(href_list["rotate"]) - rotate() + rotate(usr) if(href_list["close"]) usr << browse(null, "window=infra") return if(usr) attack_self(usr) -/obj/item/assembly/infra/verb/rotate()//This could likely be better - set name = "Rotate Infrared Laser" - set category = "Object" - set src in usr +/obj/item/assembly/infra/AltClick(mob/user) + rotate(user) - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) +/obj/item/assembly/infra/proc/rotate(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return dir = turn(dir, 90) - if(usr.machine == src) - interact(usr) + if(user.machine == src) + interact(user) if(first) qdel(first) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 398eebd714d..3b44e199396 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -12,6 +12,7 @@ . = ..() if(armed) . += "It looks like it's armed." + . += "Alt-Click to hide it." /obj/item/assembly/mousetrap/activate() if(!..()) @@ -143,13 +144,9 @@ armed = TRUE -/obj/item/assembly/mousetrap/verb/hide_under() - set src in oview(1) - set name = "Hide" - set category = "Object" - - if(usr.stat) +/obj/item/assembly/mousetrap/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return layer = TURF_LAYER + 0.2 - to_chat(usr, "You hide [src].") + to_chat(user, "You hide [src].") diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index c7a89b7df42..495ed5d8eac 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -26,6 +26,8 @@ var/last_injection var/injection_cooldown = 34 SECONDS var/efficiency + /// Timer that we use to remove people that are in us for too long + var/removal_timer light_color = LIGHT_COLOR_WHITE @@ -38,9 +40,7 @@ . += "You see [occupant.name] inside." . += "The Cryogenic cell chamber is effective at treating those with genetic damage, but all other damage types at a moderate rate." . += "Mostly using cryogenic chemicals, such as cryoxadone for it's medical purposes, requires that the inside of the cell be kept cool at all times. Hooking up a freezer and cooling the pipeline will do this nicely." - . += "Click-drag someone to a cell to place them in it, use the 'Eject occupant' verb to remove them." - if(user.loc == src) - . += "You can use the 'Eject occupant' verb to eject yourself. This will take roughly 2 minutes." + . += "Click-drag someone to a cell to place them in it, Alt-Click it to remove it." /obj/machinery/atmospherics/unary/cryo_cell/power_change() ..() @@ -414,6 +414,7 @@ occupant = null update_icon(UPDATE_OVERLAYS) + deltimer(removal_timer) /obj/machinery/atmospherics/unary/cryo_cell/force_eject_occupant(mob/target) go_out() @@ -451,30 +452,15 @@ add_fingerprint(usr) update_icon(UPDATE_OVERLAYS) M.ExtinguishMob() + removal_timer = addtimer(CALLBACK(src, PROC_REF(auto_eject)), 1 MINUTES, TIMER_STOPPABLE) return TRUE -/obj/machinery/atmospherics/unary/cryo_cell/verb/move_eject() - set name = "Eject occupant" - set category = "Object" - set src in oview(1) +/obj/machinery/atmospherics/unary/cryo_cell/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return - if(usr == occupant)//If the user is inside the tube... - if(usr.stat == DEAD) - return - to_chat(usr, "Release sequence activated. This will take one minute.") - sleep(600) - if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already - return - go_out()//and release him from the eternal prison. - else - if(usr.default_can_use_topic(src) != STATUS_INTERACTIVE) - return - if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other - return - add_attack_logs(usr, occupant, "Ejected from cryo cell at [COORD(src)]") - go_out() - add_fingerprint(usr) - return + go_out() + add_fingerprint(user) /obj/machinery/atmospherics/unary/cryo_cell/narsie_act() go_out() @@ -482,26 +468,6 @@ color = "red"//force the icon to red light_color = LIGHT_COLOR_RED -/obj/machinery/atmospherics/unary/cryo_cell/verb/move_inside() - set name = "Move Inside" - set category = "Object" - set src in oview(1) - - if(usr.has_buckled_mobs()) //mob attached to us - to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") - return - - if(stat & (NOPOWER | BROKEN)) - return - - if(usr.incapacitated() || usr.buckled) //are you cuffed, dying, lying, stunned or other - return - - put_mob(usr) - return - - - /datum/data/function/proc/reset() return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 385af84f4ca..f4383659f97 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -228,22 +228,18 @@ * BLIND // can't see anything */ -/obj/item/clothing/glasses/verb/adjust_eyewear() //Adjust eyewear to be worn above or below the mask. - set name = "Adjust Eyewear" - set category = "Object" - set desc = "Adjust your eyewear to be worn over or under a mask." - set src in usr +/obj/item/clothing/glasses/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to adjust if it fits over or under your mask." - var/mob/living/carbon/human/user = usr - if(!istype(user)) - return - if(user.incapacitated()) //Dead spessmen adjust no glasses. Resting/buckled ones do, though +/obj/item/clothing/glasses/AltClick(mob/living/carbon/human/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !istype(user)) return var/action_fluff = "You adjust \the [src]" if(user.glasses == src) if(!user.canUnEquip(src)) - to_chat(usr, "[src] is stuck to you!") + to_chat(user, "[src] is stuck to you!") return if(attack_hand(user)) //Remove the glasses for this action. Prevents logic-defying instances where glasses phase through your mask as it ascends/descends to another plane of existence. action_fluff = "You remove \the [src] and adjust it" @@ -304,7 +300,7 @@ sensor_mode = SUIT_SENSOR_OFF return TRUE -/obj/item/clothing/under/proc/set_sensors(mob/user as mob) +/obj/item/clothing/under/proc/set_sensors(mob/user) if(!user.Adjacent(src) || !ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return if(has_sensor >= 2) @@ -326,7 +322,7 @@ sensor_mode = modes.Find(switchMode) - 1 - if(src.loc == user) + if(loc == user) switch(sensor_mode) if(SUIT_SENSOR_OFF) to_chat(user, "You disable your suit's remote sensing equipment.") @@ -341,32 +337,25 @@ if(H.w_uniform == src) H.update_suit_sensors() - else if(ismob(src.loc)) + else if(ismob(loc)) switch(sensor_mode) if(SUIT_SENSOR_OFF) for(var/mob/V in viewers(user, 1)) - V.show_message("[user] disables [src.loc]'s remote sensing equipment.", 1) + V.show_message("[user] disables [loc]'s remote sensing equipment.", 1) if(SUIT_SENSOR_BINARY) for(var/mob/V in viewers(user, 1)) - V.show_message("[user] turns [src.loc]'s remote sensors to binary.", 1) + V.show_message("[user] turns [loc]'s remote sensors to binary.", 1) if(SUIT_SENSOR_VITAL) for(var/mob/V in viewers(user, 1)) - V.show_message("[user] sets [src.loc]'s sensors to track vitals.", 1) + V.show_message("[user] sets [loc]'s sensors to track vitals.", 1) if(SUIT_SENSOR_TRACKING) for(var/mob/V in viewers(user, 1)) - V.show_message("[user] sets [src.loc]'s sensors to maximum.", 1) + V.show_message("[user] sets [loc]'s sensors to maximum.", 1) if(ishuman(src)) var/mob/living/carbon/human/H = src if(H.w_uniform == src) H.update_suit_sensors() -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - - set_sensors(usr) - /obj/item/clothing/under/AltShiftClick(mob/user) set_sensors(user) @@ -825,46 +814,40 @@ if(SUIT_SENSOR_TRACKING) . += "Its vital tracker and tracking beacon appear to be enabled." if(has_sensor == 1) - . += "Alt-shift-click to toggle the sensors mode." + . += "Alt-shift-click to toggle the sensors mode." else . += "This suit does not have any sensors." if(length(accessories)) for(var/obj/item/clothing/accessory/A in accessories) . += "\A [A] is attached to it." - . += "Alt-click to remove an accessory." + . += "Alt-click to remove an accessory." + . += "Ctrl-Shift-Click to roll down this jumpsuit." -/obj/item/clothing/under/verb/rollsuit() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - if(!isliving(usr)) return - if(usr.stat) return +/obj/item/clothing/under/CtrlShiftClick(mob/living/carbon/human/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !istype(user)) + to_chat(user, "You cannot roll down the uniform!") + return - var/mob/living/carbon/human/H = usr + if(copytext(item_color,-2) != "_d") + basecolor = item_color - if(!usr.incapacitated()) - if(copytext(item_color,-2) != "_d") - basecolor = item_color - - if(usr.get_item_by_slot(SLOT_HUD_JUMPSUIT) != src) - to_chat(usr, "You must wear the uniform to adjust it!") - - else - if((basecolor + "_d_s") in icon_states(H.w_uniform.sprite_sheets[H.dna.species.sprite_sheet_name])) - if(H.w_uniform.sprite_sheets[H.dna.species.sprite_sheet_name] && icon_exists(H.w_uniform.sprite_sheets[H.dna.species.sprite_sheet_name], "[basecolor]_d_s")) - item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" - usr.update_inv_w_uniform() - else - if(H.w_uniform.sprite_sheets["Human"] && icon_exists(H.w_uniform.sprite_sheets["Human"], "[basecolor]_d_s")) - item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" - usr.update_inv_w_uniform() - else - to_chat(usr, "You cannot roll down this uniform!") + if(user.get_item_by_slot(SLOT_HUD_JUMPSUIT) != src) + to_chat(user, "You must wear the uniform to adjust it!") else - to_chat(usr, "You cannot roll down the uniform!") + if((basecolor + "_d_s") in icon_states(user.w_uniform.sprite_sheets[user.dna.species.sprite_sheet_name])) + if(user.w_uniform.sprite_sheets[user.dna.species.sprite_sheet_name] && icon_exists(user.w_uniform.sprite_sheets[user.dna.species.sprite_sheet_name], "[basecolor]_d_s")) + item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" + user.update_inv_w_uniform() + + else + if(user.w_uniform.sprite_sheets["Human"] && icon_exists(user.w_uniform.sprite_sheets["Human"], "[basecolor]_d_s")) + item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" + user.update_inv_w_uniform() + else + to_chat(user, "You cannot roll down this uniform!") if(item_color == "[basecolor]") body_parts_covered = initial(body_parts_covered) else @@ -872,18 +855,8 @@ body_parts_covered &= ~LOWER_TORSO body_parts_covered &= ~ARMS -/obj/item/clothing/under/verb/removetie() - set name = "Remove Accessory" - set category = "Object" - set src in usr - handle_accessories_removal() - -/obj/item/clothing/under/proc/handle_accessories_removal() - if(!isliving(usr)) - return - if(usr.incapacitated()) - return - if(!Adjacent(usr)) +/obj/item/clothing/under/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(!length(accessories)) return @@ -895,7 +868,7 @@ A = pick else A = accessories[1] - remove_accessory(usr,A) + remove_accessory(user, A) /obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) if(!(A in accessories)) @@ -915,9 +888,6 @@ A.emp_act(severity) ..() -/obj/item/clothing/under/AltClick() - handle_accessories_removal() - /obj/item/clothing/obj_destruction(damage_flag) if(damage_flag == BOMB || damage_flag == MELEE) var/turf/T = get_turf(src) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 000525370ca..ac798acda90 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -95,41 +95,19 @@ else . += "It is empty." -/obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user as mob) - ..() - has_suit.verbs += /obj/item/clothing/accessory/holster/verb/holster_verb - -/obj/item/clothing/accessory/holster/on_removed(mob/user as mob) - has_suit.verbs -= /obj/item/clothing/accessory/holster/verb/holster_verb - ..() - //For the holster hotkey -/obj/item/clothing/accessory/holster/verb/holster_verb() - set name = "Holster" - set category = "Object" - set src in usr - if(!isliving(usr)) return - if(usr.stat) return +/obj/item/clothing/accessory/holster/proc/handle_holster_usage(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return - var/obj/item/clothing/accessory/holster/H = null - if(istype(src, /obj/item/clothing/accessory/holster)) - H = src - else if(istype(src, /obj/item/clothing/under)) - var/obj/item/clothing/under/S = src - if(S.accessories.len) - H = locate() in S.accessories - - if(!H) - to_chat(usr, "Something is very wrong.") - - if(!H.holstered) - if(!istype(usr.get_active_hand(), /obj/item/gun)) - to_chat(usr, "You need your gun equiped to holster it.") + if(!holstered) + var/obj/item/gun/gun = user.get_active_hand() + if(!istype(gun)) + to_chat(user, "You need your gun equiped to holster it.") return - var/obj/item/gun/W = usr.get_active_hand() - H.holster(W, usr) + holster(gun, user) else - H.unholster(usr) + unholster(user) /obj/item/clothing/accessory/holster/armpit name = "shoulder holster" diff --git a/code/modules/events/blob/blob_mobs.dm b/code/modules/events/blob/blob_mobs.dm index 1672a3aeeb5..0b9fca72d0f 100644 --- a/code/modules/events/blob/blob_mobs.dm +++ b/code/modules/events/blob/blob_mobs.dm @@ -190,6 +190,22 @@ move_resist = MOVE_FORCE_OVERPOWERING a_intent = INTENT_HARM +/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload) + . = ..() + var/datum/action/innate/communicate_overmind_blob/overmind_chat = new + overmind_chat.Grant(src) + +/datum/action/innate/communicate_overmind_blob + name = "Speak with the overmind" + icon_icon = 'icons/mob/guardian.dmi' + button_icon_state = "communicate" + +/datum/action/innate/communicate_overmind_blob/Activate() + var/mob/living/simple_animal/hostile/blob/blobbernaut/user = owner + if(user.stat) + return + user.blob_talk() + /mob/living/simple_animal/hostile/blob/blobbernaut/Life(seconds, times_fired) if(stat != DEAD && (getBruteLoss() || getFireLoss())) // Heal on blob structures if(locate(/obj/structure/blob) in get_turf(src)) @@ -214,14 +230,6 @@ return FALSE flick("blobbernaut_death", src) -/mob/living/simple_animal/hostile/blob/blobbernaut/verb/communicate_overmind() - set category = "Blobbernaut" - set name = "Blob Telepathy" - set desc = "Send a message to the Overmind" - - if(stat != DEAD) - blob_talk() - /mob/living/simple_animal/hostile/blob/blobbernaut/proc/blob_talk() var/message = input(src, "Announce to the overmind", "Blob Telepathy") var/rendered diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index b1ab9d3fc64..d2cde90e022 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -84,25 +84,17 @@ // VERBS & PROCS // ////////////////////////////// -/obj/machinery/fishtank/verb/toggle_lid_verb() - set name = "Toggle Tank Lid" - set category = "Object" - set src in view(1) +/obj/machinery/fishtank/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return - toggle_lid() - -/obj/machinery/fishtank/proc/toggle_lid() lid_switch = !lid_switch update_icon(UPDATE_OVERLAYS) -/obj/machinery/fishtank/verb/toggle_light_verb() - set name = "Toggle Tank Light" - set category = "Object" - set src in view(1) +/obj/machinery/fishtank/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return - toggle_light() - -/obj/machinery/fishtank/proc/toggle_light() light_switch = !light_switch if(light_switch) set_light(2, 2, "#a0a080") @@ -113,12 +105,6 @@ // NEW() PROCS // ////////////////////////////// -/obj/machinery/fishtank/Initialize(mapload) - . = ..() - if(!has_lid) //Tank doesn't have a lid/light, remove the verbs for then - verbs -= /obj/machinery/fishtank/verb/toggle_lid_verb - verbs -= /obj/machinery/fishtank/verb/toggle_light_verb - /obj/machinery/fishtank/tank/Initialize(mapload) . = ..() if(prob(5)) //5% chance to get the castle decoration @@ -533,6 +519,8 @@ //Finally, report the full examine_message constructed from the above reports . += "[examine_message]" + . += "You can Alt-Click [src] to open/close its lid." + . += "You can Alt-Shift-Click [src] to enable/disable its light." ////////////////////////////// // ATTACK PROCS // diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index dffc5dc48e3..5ba474cf76e 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -15,10 +15,6 @@ drop_sound = 'sound/items/handling/drinkglass_drop.ogg' pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' -/obj/item/reagent_containers/food/drinks/set_APTFT() - set hidden = FALSE - ..() - /obj/item/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs var/obj/item/reagent_containers/food/snacks/egg/E = I diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 9c5c8b0ae14..69128c5d568 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -41,10 +41,6 @@ /obj/item/reagent_containers/food/condiment/attack_self(mob/user) return -/obj/item/reagent_containers/food/condiment/set_APTFT() - set hidden = FALSE - ..() - /obj/item/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) diff --git a/code/modules/food_and_drinks/food_base.dm b/code/modules/food_and_drinks/food_base.dm index c6b4ad5fbca..b2dafb1a3d8 100644 --- a/code/modules/food_and_drinks/food_base.dm +++ b/code/modules/food_and_drinks/food_base.dm @@ -44,10 +44,6 @@ if(world.time > last_ant_time + 5 MINUTES) check_for_ants() -/obj/item/reagent_containers/food/set_APTFT() - set hidden = TRUE - ..() - /obj/item/reagent_containers/food/proc/check_for_ants() last_ant_time = world.time var/turf/T = get_turf(src) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index e1324bf52b5..44c77a26e23 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -38,6 +38,10 @@ occupant = null return ..() +/obj/machinery/gibber/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to empty it." + /obj/machinery/gibber/suicide_act(mob/living/user) if(occupant || locked) return FALSE @@ -160,16 +164,12 @@ INVOKE_ASYNC(src, PROC_REF(feedinTopanim)) -/obj/machinery/gibber/verb/eject() - set category = "Object" - set name = "Empty Gibber" - set src in oview(1) - - if(usr.incapacitated()) +/obj/machinery/gibber/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return go_out() - add_fingerprint(usr) + add_fingerprint(user) /obj/machinery/gibber/proc/go_out() if(operating || !occupant) //no going out if operating, just in case they manage to trigger go_out before being dead @@ -179,15 +179,13 @@ return for(var/obj/O in src) - O.loc = loc + O.forceMove(get_turf(src)) occupant.forceMove(get_turf(src)) occupant = null update_icon(UPDATE_OVERLAYS | UPDATE_ICON_STATE) - return - /obj/machinery/gibber/proc/feedinTopanim() if(!occupant) return diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index e8ee0cd1e05..b6a3a29835e 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -131,13 +131,7 @@ // Datum actions -/obj/item/deck/verb/draw_card(mob/user) - - set category = "Object" - set name = "Draw" - set desc = "Draw a card from a deck." - set src in view(1) - +/obj/item/deck/proc/draw_card(mob/user) var/mob/living/carbon/human/M = user if(user.incapacitated() || !Adjacent(user)) @@ -166,13 +160,7 @@ user.visible_message("[user] draws a card.","You draw a card.") to_chat(user,"It's the [P].") -/obj/item/deck/verb/deal_card() - - set category = "Object" - set name = "Deal" - set desc = "Deal a card from a deck." - set src in view(1) - +/obj/item/deck/proc/deal_card() if(usr.incapacitated() || !Adjacent(usr)) return @@ -191,13 +179,7 @@ deal_at(usr, M, 1) -/obj/item/deck/verb/deal_card_multi() - - set category = "Object" - set name = "Deal Multiple Cards" - set desc = "Deal multiple cards from a deck." - set src in view(1) - +/obj/item/deck/proc/deal_card_multi() if(usr.incapacitated() || !Adjacent(usr)) return @@ -242,14 +224,6 @@ /obj/item/deck/AltClick() deckshuffle() -/obj/item/deck/verb/verb_shuffle() - if(!isobserver(usr)) - set category = "Object" - set name = "Shuffle" - set desc = "Shuffle the cards in the deck." - set src in view(1) - deckshuffle() - /obj/item/deck/proc/deckshuffle() var/mob/living/user = usr if(cooldown < world.time - 1 SECONDS) @@ -440,13 +414,7 @@ // No more datum action here -/obj/item/cardhand/verb/Removecard() - - set category = "Object" - set name = "Remove card" - set desc = "Remove a card from the hand." - set src in view(1) - +/obj/item/cardhand/proc/Removecard() var/mob/living/carbon/user = usr if(user.incapacitated() || !Adjacent(user)) @@ -482,12 +450,7 @@ return update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_OVERLAYS) -/obj/item/cardhand/verb/discard() - - set category = "Object" - set name = "Discard" - set desc = "Place (a) card(s) from your hand in front of you." - +/obj/item/cardhand/proc/discard() var/mob/living/carbon/user = usr var/maxcards = min(length(cards), 5) diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index efa4a62bac3..ce9d923f43c 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -18,9 +18,6 @@ pixel_y = rand(8,-8) update_icon(UPDATE_OVERLAYS) -/obj/item/reagent_containers/food/snacks/honeycomb/set_APTFT() - set hidden = TRUE - /obj/item/reagent_containers/food/snacks/honeycomb/update_overlays() . = ..() var/image/honey diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 15fec7ec179..5365d90f81f 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -98,10 +98,13 @@ item_state = "flare" var/destination -/obj/item/wormhole_jaunter/contractor/verb/set_destination() - set category = "Object" - set name = "Change Portal Destination" - set src in usr +/obj/item/wormhole_jaunter/contractor/examine(mob/user) + . = ..() + . += "You can Alt-Click [src] to change its destination!" + +/obj/item/wormhole_jaunter/contractor/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return var/list/L = list() var/list/areaindex = list() @@ -121,7 +124,6 @@ var/desc = input("Please select a location to target.", "Flare Target Interface") in L destination = L[desc] - return /obj/item/wormhole_jaunter/contractor/attack_self(mob/user) // message is later down activate(user, TRUE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index db5b968856c..55336d6a6fa 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -241,8 +241,7 @@ //for more info on why this is not atom/pull, see examinate() in mob.dm /mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) set name = "Pull" - set category = "Object" - + set category = null if(istype(AM) && Adjacent(AM)) start_pulling(AM, show_message = TRUE) else diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 29236428a58..d65ec5227f9 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -75,12 +75,17 @@ var/current_pda_messaging = null var/custom_sprite = FALSE var/slowdown = 0 + var/speech_state = "Robotic" // Needed for TGUI shit /mob/living/silicon/pai/Initialize(mapload) . = ..() if(istype(loc, /obj/item/paicard)) card = loc + else + card = new(get_turf(src)) + forceMove(card) + card.setPersonality(src) if(card) faction = card.faction.Copy() @@ -98,9 +103,8 @@ add_language("Gutter") add_language("Trinary") - //Verbs for pAI mobile form, chassis and Say flavor text - verbs += /mob/living/silicon/pai/proc/choose_chassis - verbs += /mob/living/silicon/pai/proc/choose_verbs + AddSpell(new /obj/effect/proc_holder/spell/access_software_pai) + AddSpell(new /obj/effect/proc_holder/spell/unfold_chassis_pai) //PDA pda = new(src) @@ -233,27 +237,27 @@ // mobile pai mob. This also includes handling some of the general shit that can occur // to it. Really this deserves its own file, but for the moment it can sit here. ~ Z -/mob/living/silicon/pai/verb/fold_out() - set category = "pAI Commands" - set name = "Unfold Chassis" +/obj/effect/proc_holder/spell/unfold_chassis_pai + name = "Unfold/Fold Chassis" + desc = "Allows you to fold in/out of your mobile form." + clothes_req = FALSE + base_cooldown = 20 SECONDS + action_icon_state = "repairbot" + action_background_icon_state = "bg_tech_blue" - if(stat || IsSleeping() || IsParalyzed() || IsWeakened()) - return +/obj/effect/proc_holder/spell/unfold_chassis_pai/create_new_targeting() + return new /datum/spell_targeting/self - if(loc != card) - to_chat(src, "You are already in your mobile form!") - return +/obj/effect/proc_holder/spell/unfold_chassis_pai/cast(list/targets, mob/living/user = usr) + var/mob/living/silicon/pai/pai_user = user - if(world.time <= last_special) - to_chat(src, "You must wait before folding your chassis out again!") - return + if(pai_user.loc != pai_user.card) + pai_user.close_up() + return TRUE + pai_user.force_fold_out() - last_special = world.time + 200 - - //I'm not sure how much of this is necessary, but I would rather avoid issues. - force_fold_out() - - visible_message("[src] folds outwards, expanding into a mobile form.", "You fold outwards, expanding into a mobile form.") + pai_user.visible_message("[pai_user] folds outwards, expanding into a mobile form.", "You fold outwards, expanding into a mobile form.") + return TRUE /mob/living/silicon/pai/proc/force_fold_out() if(ismob(card.loc)) @@ -268,73 +272,6 @@ card.forceMove(src) card.screen_loc = null -/mob/living/silicon/pai/verb/fold_up() - set category = "pAI Commands" - set name = "Collapse Chassis" - - if(stat || IsSleeping() || IsParalyzed() || IsWeakened()) - return - - if(loc == card) - to_chat(src, "You are already in your card form!") - return - - if(world.time <= last_special) - to_chat(src, "You must wait before returning to your card form!") - return - - close_up() - -/mob/living/silicon/pai/proc/choose_chassis() - set category = "pAI Commands" - set name = "Choose Chassis" - - var/list/my_choices = list() - var/choice - var/finalized = "No" - - //check for custom_sprite - if(!custom_sprite) - if(ckey in GLOB.configuration.custom_sprites.pai_holoform_ckeys) - custom_sprite = TRUE - my_choices["Custom"] = "[ckey]-pai" - - my_choices = possible_chassis.Copy() - if(custom_sprite) - my_choices["Custom"] = "[ckey]-pai" - - if(loc == card) //don't let them continue in card form, since they won't be able to actually see their new mobile form sprite. - to_chat(src, "You must be in your mobile form to reconfigure your chassis.") - return - - while(finalized == "No" && client) - choice = input(usr,"What would you like to use for your mobile chassis icon? This decision can only be made once.") as null|anything in my_choices - if(!choice) return - if(choice == "Custom") - icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi' - else - icon = 'icons/mob/pai.dmi' - icon_state = my_choices[choice] - finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") - - chassis = my_choices[choice] - verbs -= /mob/living/silicon/pai/proc/choose_chassis - -/mob/living/silicon/pai/proc/choose_verbs() - set category = "pAI Commands" - set name = "Choose Speech Verbs" - - var/choice = input(usr,"What theme would you like to use for your speech verbs? This decision can only be made once.") as null|anything in possible_say_verbs - if(!choice) return - - var/list/sayverbs = possible_say_verbs[choice] - speak_statement = sayverbs[1] - speak_exclamation = sayverbs[(sayverbs.len>1 ? 2 : sayverbs.len)] - speak_query = sayverbs[(sayverbs.len>2 ? 3 : sayverbs.len)] - - verbs -= /mob/living/silicon/pai/proc/choose_verbs - - /mob/living/silicon/pai/rest() set name = "Rest" set category = "IC" @@ -390,8 +327,6 @@ //I'm not sure how much of this is necessary, but I would rather avoid issues. /mob/living/silicon/pai/proc/close_up() - - last_special = world.time + 200 stand_up() if(loc == card) return diff --git a/code/modules/mob/living/silicon/pai/pai_login.dm b/code/modules/mob/living/silicon/pai/pai_login.dm new file mode 100644 index 00000000000..a79016531f1 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/pai_login.dm @@ -0,0 +1,5 @@ +/mob/living/silicon/pai/Login() + ..() + if(!custom_sprite) + if(ckey in GLOB.configuration.custom_sprites.pai_holoform_ckeys) + custom_sprite = TRUE diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index a92ff3dde35..c2196d411a7 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -12,11 +12,21 @@ GLOBAL_LIST_INIT(pai_emotions, list( GLOBAL_LIST_EMPTY(pai_software_by_key) -/mob/living/silicon/pai/verb/paiInterface() - set category = "pAI Commands" - set name = "Software Interface" +/obj/effect/proc_holder/spell/access_software_pai + name = "Software interface" + desc = "Allows you to access your downloaded software." + clothes_req = FALSE + base_cooldown = 1 SECONDS + action_icon_state = "choose_module" + action_background_icon_state = "bg_tech_blue" - ui_interact(src) +/obj/effect/proc_holder/spell/access_software_pai/create_new_targeting() + return new /datum/spell_targeting/self + +/obj/effect/proc_holder/spell/access_software_pai/cast(list/targets, mob/living/user = usr) + var/mob/living/silicon/pai/pai_user = user + + pai_user.ui_interact(pai_user) /mob/living/silicon/pai/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.self_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) diff --git a/code/modules/mob/living/silicon/pai/software/pai_apps.dm b/code/modules/mob/living/silicon/pai/software/pai_apps.dm index ef149f75056..eb3af5841ec 100644 --- a/code/modules/mob/living/silicon/pai/software/pai_apps.dm +++ b/code/modules/mob/living/silicon/pai/software/pai_apps.dm @@ -21,6 +21,32 @@ data["emotions"] = emotions data["current_emotion"] = user.card.current_emotion + var/list/speech_types = list() + for(var/name in user.possible_say_verbs) + var/list/speech = list() + speech["name"] = name + speech["id"] = length(speech_types) + speech_types[++speech_types.len] = speech + + data["current_speech_verb"] = user.speech_state + data["speech_verbs"] = speech_types + + var/list/chassis_choices = list() + var/list/chassises_to_add = list() + + chassis_choices = user.possible_chassis.Copy() + if(user.custom_sprite) + chassis_choices["Custom"] = "[user.ckey]-pai" + for(var/name in chassis_choices) + var/list/chassis_to_update_with = list() + chassis_to_update_with["name"] = name + chassis_to_update_with["icon"] = chassis_choices[name] + chassis_to_update_with["id"] = length(chassis_to_update_with) + chassises_to_add[++chassises_to_add.len] = chassis_to_update_with + + data["available_chassises"] = chassises_to_add + data["current_chassis"] = user.chassis + var/list/available_s = list() for(var/s in GLOB.pai_software_by_key) var/datum/pai_software/PS = GLOB.pai_software_by_key[s] @@ -64,6 +90,20 @@ var/toggle_key = params["toggle_key"] if(pai_holder.installed_software[toggle_key]) pai_holder.installed_software[toggle_key].toggle(pai_holder) + if("setSpeechStyle") + pai_holder.speech_state = params["speech_state"] + var/list/sayverbs = pai_holder.possible_say_verbs[pai_holder.speech_state] + pai_holder.speak_statement = sayverbs[1] + pai_holder.speak_exclamation = sayverbs[length(sayverbs) > 1 ? 2 : length(sayverbs)] + pai_holder.speak_query = sayverbs[length(sayverbs) > 2 ? 3 : length(sayverbs)] + if("setChassis") + pai_holder.chassis = params["chassis_to_change"] + pai_holder.icon_state = pai_holder.chassis + if(pai_holder.icon_state == "[pai_holder.ckey]-pai") + pai_holder.icon = 'icons/mob/custom_synthetic/custom-synthetic.dmi' + else + pai_holder.icon = 'icons/mob/pai.dmi' + // Directives // /datum/pai_software/directives diff --git a/code/modules/mob/living/silicon/robot/robot_mob.dm b/code/modules/mob/living/silicon/robot/robot_mob.dm index d33d9678c7a..030afb783e2 100644 --- a/code/modules/mob/living/silicon/robot/robot_mob.dm +++ b/code/modules/mob/living/silicon/robot/robot_mob.dm @@ -1294,8 +1294,6 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( if(W) W.attack_self(src) - return - /mob/living/silicon/robot/proc/SetLockdown(state = 1) // They stay locked down if their wire is cut. if(wires.is_cut(WIRE_BORG_LOCKED)) diff --git a/code/modules/mob/living/simple_animal/slime/slime_powers.dm b/code/modules/mob/living/simple_animal/slime/slime_powers.dm index 669fe30a10e..409365ba51b 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_powers.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_powers.dm @@ -20,10 +20,7 @@ return 0 return 1 -/mob/living/simple_animal/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - +/mob/living/simple_animal/slime/proc/Feed() if(stat) return 0 @@ -123,10 +120,7 @@ layer = initial(layer) buckled.unbuckle_mob(src,force=TRUE) -/mob/living/simple_animal/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - +/mob/living/simple_animal/slime/proc/Evolve() if(stat) to_chat(src, "I must be conscious to do this...") return @@ -156,10 +150,7 @@ var/datum/action/innate/slime/reproduce/A = new A.Grant(S) -/mob/living/simple_animal/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four Slimes." - +/mob/living/simple_animal/slime/proc/Reproduce() if(stat) to_chat(src, "I must be conscious to do this...") return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index db7822b4c5e..5daf30d30d9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -781,6 +781,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ /mob/proc/is_dead() return stat == DEAD +// Nobody in their right mind will have this enabled on the production server, uncomment if you want this for some reason +/* /mob/verb/abandon_mob() set name = "Respawn" set category = "OOC" @@ -816,6 +818,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ M.key = key return +*/ /mob/verb/observe() set name = "Observe" set category = "OOC" diff --git a/code/modules/newscaster/obj/newscaster.dm b/code/modules/newscaster/obj/newscaster.dm index 00602b238aa..680e5742d9d 100644 --- a/code/modules/newscaster/obj/newscaster.dm +++ b/code/modules/newscaster/obj/newscaster.dm @@ -85,6 +85,10 @@ /datum/job/syndicateofficer ) +/obj/machinery/newscaster/examine(mob/user) + . = ..() + . += "Alt-Click to remove the photo currently inside it." + /obj/machinery/newscaster/Destroy() GLOB.allNewscasters -= src viewing_channel = null @@ -723,15 +727,10 @@ /** * Ejects the currently loaded photo if there is one. */ -/obj/machinery/newscaster/verb/eject_photo_verb() - set name = "Eject Photo" - set category = "Object" - set src in oview(1) - - if(usr.incapacitated()) +/obj/machinery/newscaster/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - - eject_photo(usr) + eject_photo(user) #undef CHANNEL_NAME_MAX_LENGTH #undef CHANNEL_DESC_MAX_LENGTH diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8b4252b8f8c..de6a3e6df26 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -27,9 +27,7 @@ return . = ..() -/obj/item/clipboard/verb/removePen(mob/user) - set category = "Object" - set name = "Remove clipboard pen" +/obj/item/clipboard/proc/removePen(mob/user) if(!ishuman(user) || user.incapacitated()) return penPlacement(user, containedpen, FALSE) @@ -42,6 +40,7 @@ /obj/item/clipboard/examine(mob/user) . = ..() + . += "Alt-Click to remove its pen." if(in_range(user, src) && toppaper) . += toppaper.examine(user) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 0eba0caf470..1e20806f2f3 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -48,6 +48,10 @@ GLOBAL_LIST_EMPTY(fax_blacklist) GLOB.allfaxes -= src return ..() +/obj/machinery/photocopier/faxmachine/examine(mob/user) + . = ..() + . += "Alt-Click [src] to remove its currently stored ID." + /obj/machinery/photocopier/faxmachine/proc/update_network() if(department != "Unknown") if(!(("[department]" in GLOB.alldepartments) || ("[department]" in GLOB.hidden_departments) || ("[department]" in GLOB.admin_departments) || ("[department]" in GLOB.hidden_admin_departments))) @@ -267,22 +271,19 @@ GLOBAL_LIST_EMPTY(fax_blacklist) scan = card SStgui.update_uis(src) -/obj/machinery/photocopier/faxmachine/verb/eject_id() - set category = null - set name = "Eject ID Card" - set src in oview(1) - - if(usr.incapacitated()) +/obj/machinery/photocopier/faxmachine/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(scan) - to_chat(usr, "You remove [scan] from [src].") - scan.forceMove(get_turf(src)) - if(!usr.get_active_hand() && Adjacent(usr)) - usr.put_in_hands(scan) + to_chat(user, "You remove [scan] from [src].") + if(!user.get_active_hand()) + user.put_in_hands(scan) + else if(!user.put_in_inactive_hand(scan)) + scan.forceMove(get_turf(src)) scan = null else - to_chat(usr, "There is nothing to remove from [src].") + to_chat(user, "There is nothing to remove from [src].") /obj/machinery/photocopier/faxmachine/proc/sendfax(destination, mob/sender) use_power(active_power_consumption) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 783ce185e1f..2386021222e 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -62,6 +62,7 @@ /obj/item/paper/examine(mob/user) . = ..() + . += "Alt-Click [src] with a pen in hand to rename it." if(user.is_literate()) if(in_range(user, src) || isobserver(user)) show_content(user) @@ -91,16 +92,22 @@ popup.open() return data -/obj/item/paper/verb/rename() - set name = "Rename paper" - set category = "Object" - set src in usr - - if(HAS_TRAIT(usr, TRAIT_CLUMSY) && prob(50)) - to_chat(usr, "You cut yourself on the paper.") +/obj/item/paper/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(!usr.is_literate()) - to_chat(usr, "You don't know how to read.") + + if(is_pen(user.get_active_hand())) + rename(user) + else + return ..() + +/obj/item/paper/proc/rename(mob/user) + + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + to_chat(user, "You cut yourself on the paper.") + return + if(!user.is_literate()) + to_chat(user, "You don't know how to read.") return var/n_name = rename_interactive(usr) if(isnull(n_name)) @@ -109,8 +116,7 @@ desc = "This is a paper titled '" + name + "'." else desc = initial(desc) - add_fingerprint(usr) - return + add_fingerprint(user) /obj/item/paper/attack_self(mob/living/user as mob) user.examinate(src) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index cb66ea36480..6cf5eeda4e9 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -103,6 +103,8 @@ /obj/item/paper_bundle/examine(mob/user) . = ..() + . += "Alt-Click [src] with a pen in hand to rename it." + . += "Alt-Shift-Click [src] to undo the paper bundle." if(in_range(user, src)) show_content(user) else @@ -199,38 +201,31 @@ /obj/item/paper_bundle/AltClick(mob/user) if(in_range(user, src) && !user.incapacitated()) if(is_pen(user.get_active_hand())) - rename() + rename(user) return . = ..() -/obj/item/paper_bundle/verb/rename() - set name = "Rename bundle" - set category = "Object" - set src in usr - - var/n_name = sanitize(copytext(input(usr, "What would you like to label the bundle?", "Bundle Labelling", name) as text, 1, MAX_MESSAGE_LEN)) - if((loc == usr && usr.stat == 0)) +/obj/item/paper_bundle/proc/rename(mob/user) + var/n_name = sanitize(copytext(input(user, "What would you like to label the bundle?", "Bundle Labelling", name) as text, 1, MAX_MESSAGE_LEN)) + if((loc == user && !user.stat)) name = "[(n_name ? "[n_name]" : "paper bundle")]" - add_fingerprint(usr) + add_fingerprint(user) +/obj/item/paper_bundle/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return - -/obj/item/paper_bundle/verb/remove_all() - set name = "Loose bundle" - set category = "Object" - set src in usr - - to_chat(usr, "You loosen the bundle.") + to_chat(user, "You loosen the bundle.") for(var/obj/O in src) - O.loc = usr.loc + O.forceMove(get_turf(user)) O.layer = initial(O.layer) O.plane = initial(O.plane) - O.add_fingerprint(usr) + O.add_fingerprint(user) - usr.unEquip(src) + user.unEquip(src) qdel(src) /obj/item/paper_bundle/update_desc() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 4259b13ea26..40d28417caa 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -76,6 +76,16 @@ show(user) else . += "It is too far away." + . += "Alt-Click [src] with a pen in hand to rename it." + +/obj/item/photo/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return + + if(is_pen(user.get_active_hand())) + rename(user) + else + return ..() /obj/item/photo/proc/show(mob/user as mob) var/icon/img_shown = new/icon(img) @@ -94,20 +104,13 @@ + "[scribble ? "
Written on the back:
[scribble]" : ""]"\ + "", "window=Photo[UID()];size=[64*photo_size]x[scribble ? 400 : 64*photo_size]") onclose(usr, "Photo[UID()]") - return -/obj/item/photo/verb/rename() - set name = "Rename photo" - set category = "Object" - set src in usr - - var/n_name = sanitize(copytext(input(usr, "What would you like to label the photo?", "Photo Labelling", name) as text, 1, MAX_MESSAGE_LEN)) +/obj/item/photo/proc/rename(mob/user) + var/n_name = sanitize(copytext(input(user, "What would you like to label the photo?", "Photo Labelling", name) as text, 1, MAX_MESSAGE_LEN)) //loc.loc check is for making possible renaming photos in clipboards - if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0)) + if(( (loc == user || (loc.loc && loc.loc == user)) && !user.stat)) name = "[(n_name ? "[n_name]" : "photo")]" - add_fingerprint(usr) - return - + add_fingerprint(user) /************** * photo album * @@ -186,6 +189,7 @@ . = ..() if(!digital) . += "There is [pictures_left] photos left." + . += "Alt-Click [src] to change the photo size." /obj/item/camera/spooky/CheckParts(list/parts_list) ..() @@ -205,18 +209,16 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor see_ghosts = TRUE /obj/item/camera/AltClick(mob/user) - if(in_range(user, src) && !user.incapacitated()) - change_size() + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - . = ..() -/obj/item/camera/verb/change_size() - set name = "Set Photo Focus" - set category = "Object" + change_size(user) + +/obj/item/camera/proc/change_size(mob/user) var/nsize = input("Photo Size","Pick a size of resulting photo.") as null|anything in list(1,3,5,7) if(nsize) size = nsize - to_chat(usr, "Camera will now take [size]x[size] photos.") + to_chat(user, "Camera will now take [size]x[size] photos.") /obj/item/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) return @@ -518,36 +520,38 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor var/datum/picture/P = createpicture(target, user, turfs, mobs, flag) saved_pictures += P -/obj/item/camera/digital/verb/print_picture() - set name = "Print picture" - set category = "Object" - set src in usr +/obj/item/camera/digital/examine(mob/user) + . = ..() + . += "Alt-Shift-Click [src] to print a specific photo." + . += "Ctrl-Shift-Click [src] to delete a specific photo." - if(saved_pictures.len == 0) - to_chat(usr, "No images saved.") +/obj/item/camera/digital/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(pictures_left == 0) - to_chat(usr, "There is no film left to print.") + if(!length(saved_pictures)) + to_chat(user, "No images saved.") + return + if(!pictures_left) + to_chat(user, "There is no film left to print.") return - var/datum/picture/P = null - P = input("Select image to print:",P) as null|anything in saved_pictures - if(P) - printpicture(usr,P) + var/datum/picture/picture + picture = input("Select image to print:", picture) as null|anything in saved_pictures + if(picture) + printpicture(user, picture) pictures_left -- -/obj/item/camera/digital/verb/delete_picture() - set name = "Delete picture" - set category = "Object" - set src in usr - - if(saved_pictures.len == 0) - to_chat(usr, "No images saved") +/obj/item/camera/digital/CtrlShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - var/datum/picture/P = null - P = input("Select image to delete:",P) as null|anything in saved_pictures - if(P) - saved_pictures -= P + + if(!length(saved_pictures)) + to_chat(user, "No images saved") + return + var/datum/picture/picture + picture = input("Select image to delete:", picture) as null|anything in saved_pictures + if(picture) + saved_pictures -= picture /************** *video camera * diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 0648245e9c9..f65e149bfea 100644 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -94,6 +94,12 @@ GLOBAL_LIST_EMPTY(PDAs) start_program(find_program(/datum/data/pda/app/main_menu)) silent = initial(silent) +/obj/item/pda/examine(mob/user) + . = ..() + . += "Alt-Click [src] to remove its ID card." + . += "Ctrl-Click [src] to remove its pen." + . += "Use a screwdriver on [src] to reset it." + /obj/item/pda/proc/can_use() if(!ismob(loc)) return 0 @@ -159,22 +165,15 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/proc/close(mob/user) SStgui.close_uis(src) -/obj/item/pda/verb/verb_reset_pda() - set category = "Object" - set name = "Reset PDA" - set src in usr - - if(issilicon(usr)) +/obj/item/pda/screwdriver_act(mob/living/user, obj/item/I) + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - if(can_use(usr)) - start_program(find_program(/datum/data/pda/app/main_menu)) - notifying_programs.Cut() - update_icon(UPDATE_OVERLAYS) - to_chat(usr, "You press the reset button on \the [src].") - SStgui.update_uis(src) - else - to_chat(usr, "You cannot do this while restrained.") + start_program(find_program(/datum/data/pda/app/main_menu)) + notifying_programs.Cut() + update_icon(UPDATE_OVERLAYS) + to_chat(user, "You press the reset button on \the [src].") + SStgui.update_uis(src) /obj/item/pda/AltClick(mob/user) if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) @@ -217,30 +216,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(wearing_human.wear_id == src) wearing_human.sec_hud_set_ID() -/obj/item/pda/verb/verb_remove_id() - set category = "Object" - set name = "Remove id" - set src in usr - - if(issilicon(usr)) - return - - if( can_use(usr) ) - if(id) - remove_id(usr) - else - to_chat(usr, "This PDA does not have an ID in it.") - else - to_chat(usr, "You cannot do this while restrained.") - -/obj/item/pda/verb/verb_remove_pen() - set category = "Object" - set name = "Remove pen" - set src in usr - remove_pen(usr) - /obj/item/pda/proc/remove_pen(mob/user) - if(issilicon(user)) return diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm index 5d9506e1731..6d15fdc5dce 100644 --- a/code/modules/point/point.dm +++ b/code/modules/point/point.dm @@ -129,8 +129,7 @@ */ /mob/verb/pointed(atom/A as mob|obj|turf in view()) set name = "Point To" - set category = "Object" - + set category = null if(next_move >= world.time) return diff --git a/code/modules/power/engines/singularity/emitter.dm b/code/modules/power/engines/singularity/emitter.dm index f3a35d0d969..f5c28eba29c 100644 --- a/code/modules/power/engines/singularity/emitter.dm +++ b/code/modules/power/engines/singularity/emitter.dm @@ -55,6 +55,7 @@ . = ..() if(panel_open) . += "The maintenance panel is open." + . += "Alt-Click to rotate [src]." /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 @@ -72,24 +73,15 @@ power_usage -= 50 * M.rating active_power_consumption = power_usage -/obj/machinery/power/emitter/verb/rotate() - set name = "Rotate" - set category = "Object" - set src in oview(1) +/obj/machinery/power/emitter/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return if(anchored) - to_chat(usr, "It is fastened to the floor!") + to_chat(user, "It is fastened to the floor!") return dir = turn(dir, 90) -/obj/machinery/power/emitter/AltClick(mob/user) - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!Adjacent(user)) - return - rotate() - /obj/machinery/power/emitter/Destroy() msg_admin_attack("Emitter deleted at ([x],[y],[z] - [ADMIN_JMP(src)]) [usr ? "Broken by [key_name_admin(usr)]" : ""]", ATKLOG_FEW) log_game("Emitter deleted at ([x],[y],[z])") diff --git a/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm index 48baf9c5809..e3881cbd96c 100644 --- a/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm @@ -87,39 +87,13 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "end_cap" reference = "end_cap" -/obj/structure/particle_accelerator/verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) - return - if(anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - dir = turn(dir, 270) - return 1 - /obj/structure/particle_accelerator/AltClick(mob/user) - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!Adjacent(user)) - return - rotate() - -/obj/structure/particle_accelerator/verb/rotateccw() - set name = "Rotate Counter Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - dir = turn(dir, 90) - return 1 + to_chat(user, "It is fastened to the floor!") + return + dir = turn(dir, 270) /obj/structure/particle_accelerator/examine(mob/user) . = ..() @@ -135,7 +109,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(powered) desc = desc_holder if(!anchored) - . += "Alt-click to rotate it." + . += "Alt-Click to rotate it." /obj/structure/particle_accelerator/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) @@ -260,32 +234,17 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin var/strength = 0 var/desc_holder = null +/obj/structure/particle_accelerator/examine(mob/user) + . = ..() + . += "Alt-Click to rotate it." -/obj/machinery/particle_accelerator/verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) +/obj/machinery/particle_accelerator/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 + to_chat(user, "It is fastened to the floor!") + return dir = turn(dir, 270) - return 1 - -/obj/machinery/particle_accelerator/verb/rotateccw() - set name = "Rotate Counter-Clockwise" - set category = "Object" - set src in oview(1) - - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) - return - if(anchored) - to_chat(usr, "It is fastened to the floor!") - return 0 - dir = turn(dir, 90) - return 1 /obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user, params) if(!iscoil(W)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ef27068edea..4e9b851ba38 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -366,10 +366,6 @@ clear_bayonet() /obj/item/gun/proc/toggle_gunlight() - set name = "Toggle Gun Light" - set category = "Object" - set desc = "Click to toggle your weapon's attached flashlight." - if(!gun_light) return gun_light.on = !gun_light.on diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 2f88e75f240..6e152145984 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -9,10 +9,9 @@ can_holster = TRUE execution_speed = 5 SECONDS -/obj/item/gun/projectile/revolver/Initialize(mapload) +/obj/item/gun/projectile/revolver/examine(mob/user) . = ..() - if(!istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder)) - verbs -= /obj/item/gun/projectile/revolver/verb/spin + . += "You can Alt-Click [src] to spin it's barrel." /obj/item/gun/projectile/revolver/chamber_round(spin = 1) if(spin) @@ -58,24 +57,16 @@ else to_chat(user, "[src] is empty!") -/obj/item/gun/projectile/revolver/verb/spin() - set name = "Spin Chamber" - set category = "Object" - set desc = "Click to spin your revolver's chamber." - - var/mob/M = usr - - if(M.stat || !in_range(M,src)) +/obj/item/gun/projectile/revolver/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return if(istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder)) var/obj/item/ammo_box/magazine/internal/cylinder/C = magazine C.spin() chamber_round(0) - playsound(loc, 'sound/weapons/revolver_spin.ogg', 50, 1) - usr.visible_message("[usr] spins [src]'s chamber.", "You spin [src]'s chamber.") - else - verbs -= /obj/item/gun/projectile/revolver/verb/spin + playsound(get_turf(user), 'sound/weapons/revolver_spin.ogg', 50, 1) + user.visible_message("[usr] spins [src]'s chamber.", "You spin [src]'s chamber.") /obj/item/gun/projectile/revolver/can_shoot() return get_ammo(0,0) @@ -153,7 +144,9 @@ /obj/item/gun/projectile/revolver/fingergun/Initialize(mapload, new_parent_spell) . = ..() parent_spell = new_parent_spell - verbs -= /obj/item/gun/projectile/revolver/verb/spin + +/obj/item/gun/projectile/revolver/fingergun/AltClick(mob/user) // can't spin a barrel that doesn't exist! + return /obj/item/gun/projectile/revolver/fingergun/shoot_with_empty_chamber(/*mob/living/user as mob|obj*/) to_chat(usr, "You are out of ammo! You holster your fingers.") diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index b9d55b82ea9..b4a49a9f18b 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -46,6 +46,7 @@ . += "\A [cell] is mounted onto [src]. Battery cell charge: [cell.charge]/[cell.maxcharge]" else . += "It has an empty mount for a battery cell." + . += "Alt-Click [src] to adjust it's tension." /obj/item/gun/throw/crossbow/modify_projectile(obj/item/I, on_chamber = 0) if(cell && on_chamber && istype(I, /obj/item/arrow/rod)) @@ -129,13 +130,8 @@ . = ..() QDEL_NULL(cell) -/obj/item/gun/throw/crossbow/verb/set_tension() - set name = "Adjust Tension" - set category = "Object" - set src in range(0) - - var/mob/user = usr - if(user.incapacitated()) +/obj/item/gun/throw/crossbow/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return var/choice = input("Select tension to draw to:", "[src]", XBOW_TENSION_FULL) as null|anything in possible_tensions if(!choice) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 4cded6b3cfe..4f155bf54bf 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -15,12 +15,8 @@ var/temperature_min = 0 // To limit the temperature of a reagent container can atain when exposed to heat/cold var/temperature_max = 10000 -/obj/item/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this - set name = "Set transfer amount" - set category = "Object" - set src in usr - - if(!usr.Adjacent(src) || !ishuman(usr) || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) +/obj/item/reagent_containers/AltClick(mob/user) + if(!Adjacent(user) || !length(possible_transfer_amounts) || !ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return var/default = null @@ -30,25 +26,20 @@ if(!new_transfer_rate) return - if(!usr.Adjacent(src)) - to_chat(usr, "You have moved too far away!") + if(!Adjacent(user)) + to_chat(user, "You have moved too far away!") return - if(!ishuman(usr) || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) - to_chat(usr, "You can't use your hands!") + if(!ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + to_chat(user, "You can't use your hands!") return amount_per_transfer_from_this = new_transfer_rate - to_chat(usr, "[src] will now transfer [amount_per_transfer_from_this] units at a time.") - -/obj/item/reagent_containers/AltClick() - set_APTFT() + to_chat(user, "[src] will now transfer [amount_per_transfer_from_this] units at a time.") /obj/item/reagent_containers/Initialize(mapload) . = ..() if(!reagents) // Some subtypes create their own reagents create_reagents(volume, temperature_min, temperature_max) - if(!possible_transfer_amounts) - verbs -= /obj/item/reagent_containers/verb/set_APTFT if(spawned_disease) var/datum/disease/F = new spawned_disease(0) var/list/data = list("viruses" = list(F), "blood_color" = "#A10808") @@ -109,4 +100,4 @@ // Items that have no valid possible_transfer_amounts shouldn't say their transfer rate is variable if(possible_transfer_amounts) - . += "Alt-click to change the transfer amount." + . += "Alt-Click to change the transfer amount." diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm index 553d3861287..e156c52b530 100644 --- a/code/modules/reagents/reagent_containers/applicator.dm +++ b/code/modules/reagents/reagent_containers/applicator.dm @@ -17,15 +17,16 @@ var/measured_health = 0 // Used for measuring health; we don't want this to stop applying once the person's health isn't changing. var/static/list/safe_chem_applicator_list = list("silver_sulfadiazine", "styptic_powder", "synthflesh") +/obj/item/reagent_containers/applicator/examine(mob/user) + . = ..() + . += "Alt-Click to empty it." + /obj/item/reagent_containers/applicator/emag_act(mob/user) if(!emagged) emagged = TRUE ignore_flags = TRUE to_chat(user, "You short out the safeties on [src].") -/obj/item/reagent_containers/applicator/set_APTFT() - set hidden = TRUE - /obj/item/reagent_containers/applicator/on_reagent_change() if(!emagged) var/found_forbidden_reagent = FALSE @@ -120,18 +121,14 @@ playsound(get_turf(src), pick('sound/goonstation/items/mender.ogg', 'sound/goonstation/items/mender2.ogg'), 50, 1) -/obj/item/reagent_containers/applicator/verb/empty() - set name = "Empty Applicator" - set category = "Object" - set src in usr - - if(usr.incapacitated()) +/obj/item/reagent_containers/applicator/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(alert(usr, "Are you sure you want to empty [src]?", "Empty Applicator:", "Yes", "No") != "Yes") + if(alert(user, "Are you sure you want to empty [src]?", "Empty Applicator:", "Yes", "No") != "Yes") return - if(!usr.incapacitated() && isturf(usr.loc) && loc == usr) - to_chat(usr, "You empty [src] onto the floor.") - reagents.reaction(usr.loc) + if(!user.incapacitated() && isturf(user.loc) && loc == user) + to_chat(user, "You empty [src] onto the floor.") + reagents.reaction(user.loc) reagents.clear_reagents() /obj/item/reagent_containers/applicator/brute diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 9d184028a4c..2e531fb2c63 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -130,6 +130,11 @@ var/obj/item/assembly_holder/assembly = null var/can_assembly = 1 +/obj/item/reagent_containers/glass/beaker/examine(mob/user) + . = ..() + if(assembly) + . += "There is an [assembly] attached to it, use a screwdriver to remove it." + /obj/item/reagent_containers/glass/beaker/on_reagent_change() update_icon(UPDATE_OVERLAYS) @@ -165,20 +170,6 @@ if(assembly) . += "assembly" -/obj/item/reagent_containers/glass/beaker/verb/remove_assembly() - set name = "Remove Assembly" - set category = "Object" - set src in usr - if(usr.incapacitated()) - return - if(assembly) - to_chat(usr, "You detach [assembly] from [src]") - usr.put_in_hands(assembly) - assembly = null - update_icon(UPDATE_OVERLAYS) - else - to_chat(usr, "There is no assembly to remove.") - /obj/item/reagent_containers/glass/beaker/proc/heat_beaker() if(reagents) reagents.temperature_reagents(4000) @@ -215,6 +206,17 @@ if(assembly) assembly.hear_message(M, msg) +/obj/item/reagent_containers/glass/beaker/screwdriver_act(mob/living/user, obj/item/I) + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(assembly) + to_chat(user, "You detach [assembly] from [src]") + user.put_in_hands(assembly) + assembly = null + update_icon(UPDATE_OVERLAYS) + else + to_chat(user, "There is no assembly to remove.") + /obj/item/reagent_containers/glass/beaker/large name = "large beaker" desc = "A large glass beaker with twice the capacity of a normal beaker." diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 6a24e3375ea..ea31992b7d4 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -95,19 +95,16 @@ . = ..() if(get_dist(user, src) && user == loc) . += "[round(reagents.total_volume)] units left." + . += "Alt-Click to empty it." -/obj/item/reagent_containers/spray/verb/empty() - - set name = "Empty Spray Bottle" - set category = "Object" - set src in usr - if(usr.stat || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.restrained()) +/obj/item/reagent_containers/spray/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - if(alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes") + if(alert(user, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes") return - if(isturf(usr.loc) && loc == usr) - to_chat(usr, "You empty [src] onto the floor.") - reagents.reaction(usr.loc) + if(isturf(user.loc) && loc == user) + to_chat(user, "You empty [src] onto the floor.") + reagents.reaction(user.loc) reagents.clear_reagents() //space cleaner diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index e87dec3eb58..47796f6e1a2 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -23,9 +23,6 @@ mode = SYRINGE_INJECT update_icon() -/obj/item/reagent_containers/syringe/set_APTFT() - set hidden = TRUE - /obj/item/reagent_containers/syringe/on_reagent_change() update_icon() diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 84c9999f74d..7594ae4b283 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -24,6 +24,10 @@ dir = direction update() +/obj/structure/disposalconstruct/examine(mob/user) + . = ..() + . += "Alt-Click to rotate it, Alt-Shift-Click to flip it." + // update iconstate and dpdir due to dir and type /obj/structure/disposalconstruct/proc/update() base_state = get_pipe_icon(ptype) @@ -72,40 +76,27 @@ invisibility = (intact && level == 1) ? INVISIBILITY_MAXIMUM : 0 // hide if floor is intact update() - -// flip and rotate verbs -/obj/structure/disposalconstruct/verb/rotate() - set name = "Rotate Pipe" - set category = "Object" - set src in view(1) - - if(usr.stat) +/obj/structure/disposalconstruct/AltClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return + rotate(user) +/obj/structure/disposalconstruct/proc/rotate(mob/user) if(anchored) - to_chat(usr, "You must unfasten the pipe before rotating it.") + to_chat(user, "You must unfasten the pipe before rotating it.") return dir = turn(dir, -90) update() -/obj/structure/disposalconstruct/AltClick(mob/user) - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!Adjacent(user)) - return - rotate() - -/obj/structure/disposalconstruct/verb/flip() - set name = "Flip Pipe" - set category = "Object" - set src in view(1) - if(usr.stat) +/obj/structure/disposalconstruct/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return + flip(user) +/obj/structure/disposalconstruct/proc/flip(mob/user) if(anchored) - to_chat(usr, "You must unfasten the pipe before flipping it.") + to_chat(user, "You must unfasten the pipe before flipping it.") return dir = turn(dir, 180) @@ -258,9 +249,9 @@ /obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd) . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) - rotate() + rotate(user) else if(our_rpd.mode == RPD_FLIP_MODE) - flip() + flip(user) else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else diff --git a/paradise.dme b/paradise.dme index 519863b6fcd..b931d86bc2c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2132,6 +2132,7 @@ #include "code\modules\mob\living\silicon\pai\pai.dm" #include "code\modules\mob\living\silicon\pai\pai_death.dm" #include "code\modules\mob\living\silicon\pai\pai_life.dm" +#include "code\modules\mob\living\silicon\pai\pai_login.dm" #include "code\modules\mob\living\silicon\pai\pai_say.dm" #include "code\modules\mob\living\silicon\pai\pai_update_status.dm" #include "code\modules\mob\living\silicon\pai\personality.dm" diff --git a/tgui/packages/tgui/interfaces/pai/pai_main_menu.js b/tgui/packages/tgui/interfaces/pai/pai_main_menu.js index 4b6cc19268a..175fd019cb0 100644 --- a/tgui/packages/tgui/interfaces/pai/pai_main_menu.js +++ b/tgui/packages/tgui/interfaces/pai/pai_main_menu.js @@ -10,6 +10,10 @@ export const pai_main_menu = (props, context) => { available_ram, emotions, current_emotion, + speech_verbs, + current_speech_verb, + available_chassises, + current_chassis, } = data.app_data; const installedSoftwareKeys = []; @@ -72,6 +76,26 @@ export const pai_main_menu = (props, context) => { /> ))} + + {speech_verbs.map((s) => ( +