From ff006aa4a5dc031c4c9a72dba8be0e1d721e5a29 Mon Sep 17 00:00:00 2001 From: harry Date: Sat, 4 Jul 2026 07:45:07 +0100 Subject: [PATCH] verb macro system (pr 1/3) (#96720) ## About The Pull Request just macro-izes all the usages of verbs in the codebase as a pre-requisite to my follow up pr that serializes all the verbs arguments so we can tgui-ify the command bar, so we can then put it on the onscreen map. this also basically does the same as #94487 so can easily be integrated into the verb queueing stuff... but does not actually do any verb queueing by itself. basically im just trying to be https://github.com/tgstation/tgstation/labels/Atomic ## Why It's Good For The Game it doesn't really do anything by itself but it does let us do more stuff ## Changelog :cl: code: the backend to all verbs in the game has been played with, please report any issues to github /:cl: --------- Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/__DEFINES/verb.dm | 119 ++++++++++++++++++ code/_onclick/hud/hud.dm | 11 -- code/_onclick/hud/human.dm | 5 +- code/_onclick/hud/screen_objects/credits.dm | 10 +- .../_onclick/hud/screen_objects/map_popups.dm | 3 +- code/controllers/subsystem/verbs.dm | 29 +++++ code/controllers/subsystem/vote.dm | 4 +- code/datums/achievements/_achievement_data.dm | 5 +- code/datums/browser.dm | 4 +- code/datums/helper_datums/getrev.dm | 5 +- code/datums/keybinding/client.dm | 8 +- code/datums/martial/wrestling.dm | 10 -- code/datums/verb_metadata.dm | 12 ++ code/game/machinery/iv_drip.dm | 8 +- code/game/machinery/pipe/construction.dm | 4 +- code/game/objects/items.dm | 8 +- .../objects/items/devices/taperecorder.dm | 15 +-- .../game/objects/items/robot/items/storage.dm | 3 +- code/game/objects/items/tanks/watertank.dm | 3 +- .../structures/crates_lockers/closets.dm | 4 +- .../objects/structures/windoor_assembly.dm | 5 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/holder2.dm | 8 +- code/modules/admin/verbs/admingame.dm | 4 +- code/modules/admin/verbs/adminhelp.dm | 14 +-- code/modules/admin/verbs/ai_triumvirate.dm | 4 +- code/modules/admin/verbs/anonymousnames.dm | 4 +- .../modules/admin/verbs/grant_dna_infusion.dm | 4 +- code/modules/admin/verbs/pray.dm | 4 +- .../admin/verbs/request_internet_sound.dm | 5 +- code/modules/admin/verbs/special_verbs.dm | 15 +-- code/modules/buildmode/buildmode.dm | 4 +- code/modules/client/client_procs.dm | 21 ++-- code/modules/client/preferences_menu.dm | 10 +- code/modules/client/verbs/ooc.dm | 95 +++----------- code/modules/client/verbs/stat_panel.dm | 4 +- code/modules/client/verbs/suicide.dm | 3 +- code/modules/client/verbs/who.dm | 8 +- code/modules/clothing/head/soft_caps.dm | 3 +- code/modules/clothing/masks/hailer.dm | 5 +- code/modules/clothing/shoes/magboots.dm | 4 +- code/modules/clothing/under/_under.dm | 9 +- code/modules/discord/accountlink.dm | 5 +- code/modules/discord/toggle_notify.dm | 5 +- code/modules/escape_menu/escape_menu.dm | 5 +- .../food_and_drinks/machinery/gibber.dm | 5 +- .../food_and_drinks/machinery/processor.dm | 5 +- code/modules/interview/interview.dm | 4 +- code/modules/keybindings/bindings_client.dm | 8 +- code/modules/mob/dead/dead.dm | 9 +- .../modules/mob/dead/new_player/new_player.dm | 8 +- code/modules/mob/dead/observer/observer.dm | 68 ++++------ code/modules/mob/inventory.dm | 4 +- code/modules/mob/living/basic/drone/verbs.dm | 8 +- code/modules/mob/living/brain/MMI.dm | 7 +- code/modules/mob/living/carbon/alien/alien.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/living.dm | 11 +- code/modules/mob/living/navigation.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 61 +++------ code/modules/mob/living/silicon/ai/ai_say.dm | 6 +- .../mob/living/silicon/ai/freelook/eye.dm | 4 +- code/modules/mob/living/silicon/ai/laws.dm | 6 +- code/modules/mob/mob.dm | 29 ++--- code/modules/mob/mob_movement.dm | 48 ++----- code/modules/mob/mob_say.dm | 9 +- .../computers/item/laptop.dm | 4 +- code/modules/pai/debug.dm | 14 +-- code/modules/paperwork/paper.dm | 4 +- code/modules/photography/photos/photo.dm | 4 +- code/modules/point/point.dm | 3 +- .../projectiles/guns/ballistic/revolver.dm | 3 +- .../reagents/reagent_containers/spray.dm | 5 +- .../religion/dreams/dream_projection.dm | 5 +- code/modules/tgui/external.dm | 5 +- code/modules/tgui_panel/external.dm | 8 +- interface/interface.dm | 41 ++---- tgstation.dme | 3 + tools/ci/check_grep.sh | 7 ++ 79 files changed, 369 insertions(+), 565 deletions(-) create mode 100644 code/__DEFINES/verb.dm create mode 100644 code/controllers/subsystem/verbs.dm create mode 100644 code/datums/verb_metadata.dm diff --git a/code/__DEFINES/verb.dm b/code/__DEFINES/verb.dm new file mode 100644 index 00000000000..1c470aa5c1a --- /dev/null +++ b/code/__DEFINES/verb.dm @@ -0,0 +1,119 @@ +/** + * Defines a game verb with an associated /datum/verb_metadata. + * + * Usage: + * GAME_VERB(/client, ooc, "OOC", "Send a message in OOC.", "OOC", msg as text) + * // verb body + */ + +#define _GAME_VERB(owner_type, verb_path_name, verb_name, verb_desc, verb_category, show_in_context_menu, is_hidden, is_instant, verb_args...) \ +/datum/verb_metadata##owner_type/##verb_path_name \ +{ \ + name = ##verb_name; \ + description = ##verb_desc; \ + category = ##verb_category; \ + verb_path = ##owner_type/verb/##verb_path_name; \ + body_path = ##owner_type/proc/__gvb_##verb_path_name; \ +}; \ +##owner_type/verb/##verb_path_name(##verb_args) \ +{ \ + set name = ##verb_name; \ + set desc = ##verb_desc; \ + set hidden = ##is_hidden; \ + set popup_menu = ##show_in_context_menu; \ + set category = ##verb_category; \ + set instant = ##is_instant; \ + __gvb_##verb_path_name(arglist(args)); \ +}; \ +##owner_type/proc/__gvb_##verb_path_name(##verb_args) + +#define GAME_VERB(owner_type, verb_path_name, verb_name, verb_category, verb_args...) \ +_GAME_VERB(owner_type, verb_path_name, verb_name, "", verb_category, TRUE, FALSE, FALSE, ##verb_args) + +#define GAME_VERB_DESC(owner_type, verb_path_name, verb_name, verb_desc, verb_category, verb_args...) \ +_GAME_VERB(owner_type, verb_path_name, verb_name, verb_desc, verb_category, TRUE, FALSE, FALSE, ##verb_args) + +#define GAME_VERB_HIDDEN(owner_type, verb_path_name, verb_name, verb_args...) \ +_GAME_VERB(owner_type, verb_path_name, verb_name, "", null, FALSE, TRUE, FALSE, ##verb_args) + +#define GAME_VERB_HIDDEN_INSTANT(owner_type, verb_path_name, verb_name, verb_args...) \ +_GAME_VERB(owner_type, verb_path_name, verb_name, "", null, FALSE, TRUE, TRUE, ##verb_args) + +#define _GAME_VERB_PROC(owner_type, verb_path_name, verb_name, verb_desc, verb_category, show_in_context_menu, is_hidden, verb_args...) \ +/datum/verb_metadata##owner_type/##verb_path_name \ +{ \ + name = ##verb_name; \ + description = ##verb_desc; \ + category = ##verb_category; \ + verb_path = ##owner_type/proc/##verb_path_name; \ + body_path = ##owner_type/proc/__gvb_##verb_path_name; \ +}; \ +##owner_type/proc/##verb_path_name(##verb_args) \ +{ \ + set name = ##verb_name; \ + set desc = ##verb_desc; \ + set hidden = ##is_hidden; \ + set popup_menu = ##show_in_context_menu; \ + set category = ##verb_category; \ + __gvb_##verb_path_name(arglist(args)); \ +}; \ +##owner_type/proc/__gvb_##verb_path_name(##verb_args) + +#define GAME_VERB_PROC(owner_type, verb_path_name, verb_name, verb_category, verb_args...) \ +_GAME_VERB_PROC(owner_type, verb_path_name, verb_name, "", verb_category, TRUE, FALSE, ##verb_args) + +#define GAME_VERB_PROC_DESC(owner_type, verb_path_name, verb_name, verb_desc, verb_category, verb_args...) \ +_GAME_VERB_PROC(owner_type, verb_path_name, verb_name, verb_desc, verb_category, TRUE, FALSE, ##verb_args) + +#define _GAME_VERB_SRC(owner_type, verb_path_name, src_value, verb_name, verb_desc, verb_category, show_in_context_menu, is_hidden, verb_args...) \ +/datum/verb_metadata##owner_type/##verb_path_name \ +{ \ + name = ##verb_name; \ + description = ##verb_desc; \ + category = ##verb_category; \ + verb_path = ##owner_type/verb/##verb_path_name; \ + body_path = ##owner_type/proc/__gvb_##verb_path_name; \ +}; \ +##owner_type/verb/##verb_path_name(##verb_args) \ +{ \ + set name = ##verb_name; \ + set desc = ##verb_desc; \ + set hidden = ##is_hidden; \ + set popup_menu = ##show_in_context_menu; \ + set category = ##verb_category; \ + set src in src_value; \ + __gvb_##verb_path_name(arglist(args)); \ +}; \ +##owner_type/proc/__gvb_##verb_path_name(##verb_args) + +#define GAME_VERB_SRC(owner_type, verb_path_name, src_value, verb_name, verb_category, verb_args...) \ +_GAME_VERB_SRC(owner_type, verb_path_name, src_value, verb_name, "", verb_category, TRUE, FALSE, ##verb_args) + +#define GAME_VERB_SRC_DESC(owner_type, verb_path_name, src_value, verb_name, verb_desc, verb_category, verb_args...) \ +_GAME_VERB_SRC(owner_type, verb_path_name, src_value, verb_name, verb_desc, verb_category, TRUE, FALSE, ##verb_args) + +#define _GAME_VERB_GLOBAL_PROC(verb_path_name, verb_name, verb_desc, verb_category, is_hidden, verb_args...) \ +/datum/verb_metadata/##verb_path_name \ +{ \ + name = ##verb_name; \ + description = ##verb_desc; \ + category = ##verb_category; \ + verb_path = /proc/##verb_path_name; \ + body_path = /proc/__gvb_##verb_path_name; \ +}; \ +/proc/##verb_path_name(##verb_args) \ +{ \ + set name = ##verb_name; \ + set desc = ##verb_desc; \ + set hidden = ##is_hidden; \ + set category = ##verb_category; \ + __gvb_##verb_path_name(arglist(args)); \ +}; \ +/proc/__gvb_##verb_path_name(##verb_args) + +#define GAME_VERB_GLOBAL_PROC(verb_path_name, verb_name, verb_desc, verb_category, verb_args...) \ +_GAME_VERB_GLOBAL_PROC(verb_path_name, verb_name, verb_desc, verb_category, FALSE, ##verb_args) + +#define INVOKE_GAME_VERB(target, owner_type, verb_path_name, args...) SSverbs.invoke(target, /datum/verb_metadata##owner_type/##verb_path_name, ##args) +#define ASSIGN_GAME_VERB(target, owner_type, verb_path_name) SSverbs.assign_verb(target, /datum/verb_metadata##owner_type/##verb_path_name) +#define UNASSIGN_GAME_VERB(target, owner_type, verb_path_name) SSverbs.unassign_verb(target, /datum/verb_metadata##owner_type/##verb_path_name) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 1c7cc767e6f..1417e34e359 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -477,17 +477,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( continue show_to.client?.screen += reuse -//Triggered when F12 is pressed (Unless someone changed something in the DMF) -/mob/verb/button_pressed_F12() - set name = "F12" - set hidden = TRUE - - if(hud_used && client) - hud_used.show_hud() //Shows the next hud preset - to_chat(usr, span_info("Switched HUD mode. Press F12 to toggle.")) - else - to_chat(usr, span_warning("This mob type does not use a HUD.")) - /// Rebuilds our mob's hand slot screen elements /datum/hud/proc/build_hand_slots(update_hud = FALSE) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index cbe5403ea09..a66195da045 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -71,10 +71,7 @@ continue inv.alpha = (blocked_slots & inv.slot_id) ? 128 : initial(inv.alpha) -/mob/living/carbon/human/verb/toggle_hotkey_verbs() - set category = "OOC" - set name = "Toggle hotkey buttons" - set desc = "This disables or enables the user interface buttons which can be used with hotkeys." +GAME_VERB_DESC(/mob/living/carbon/human, toggle_hotkey_verbs, "Toggle hotkey buttons", "This disables or enables the user interface buttons which can be used with hotkeys.", "OOC") if(hud_used.hotkey_ui_hidden) client.screen += hud_used.screen_groups[HUD_GROUP_HOTKEYS] diff --git a/code/_onclick/hud/screen_objects/credits.dm b/code/_onclick/hud/screen_objects/credits.dm index 44749e0e4a2..e36eb8a11a4 100644 --- a/code/_onclick/hud/screen_objects/credits.dm +++ b/code/_onclick/hud/screen_objects/credits.dm @@ -11,7 +11,7 @@ var/icon/credits_icon = new(CREDITS_PATH) LAZYINITLIST(credits) var/list/_credits = credits - add_verb(src, /client/proc/ClearCredits) + ASSIGN_GAME_VERB(src, /client, ClearCredits) var/static/list/credit_order_for_this_round if(isnull(credit_order_for_this_round)) credit_order_for_this_round = list("Thanks for playing!") + (shuffle(icon_states(credits_icon)) - "Thanks for playing!") @@ -21,13 +21,11 @@ _credits += new /atom/movable/screen/credit(null, null, I, src, credits_icon) sleep(CREDIT_SPAWN_SPEED) sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED) - remove_verb(src, /client/proc/ClearCredits) + UNASSIGN_GAME_VERB(src, /client, ClearCredits) qdel(credits_icon) -/client/proc/ClearCredits() - set name = "Hide Credits" - set category = "OOC" - remove_verb(src, /client/proc/ClearCredits) +GAME_VERB_PROC(/client, ClearCredits, "Hide Credits", "OOC") + UNASSIGN_GAME_VERB(src, /client, ClearCredits) QDEL_LIST(credits) credits = null diff --git a/code/_onclick/hud/screen_objects/map_popups.dm b/code/_onclick/hud/screen_objects/map_popups.dm index bf524b6c8d9..05612460a8f 100644 --- a/code/_onclick/hud/screen_objects/map_popups.dm +++ b/code/_onclick/hud/screen_objects/map_popups.dm @@ -128,7 +128,6 @@ /** * When the popup closes in any way (player or proc call) it calls this. */ -/client/verb/handle_popup_close(window_id as text) - set hidden = TRUE +GAME_VERB_HIDDEN(/client, handle_popup_close, "handle popup close", window_id as text) clear_map("[window_id]_map") SEND_SIGNAL(src, COMSIG_POPUP_CLEARED, window_id) diff --git a/code/controllers/subsystem/verbs.dm b/code/controllers/subsystem/verbs.dm new file mode 100644 index 00000000000..48b0a4dd43e --- /dev/null +++ b/code/controllers/subsystem/verbs.dm @@ -0,0 +1,29 @@ +SUBSYSTEM_DEF(verbs) + name = "Verbs" + ss_flags = SS_NO_FIRE + init_stage = INITSTAGE_EARLY + var/list/datum/verb_metadata/verbs_by_type = list() + +/datum/controller/subsystem/verbs/Initialize() + for(var/datum/verb_metadata/verb_type as anything in subtypesof(/datum/verb_metadata)) + verbs_by_type[verb_type] = new verb_type + return SS_INIT_SUCCESS + +/datum/controller/subsystem/verbs/proc/invoke(target, datum/verb_metadata/verb_type, ...) + var/datum/verb_metadata/meta = verbs_by_type[verb_type] + if(isnull(meta)) + CRASH("Attempted to invoke unknown verb '[verb_type]'.") + var/list/invoke_args = args.Copy(3) + call(target, meta.body_path)(arglist(invoke_args)) + +/datum/controller/subsystem/verbs/proc/assign_verb(target, datum/verb_metadata/verb_type) + var/datum/verb_metadata/meta = verbs_by_type[verb_type] + if(isnull(meta)) + CRASH("Attempted to assign unknown verb '[verb_type]'.") + meta.assign_to(target) + +/datum/controller/subsystem/verbs/proc/unassign_verb(target, datum/verb_metadata/verb_type) + var/datum/verb_metadata/meta = verbs_by_type[verb_type] + if(isnull(meta)) + CRASH("Attempted to unassign unknown verb '[verb_type]'.") + meta.unassign_from(target) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index bbc9d168d52..c39cb99b441 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -441,9 +441,7 @@ SUBSYSTEM_DEF(vote) voting -= user.client?.ckey /// Mob level verb that allows players to vote on the current vote. -/mob/verb/vote() - set category = "OOC" - set name = "Vote" +GAME_VERB(/mob, vote, "Vote", "OOC") if(!SSvote.initialized) to_chat(usr, span_notice("Voting is not set up yet!")) diff --git a/code/datums/achievements/_achievement_data.dm b/code/datums/achievements/_achievement_data.dm index 9cfad0016de..f91ac424275 100644 --- a/code/datums/achievements/_achievement_data.dm +++ b/code/datums/achievements/_achievement_data.dm @@ -129,9 +129,6 @@ continue .["highscores"] += list(list("name" = score.name, "scores" = score.high_scores)) -/client/verb/checkachievements() - set category = "OOC" - set name = "Check achievements" - set desc = "See all of your achievements!" +GAME_VERB_DESC(/client, checkachievements, "Check achievements", "See all of your achievements!", "OOC") persistent_client.achievements.ui_interact(usr) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index d16b2f93cab..5f6cf9038ac 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -484,9 +484,7 @@ /// called when a browser popup window is closed after registering with proc/onclose() /// if a valid atom reference is supplied, call the atom's Topic() with "close=1" /// otherwise, just reset the client mob's machine var. -/client/verb/windowclose(atomref as text) - set hidden = TRUE // hide this verb from the user's panel - set name = ".windowclose" // no autocomplete on cmd line +GAME_VERB_HIDDEN(/client, windowclose, ".windowclose", atomref as text) if(atomref == "null") return diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 20ad08a77b6..6a668e87e5e 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -71,10 +71,7 @@ var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11)) . += "#[tm.number][details]
" -/client/verb/showrevinfo() - set category = "OOC" - set name = "Show Server Revision" - set desc = "Check the current server code revision" +GAME_VERB_DESC(/client, showrevinfo, "Show Server Revision", "Check the current server code revision", "OOC") var/list/msg = list() // Round ID diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index f20d38397bd..e07cc254123 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -76,7 +76,13 @@ . = ..() if(.) return - user.mob.button_pressed_F12() + + if(user.mob.hud_used) + user.mob.hud_used.show_hud() //Shows the next hud preset + to_chat(user, span_info("Switched HUD mode. Press F12 to toggle.")) + else + to_chat(user, span_warning("This mob type does not use a HUD.")) + return TRUE /datum/keybinding/client/close_every_ui diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 961f27b2104..35dc80dab95 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -5,16 +5,6 @@ The original authors are: cogwerks, pistoleer, spyguy, angriestibm, marquesas, a If you make a derivative work from this code, you must include this notification header alongside it. */ -/mob/living/proc/wrestling_help() - set name = "Recall Teachings" - set desc = "Remember how to wrestle." - set category = "Wrestling" - - to_chat(usr, "You flex your muscles and have a revelation...") - to_chat(usr, "[span_notice("Clinch")]: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful.") - to_chat(usr, "[span_notice("Suplex")]: Shove someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor.") - to_chat(usr, "[span_notice("Advanced grab")]: Grab. Passively causes stamina damage when grabbing someone.") - /datum/martial_art/wrestling name = "Wrestling" id = MARTIALART_WRESTLING diff --git a/code/datums/verb_metadata.dm b/code/datums/verb_metadata.dm new file mode 100644 index 00000000000..f0b0f72bd01 --- /dev/null +++ b/code/datums/verb_metadata.dm @@ -0,0 +1,12 @@ +/datum/verb_metadata + var/name + var/description + var/category + var/verb_path + var/body_path + +/datum/verb_metadata/proc/assign_to(target) + add_verb(target, verb_path) + +/datum/verb_metadata/proc/unassign_from(target) + remove_verb(target, verb_path) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 556df4d02eb..7dc013c8057 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -323,9 +323,7 @@ /obj/machinery/iv_drip/proc/get_reagents() return use_internal_storage ? reagents : reagent_container?.reagents -/obj/machinery/iv_drip/verb/eject_beaker() - set name = "Remove IV Container" - set src in view(1) +GAME_VERB_SRC(/obj/machinery/iv_drip, eject_beaker, view(1), "Remove IV Container", null) if(!isliving(usr)) to_chat(usr, span_warning("You can't do that!")) @@ -342,9 +340,7 @@ reagent_container = null update_appearance(UPDATE_ICON) -/obj/machinery/iv_drip/verb/toggle_mode() - set name = "Toggle Mode" - set src in view(1) +GAME_VERB_SRC(/obj/machinery/iv_drip, toggle_mode, view(1), "Toggle Mode", null) if(!isliving(usr)) to_chat(usr, span_warning("You can't do that!")) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 82217efdda3..80ac6a957a4 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -217,9 +217,7 @@ Buildable meters if(ispath(pipe_type,/obj/machinery/atmospherics/pipe/heat_exchanging)) resistance_flags |= FIRE_PROOF | LAVA_PROOF -/obj/item/pipe/verb/flip() - set name = "Invert Pipe" - set src in view(1) +GAME_VERB_SRC(/obj/item/pipe, flip, view(1), "Invert Pipe", null) if ( usr.incapacitated ) return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 35721788368..c8438dc81dc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -401,9 +401,7 @@ if(greyscale_config_inhand_right) righthand_file = SSgreyscale.GetColoredIconByType(greyscale_config_inhand_right, greyscale_colors) -/obj/item/verb/move_to_top() - set name = "Move To Top" - set src in oview(1) +GAME_VERB_SRC(/obj/item, move_to_top, oview(1), "Move To Top", null) if(!isturf(loc) || usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || anchored) return @@ -822,9 +820,7 @@ return M.can_equip(src, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action = indirect_action) -/obj/item/verb/verb_pickup() - set src in oview(1) - set name = "Pick up" +GAME_VERB_SRC(/obj/item, verb_pickup, oview(1), "Pick up", null) if(usr.incapacitated || !Adjacent(usr)) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 7b7286b9711..4664bf85d71 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -126,8 +126,7 @@ return FALSE -/obj/item/taperecorder/verb/ejectverb() - set name = "Eject Tape" +GAME_VERB(/obj/item/taperecorder, ejectverb, "Eject Tape", null) if(!can_use(usr)) balloon_alert(usr, "can't use!") @@ -161,8 +160,7 @@ mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss", NO_TIMEZONE)]\] [speaker.get_voice()]: [raw_message]" -/obj/item/taperecorder/verb/record() - set name = "Start Recording" +GAME_VERB(/obj/item/taperecorder, record, "Start Recording", null) if(!can_use(usr)) balloon_alert(usr, "can't use!") @@ -203,8 +201,7 @@ playsound(src, 'sound/items/taperecorder/taperecorder_stop.ogg', 50, FALSE) -/obj/item/taperecorder/verb/stop() - set name = "Stop" +GAME_VERB(/obj/item/taperecorder, stop, "Stop", null) if(!can_use(usr)) balloon_alert(usr, "can't use!") @@ -223,8 +220,7 @@ update_appearance() update_sound() -/obj/item/taperecorder/verb/play() - set name = "Play Tape" +GAME_VERB(/obj/item/taperecorder, play, "Play Tape", null) if(!can_use(usr)) balloon_alert(usr, "can't use!") @@ -295,8 +291,7 @@ if("Eject") eject(user) -/obj/item/taperecorder/verb/print_transcript() - set name = "Print Transcript" +GAME_VERB(/obj/item/taperecorder, print_transcript, "Print Transcript", null) var/list/transcribed_info = mytape.storedinfo if(!length(transcribed_info)) diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index 8e9f1ad6194..cc945ce70fd 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -32,8 +32,7 @@ return ..() ///A right-click verb, for those not using hotkey mode. -/obj/item/borg/apparatus/verb/verb_dropHeld() - set name = "Drop" +GAME_VERB(/obj/item/borg/apparatus, verb_dropHeld, "Drop", null) if(usr != loc || !stored) return diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index c0e75f77930..5b1d94e6b9e 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -59,8 +59,7 @@ //Remove from their hands and put back "into" the tank remove_noz() -/obj/item/watertank/verb/toggle_mister_verb() - set name = "Toggle Mister" +GAME_VERB(/obj/item/watertank, toggle_mister_verb, "Toggle Mister", null) toggle_mister(usr) /obj/item/watertank/proc/make_noz() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 38da438155a..858ab649ee9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -1025,9 +1025,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) if(attack_hand(user)) return ITEM_INTERACT_BLOCKING -/obj/structure/closet/verb/verb_toggleopen() - set name = "Toggle Open" - set src in view(1) +GAME_VERB_SRC(/obj/structure/closet, verb_toggleopen, view(1), "Toggle Open", null) if(!usr.can_perform_action(src) || !isturf(loc)) return diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 68b6ee31c7d..a8aaa2620af 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -336,9 +336,8 @@ //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 src in oview(1) +GAME_VERB_SRC(/obj/structure/windoor_assembly, flip, oview(1), "Flip Windoor Assembly", null) + if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 62f07be0679..96a29cb10ba 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -11,7 +11,7 @@ ADMIN_VERB(hide_verbs, R_NONE, "Adminverbs - Hide All", "Hide most of your admin verbs.", ADMIN_CATEGORY_MAIN) user.remove_admin_verbs() - add_verb(user, /client/proc/show_verbs) + ASSIGN_GAME_VERB(user, /client, show_verbs) to_chat(user, span_interface("Almost all of your adminverbs have been hidden."), confidential = TRUE) BLACKBOX_LOG_ADMIN_VERB("Hide All Adminverbs") diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 3b78e552740..67a7d690070 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -119,7 +119,7 @@ GLOBAL_PROTECT(href_token) if (!isnull(client)) disassociate() - add_verb(client, /client/proc/readmin) + ASSIGN_GAME_VERB(client, /client, readmin) client.disable_combo_hud() client.update_special_keybinds() client.set_stat_panel() @@ -154,12 +154,12 @@ GLOBAL_PROTECT(href_token) if (deadmined) activate() - remove_verb(client, /client/proc/admin_2fa_verify) + UNASSIGN_GAME_VERB(client, /client, admin_2fa_verify) owner = client owner.holder = src owner.add_admin_verbs() - remove_verb(owner, /client/proc/readmin) + UNASSIGN_GAME_VERB(owner, /client, readmin) owner.init_verbs() //re-initialize the verb list owner.update_special_keybinds() GLOB.admins |= client @@ -284,7 +284,7 @@ GLOBAL_PROTECT(href_token) #define ERROR_2FA_REQUEST_PERMISSIONS "

You could not be verified, and a DB connection couldn't be established. Please contact an admin with +PERMISSIONS to grant you permission.

" /datum/admins/proc/start_2fa_process(client/client, id) - add_verb(client, /client/proc/admin_2fa_verify) + ASSIGN_GAME_VERB(client, /client, admin_2fa_verify) client?.init_verbs() var/admin_2fa_url = CONFIG_GET(string/admin_2fa_url) diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index e7b91726099..3ecf70adc3e 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -221,9 +221,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_occupants_player_panel, R_ADMIN, "Show Occupan SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/show_player_panel, selected_mob) return -/client/proc/cmd_admin_godmode(mob/mob in GLOB.mob_list) - set category = "Admin.Game" - set name = "Godmode" +GAME_VERB_PROC(/client, cmd_admin_godmode, "Godmode", "Admin.Game", mob/mob in GLOB.mob_list) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 94f9eae85fb..2c02b12fe7f 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -792,10 +792,7 @@ GLOBAL_DATUM_INIT(admin_help_ui_handler, /datum/admin_help_ui_handler, new) new /datum/admin_help(message, user_client, FALSE, urgent) -/client/verb/no_tgui_adminhelp(message as message) - set name = "NoTguiAdminhelp" - set hidden = TRUE - +GAME_VERB_HIDDEN(/client, no_tgui_adminhelp, "NoTguiAdminhelp", message as message) if(adminhelptimerid) return @@ -803,16 +800,11 @@ GLOBAL_DATUM_INIT(admin_help_ui_handler, /datum/admin_help_ui_handler, new) GLOB.admin_help_ui_handler.perform_adminhelp(src, message, FALSE) -/client/verb/adminhelp() - set category = "Admin" - set name = "Adminhelp" +GAME_VERB(/client, adminhelp, "Adminhelp", "Admin") GLOB.admin_help_ui_handler.ui_interact(mob) to_chat(src, span_boldnotice("Adminhelp failing to open or work? Click here")) -/client/verb/view_latest_ticket() - set category = "Admin" - set name = "View Latest Ticket" - +GAME_VERB(/client, view_latest_ticket, "View Latest Ticket", "Admin") if(!current_ticket) // Check if the client had previous tickets, and show the latest one var/list/prev_tickets = list() diff --git a/code/modules/admin/verbs/ai_triumvirate.dm b/code/modules/admin/verbs/ai_triumvirate.dm index 38c2eba712c..4683e8765a9 100644 --- a/code/modules/admin/verbs/ai_triumvirate.dm +++ b/code/modules/admin/verbs/ai_triumvirate.dm @@ -28,9 +28,7 @@ GLOBAL_DATUM(triple_ai_controller, /datum/triple_ai_controller) GLOB.triple_ai_controller = null . = ..() -/client/proc/triple_ai() - set category = "Admin.Events" - set name = "Toggle AI Triumvirate" +GAME_VERB_PROC(/client, triple_ai, "Toggle AI Triumvirate", "Admin.Events") if(SSticker.current_state > GAME_STATE_PREGAME) to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.", confidential = TRUE) diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm index ae08790a57d..8c28389fdb2 100644 --- a/code/modules/admin/verbs/anonymousnames.dm +++ b/code/modules/admin/verbs/anonymousnames.dm @@ -7,9 +7,7 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme) this is the setup, it handles announcing crew and other settings for the mode and then creating the datum singleton */ -/client/proc/anon_names() - set category = "Admin.Events" - set name = "Setup Anonymous Names" +GAME_VERB_PROC(/client, anon_names, "Setup Anonymous Names", "Admin.Events") if(GLOB.current_anonymous_theme) var/response = tgui_alert(usr, "Anon mode is currently enabled. Disable?", "cold feet", list("Disable Anon Names", "Keep it Enabled")) diff --git a/code/modules/admin/verbs/grant_dna_infusion.dm b/code/modules/admin/verbs/grant_dna_infusion.dm index d761e47ad94..28b62662d6b 100644 --- a/code/modules/admin/verbs/grant_dna_infusion.dm +++ b/code/modules/admin/verbs/grant_dna_infusion.dm @@ -3,9 +3,7 @@ * Returns the entry if all organs were successfully replaced. * If no infusion was picked, the infusion had no organs, or if one or more organs could not be granted, returns FALSE */ -/client/proc/grant_dna_infusion(mob/living/carbon/human/target in world) - set name = "Apply DNA Infusion" - set category = "Debug" +GAME_VERB_PROC(/client, grant_dna_infusion, "Apply DNA Infusion", "Debug", mob/living/carbon/human/target in world) var/list/infusions = list() for(var/datum/infuser_entry/path as anything in sort_list(subtypesof(/datum/infuser_entry), GLOBAL_PROC_REF(cmp_typepaths_asc))) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index c0955dec70b..a8443b80303 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -1,6 +1,4 @@ -/mob/verb/pray(message as text) - set name = VERB_PRAY - +GAME_VERB(/mob, pray, VERB_PRAY, null, message as text) if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(src, span_danger("Speech is currently admin-disabled."), confidential = TRUE) return diff --git a/code/modules/admin/verbs/request_internet_sound.dm b/code/modules/admin/verbs/request_internet_sound.dm index 376547fd0e4..33df7f1e3d7 100644 --- a/code/modules/admin/verbs/request_internet_sound.dm +++ b/code/modules/admin/verbs/request_internet_sound.dm @@ -1,7 +1,4 @@ -/mob/verb/request_internet_sound() - set category = "OOC" - set name = "Request Internet Sound" - +GAME_VERB(/mob, request_internet_sound, "Request Internet Sound", "OOC") if(!CONFIG_GET(flag/request_internet_sound)) to_chat(usr, span_danger("This server has disabled internet sound requests."), confidential = TRUE) return diff --git a/code/modules/admin/verbs/special_verbs.dm b/code/modules/admin/verbs/special_verbs.dm index 309c14d4455..65f8ee39990 100644 --- a/code/modules/admin/verbs/special_verbs.dm +++ b/code/modules/admin/verbs/special_verbs.dm @@ -1,19 +1,14 @@ // Admin Verbs in this file are special and cannot use the AVD system for some reason or another. -/client/proc/show_verbs() - set name = "Adminverbs - Show" - set category = ADMIN_CATEGORY_MAIN +GAME_VERB_PROC(/client, show_verbs, "Adminverbs - Show", ADMIN_CATEGORY_MAIN) - remove_verb(src, /client/proc/show_verbs) + UNASSIGN_GAME_VERB(src, /client, show_verbs) add_admin_verbs() to_chat(src, span_interface("All of your adminverbs are now visible."), confidential = TRUE) BLACKBOX_LOG_ADMIN_VERB("Show Adminverbs") -/client/proc/readmin() - set name = "Readmin" - set category = "Admin" - set desc = "Regain your admin powers." +GAME_VERB_PROC_DESC(/client, readmin, "Readmin", "Regain your admin powers.", "Admin") var/datum/admins/A = GLOB.deadmins[ckey] @@ -35,9 +30,7 @@ log_admin("[src] re-adminned themselves.") BLACKBOX_LOG_ADMIN_VERB("Readmin") -/client/proc/admin_2fa_verify() - set name = "Verify Admin" - set category = "Admin" +GAME_VERB_PROC(/client, admin_2fa_verify, "Verify Admin", "Admin") var/datum/admins/admin = GLOB.admin_datums[ckey] admin?.associate(src) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 78e68d3e6b4..73c9d42f6fe 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -170,9 +170,7 @@ mode.handle_click(user.client, params, object) return TRUE // no doing underlying actions -/proc/togglebuildmode(mob/M as mob in GLOB.player_list) - set name = "Toggle Build Mode" - set category = "Event" +GAME_VERB_GLOBAL_PROC(togglebuildmode, "Toggle Build Mode", "", "Event", mob/M as mob in GLOB.player_list) if(M.client) if(istype(M.client.click_intercept,/datum/buildmode)) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6ac51bd14d3..5bafaedb481 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -301,10 +301,10 @@ GLOBAL_LIST_INIT(unrecommended_builds, list( prefs.last_id = computer_id //these are gonna be used for banning if(fexists(roundend_report_file())) - add_verb(src, /client/proc/show_previous_roundend_report) + ASSIGN_GAME_VERB(src, /client, show_previous_roundend_report) if(fexists("data/server_last_roundend_report.html")) - add_verb(src, /client/proc/show_servers_last_roundend_report) + ASSIGN_GAME_VERB(src, /client, show_servers_last_roundend_report) var/full_version = "[byond_version].[byond_build ? byond_build : "xxx"]" log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[full_version]") @@ -376,7 +376,7 @@ GLOBAL_LIST_INIT(unrecommended_builds, list( admin_datum.associate(src) connecting_admin = TRUE else if(GLOB.deadmins[ckey]) - add_verb(src, /client/proc/readmin) + ASSIGN_GAME_VERB(src, /client, readmin) connecting_admin = TRUE if(CONFIG_GET(flag/autoadmin)) if(!GLOB.admin_datums[ckey]) @@ -946,11 +946,11 @@ GLOBAL_LIST_INIT(unrecommended_builds, list( if (interviewee) return if(CONFIG_GET(flag/see_own_notes)) - add_verb(src, /client/proc/self_notes) + ASSIGN_GAME_VERB(src, /client, self_notes) if(CONFIG_GET(flag/use_exp_tracking)) - add_verb(src, /client/proc/self_playtime) + ASSIGN_GAME_VERB(src, /client, self_playtime) if(!CONFIG_GET(flag/forbid_preferences_export)) - add_verb(src, /client/proc/export_preferences) + ASSIGN_GAME_VERB(src, /client, export_preferences) //checks if a client is afk @@ -1198,17 +1198,12 @@ GLOBAL_LIST_INIT(unrecommended_builds, list( var/mob/dead/observer/observer = mob observer.ManualFollow(target) -/client/verb/stop_client_sounds() - set name = "Stop Sounds" - set category = "OOC" - set desc = "Stop Current Sounds" +GAME_VERB_DESC(/client, stop_client_sounds, "Stop Sounds", "Stop Current Sounds", "OOC") SEND_SOUND(usr, sound(null)) tgui_panel?.stop_music() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) -/client/verb/toggle_fullscreen() - set name = "Toggle Fullscreen" - set category = "OOC" +GAME_VERB(/client, toggle_fullscreen, "Toggle Fullscreen", "OOC") var/is_on = prefs.read_preference(/datum/preference/toggle/fullscreen_mode) prefs.write_preference(GLOB.preference_entries[/datum/preference/toggle/fullscreen_mode], !is_on) diff --git a/code/modules/client/preferences_menu.dm b/code/modules/client/preferences_menu.dm index 30c658d4541..3ccdb006403 100644 --- a/code/modules/client/preferences_menu.dm +++ b/code/modules/client/preferences_menu.dm @@ -1,7 +1,4 @@ -/client/verb/open_character_preferences() - set category = "OOC" - set name = "Open Character Preferences" - set desc = "Open Character Preferences" +GAME_VERB_DESC(/client, open_character_preferences, "Open Character Preferences", "Open Character Preferences", "OOC") if(!prefs) return @@ -9,10 +6,7 @@ prefs.update_static_data(usr) prefs.ui_interact(usr) -/client/verb/open_game_preferences() - set category = "OOC" - set name = "Open Game Preferences" - set desc = "Open Game Preferences" +GAME_VERB_DESC(/client, open_game_preferences, "Open Game Preferences", "Open Game Preferences", "OOC") if(!prefs) return diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index cb02dc6d248..a9a5d3e4dcd 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -2,9 +2,7 @@ GLOBAL_VAR_INIT(OOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwis GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") ///talking in OOC uses this -/client/verb/ooc(msg as text) - set name = VERB_OOC - +GAME_VERB(/client, ooc, VERB_OOC, null, msg as text) if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) return @@ -148,13 +146,6 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") else GLOB.dooc_allowed = !GLOB.dooc_allowed -/client/proc/set_ooc() - set name = "Set Player OOC Color" - set desc = "Modifies player OOC Color" - set category = "Server" - if(IsAdminAdvancedProcCall()) - return - ADMIN_VERB(set_ooc_color, R_FUN, "Set Player OOC Color", "Modifies the global OOC color.", ADMIN_CATEGORY_SERVER) var/newColor = tgui_color_picker(user, "Please select the new player OOC color.", "OOC color") if(isnull(newColor)) @@ -164,13 +155,6 @@ ADMIN_VERB(set_ooc_color, R_FUN, "Set Player OOC Color", "Modifies the global OO log_admin("[key_name_admin(user)] has set the player ooc color to [new_color].") GLOB.OOC_COLOR = new_color -/client/proc/reset_ooc() - set name = "Reset Player OOC Color" - set desc = "Returns player OOC Color to default" - set category = "Server" - if(IsAdminAdvancedProcCall()) - return - ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC color to default.", ADMIN_CATEGORY_SERVER) if(tgui_alert(user, "Are you sure you want to reset the OOC color of all players?", "Reset Player OOC Color", list("Yes", "No")) != "Yes") return @@ -179,31 +163,20 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC GLOB.OOC_COLOR = null //Checks admin notice -/client/verb/admin_notice() - set name = "Adminnotice" - set category = "Admin" - set desc = "Check the admin notice if it has been set" - +GAME_VERB_DESC(/client, admin_notice, "Adminnotice", "Check the admin notice if it has been set", "Admin") if(GLOB.admin_notice) to_chat(src, "[span_boldnotice("Admin Notice:")]\n \t [GLOB.admin_notice]") else to_chat(src, span_notice("There are no admin notices at the moment.")) -/client/verb/motd() - set name = "MOTD" - set category = "OOC" - set desc ="Check the Message of the Day" - +GAME_VERB_DESC(/client, motd, "MOTD", "Check the Message of the Day", "OOC") var/motd = global.config.motd if(motd) to_chat(src, "
[motd]
", handle_whitespace=FALSE) else to_chat(src, span_notice("The Message of the Day has not been set.")) -/client/proc/self_notes() - set name = "View Admin Remarks" - set category = "OOC" - set desc = "View the notes that admins have written about you" +GAME_VERB_PROC_DESC(/client, self_notes, "View Admin Remarks", "View the notes that admins have written about you", "OOC") if(!CONFIG_GET(flag/see_own_notes)) to_chat(usr, span_notice("Sorry, that function is not enabled on this server.")) @@ -211,10 +184,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC browse_messages(null, usr.ckey, null, TRUE) -/client/proc/self_playtime() - set name = "View tracked playtime" - set category = "OOC" - set desc = "View the amount of playtime for roles the server has tracked." +GAME_VERB_PROC_DESC(/client, self_playtime, "View tracked playtime", "View the amount of playtime for roles the server has tracked.", "OOC") if(!CONFIG_GET(flag/use_exp_tracking)) to_chat(usr, span_notice("Sorry, tracking is currently disabled.")) @@ -223,11 +193,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC new /datum/job_report_menu(src, usr) // Ignore verb -/client/verb/select_ignore() - set name = "Ignore" - set category = "OOC" - set desc ="Ignore a player's messages on the OOC channel" - +GAME_VERB_DESC(/client, select_ignore, "Ignore", "Ignore a player's messages on the OOC channel", "OOC") // Make a list to choose players from var/list/players = list() @@ -305,11 +271,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC to_chat(src, span_infoplain("You are now ignoring [selection] on the OOC channel.")) // Unignore verb -/client/verb/select_unignore() - set name = "Unignore" - set category = "OOC" - set desc = "Stop ignoring a player's messages on the OOC channel" - +GAME_VERB_DESC(/client, select_unignore, "Unignore", "Stop ignoring a player's messages on the OOC channel", "OOC") // Check if we've ignored any players if(!length(prefs.ignoring)) // Express that we haven't ignored any players in chat @@ -342,25 +304,15 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC // Express that we've unignored the selected player in chat to_chat(src, span_infoplain("You are no longer ignoring [selection] on the OOC channel.")) -/client/proc/show_previous_roundend_report() - set name = "Your Last Round" - set category = "OOC" - set desc = "View the last round end report you've seen" +GAME_VERB_PROC_DESC(/client, show_previous_roundend_report, "Your Last Round", "View the last round end report you've seen", "OOC") SSticker.show_roundend_report(src, report_type = PERSONAL_LAST_ROUND) -/client/proc/show_servers_last_roundend_report() - set name = "Server's Last Round" - set category = "OOC" - set desc = "View the last round end report from this server" +GAME_VERB_PROC_DESC(/client, show_servers_last_roundend_report, "Server's Last Round", "View the last round end report from this server", "OOC") SSticker.show_roundend_report(src, report_type = SERVER_LAST_ROUND) -/client/verb/fit_viewport() - set name = "Fit Viewport" - set category = "OOC" - set desc = "Fit the width of the map window to match the viewport" - +GAME_VERB_DESC(/client, fit_viewport, "Fit Viewport", "Fit the width of the map window to match the viewport", "OOC") // Fetch aspect ratio var/view_size = getviewsize(view) var/aspect_ratio = view_size[1] / view_size[2] @@ -439,11 +391,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC if(fully_created) INVOKE_ASYNC(src, VERB_REF(fit_viewport)) -/client/verb/policy() - set name = "Show Policy" - set desc = "Show special server rules related to your current character." - set category = "OOC" - +GAME_VERB_DESC(/client, policy, "Show Policy", "Show special server rules related to your current character.", "OOC") //Collect keywords var/list/keywords = mob.get_policy_keywords() var/header = get_policy(POLICY_VERB_HEADER) @@ -462,33 +410,20 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC browser.set_content(policytext.Join("")) browser.open() -/client/verb/fix_stat_panel() - set name = "Fix Stat Panel" - set hidden = TRUE - +GAME_VERB_HIDDEN(/client, fix_stat_panel, "Fix Stat Panel") init_verbs() -/client/proc/export_preferences() - set name = "Export Preferences" - set desc = "Export your current preferences to a file." - set category = "OOC" +GAME_VERB_PROC_DESC(/client, export_preferences, "Export Preferences", "Export your current preferences to a file.", "OOC") ASSERT(prefs, "User attempted to export preferences while preferences were null!") // what the fuck prefs.savefile.export_json_to_client(usr, ckey) -/client/verb/map_vote_tally_count() - set name = "Show Map Vote Tallies" - set desc = "View the current map vote tally counts." - set category = "OOC" +GAME_VERB_DESC(/client, map_vote_tally_count, "Show Map Vote Tallies", "View the current map vote tally counts.", "OOC") to_chat(mob, SSmap_vote.tally_printout) -/client/verb/linkforumaccount() - set category = "OOC" - set name = "Link Forum Account" - set desc = "Validates your byond account to your forum account. Required to post on the forums." - +GAME_VERB_DESC(/client, linkforumaccount, "Link Forum Account", "Validates your byond account to your forum account. Required to post on the forums.", "OOC") var/uri = CONFIG_GET(string/forum_link_uri) if(!uri) to_chat(src, span_warning("This feature is disabled.")) diff --git a/code/modules/client/verbs/stat_panel.dm b/code/modules/client/verbs/stat_panel.dm index b350c4ee887..f88e099a77e 100644 --- a/code/modules/client/verbs/stat_panel.dm +++ b/code/modules/client/verbs/stat_panel.dm @@ -1,6 +1,4 @@ -/client/verb/toggle_stat_panel() - set name = "Toggle Stat Panel" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, toggle_stat_panel, "Toggle Stat Panel") //Flip it prefs.write_preference(GLOB.preference_entries[/datum/preference/toggle/statpanel], !prefs.read_preference(/datum/preference/toggle/statpanel)) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 6599507d6a8..d2745e0763d 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -1,8 +1,7 @@ /// Verb to simply kill yourself (in a very visual way to all players) in game! How family-friendly. Can be governed by a series of multiple checks (i.e. confirmation, is it allowed in this area, etc.) which are /// handled and called by the proc this verb invokes. It's okay to block this, because we typically always give mobs in-game the ability to Ghost out of their current mob irregardless of context. This, in contrast, /// can have as many different checks as you desire to prevent people from doing the deed to themselves. -/mob/living/verb/suicide() - set hidden = TRUE +GAME_VERB_HIDDEN(/mob/living, suicide, "suicide") handle_suicide() /// Actually handles the bare basics of the suicide process. Message type is the message we want to dispatch in the world regarding the suicide, using the defines in this file. diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index 30fdc0b686d..d02cce77b1b 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -1,9 +1,7 @@ #define DEFAULT_WHO_CELLS_PER_ROW 4 #define NO_ADMINS_ONLINE_MESSAGE "Adminhelps are also sent through TGS to services like IRC and Discord. If no admins are available in game, sending an adminhelp might still be noticed and responded to." -/client/verb/who() - set name = "Who" - set category = "OOC" +GAME_VERB(/client, who, "Who", "OOC") var/msg = "" @@ -69,9 +67,7 @@ msg += "Total Players: [length(Lines)]" to_chat(src, fieldset_block(span_bold("Current Players"), span_infoplain(msg), "boxed_message"), type = MESSAGE_TYPE_INFO) -/client/verb/adminwho() - set category = "Admin" - set name = "Adminwho" +GAME_VERB(/client, adminwho, "Adminwho", "Admin") var/list/lines = list() var/payload_string = generate_adminwho_string() diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 5412910c3e2..a8b86221e44 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -20,8 +20,7 @@ flipped = FALSE ..() -/obj/item/clothing/head/soft/verb/flipcap() - set name = "Flip cap" +GAME_VERB(/obj/item/clothing/head/soft, flipcap, "Flip cap", null) flip(usr) diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index c146677e4ab..9c3f517beb6 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -134,9 +134,8 @@ GLOBAL_LIST_INIT(hailer_phrases, list( return TRUE return FALSE -/obj/item/clothing/mask/gas/sechailer/verb/halt() - set name = "HALT" - set src in usr +GAME_VERB_SRC(/obj/item/clothing/mask/gas/sechailer, halt, usr, "HALT", null) + if(!isliving(usr) || !can_use(usr) || !COOLDOWN_FINISHED(src, hailer_cooldown)) return if(broken_hailer) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 6771e341100..7ac4cfb5aa9 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -45,9 +45,7 @@ AddElement(/datum/element/adjust_fishing_difficulty, fishing_modifier) magpulse_fishing_modifier = fishing_modifier -/obj/item/clothing/shoes/magboots/verb/toggle() - set name = "Toggle Magboots" - set src in usr +GAME_VERB_SRC(/obj/item/clothing/shoes/magboots, toggle, usr, "Toggle Magboots", null) if(!can_use(usr)) return diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 559467ea5e8..aef97b26d19 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -462,9 +462,7 @@ return all_accessories -/obj/item/clothing/under/verb/toggle() - set name = "Adjust Suit Sensors" - set src in usr +GAME_VERB_SRC(/obj/item/clothing/under, toggle, usr, "Adjust Suit Sensors", null) var/mob/user_mob = usr if(!can_toggle_sensors(user_mob)) return @@ -532,10 +530,7 @@ return pop_accessory(user) -/obj/item/clothing/under/verb/jumpsuit_adjust() - set name = "Adjust Jumpsuit Style" - set category = null - set src in usr +GAME_VERB_SRC(/obj/item/clothing/under, jumpsuit_adjust, usr, "Adjust Jumpsuit Style", null) if(!can_adjust) balloon_alert(usr, "can't be adjusted!") diff --git a/code/modules/discord/accountlink.dm b/code/modules/discord/accountlink.dm index 3ef8ff527e4..83d73afe6f2 100644 --- a/code/modules/discord/accountlink.dm +++ b/code/modules/discord/accountlink.dm @@ -1,8 +1,5 @@ // IF you have linked your account, this will trigger a verify of the user -/client/verb/verify_in_discord() - set category = "OOC" - set name = "Verify Discord Account" - set desc = "Verify your discord account with your BYOND account" +GAME_VERB_DESC(/client, verify_in_discord, "Verify Discord Account", "Verify your discord account with your BYOND account", "OOC") // Safety checks if(!CONFIG_GET(flag/sql_enabled)) diff --git a/code/modules/discord/toggle_notify.dm b/code/modules/discord/toggle_notify.dm index b33c18d950c..462424e0dc0 100644 --- a/code/modules/discord/toggle_notify.dm +++ b/code/modules/discord/toggle_notify.dm @@ -1,8 +1,5 @@ // Verb to toggle restart notifications -/client/verb/notify_restart() - set category = "OOC" - set name = "Notify Restart" - set desc = "Notifies you on Discord when the server restarts." +GAME_VERB_DESC(/client, notify_restart, "Notify Restart", "Notifies you on Discord when the server restarts.", "OOC") // Safety checks if(!CONFIG_GET(flag/sql_enabled)) diff --git a/code/modules/escape_menu/escape_menu.dm b/code/modules/escape_menu/escape_menu.dm index f1a24d24901..947c214c733 100644 --- a/code/modules/escape_menu/escape_menu.dm +++ b/code/modules/escape_menu/escape_menu.dm @@ -2,10 +2,7 @@ GLOBAL_LIST_EMPTY(escape_menus) /// Opens the escape menu. /// Verb, hardcoded to Escape, set in the client skin. -/client/verb/open_escape_menu() - set name = "Open Escape Menu" - set hidden = TRUE - +GAME_VERB_HIDDEN(/client, open_escape_menu, "Open Escape Menu") var/current_escape_menu = GLOB.escape_menus[ckey] if (!isnull(current_escape_menu)) qdel(current_escape_menu) diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index 3f75e531d5b..9440baffdde 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -145,9 +145,8 @@ . = ..() icon_state = panel_open ? "[base_icon_state]_open" : base_icon_state -/obj/machinery/gibber/verb/eject() - set name = "Empty gibber" - set src in oview(1) +GAME_VERB_SRC(/obj/machinery/gibber, eject, oview(1), "Empty gibber", null) + if (usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) return if(!usr.can_perform_action(src)) diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index 6b0d997d228..5abbd12a0be 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -198,9 +198,8 @@ processing = FALSE visible_message(span_notice("\The [src] finishes processing.")) -/obj/machinery/processor/verb/eject() - set name = "Eject Contents" - set src in oview(1) +GAME_VERB_SRC(/obj/machinery/processor, eject, oview(1), "Eject Contents", null) + if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) return if(!usr.can_perform_action(src)) diff --git a/code/modules/interview/interview.dm b/code/modules/interview/interview.dm index d2620274257..3c04604c6e3 100644 --- a/code/modules/interview/interview.dm +++ b/code/modules/interview/interview.dm @@ -91,9 +91,7 @@ /** * Verb for opening the existing interview, or if relevant creating a new interview if possible. */ -/mob/dead/new_player/proc/open_interview() - set name = "Open Interview" - set category = "Interview" +GAME_VERB_PROC(/mob/dead/new_player, open_interview, "Open Interview", "Interview") var/mob/dead/new_player/M = usr if (M?.client?.interviewee) var/datum/interview/I = GLOB.interviews.interview_for_client(M.client) diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index ce4c1b4d3a7..b72e8af905d 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -1,8 +1,6 @@ // Clients aren't datums so we have to define these procs indpendently. // These verbs are called for all key press and release events -/client/verb/keyDown(_key as text, mousepos_x as num, mousepos_y as num, sizex as num, sizey as num) - set instant = TRUE - set hidden = TRUE +GAME_VERB_HIDDEN_INSTANT(/client, keyDown, "keyDown", _key as text, mousepos_x as num, mousepos_y as num, sizex as num, sizey as num) client_keysend_amount += 1 @@ -82,9 +80,7 @@ mob.focus?.key_down(_key, src, full_key) mob.update_mouse_pointer() -/client/verb/keyUp(_key as text, mousepos_x as num, mousepos_y as num, sizex as num, sizey as num) - set instant = TRUE - set hidden = TRUE +GAME_VERB_HIDDEN_INSTANT(/client, keyUp, "keyUp", _key as text, mousepos_x as num, mousepos_y as num, sizex as num, sizey as num) var/key_combo = key_combos_held[_key] if(key_combo) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 8bffeaed85c..c064b755fd3 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -22,7 +22,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) prepare_huds() if(length(CONFIG_GET(keyed_list/cross_server))) - add_verb(src, /mob/dead/proc/server_hop) + ASSIGN_GAME_VERB(src, /mob/dead, server_hop) set_focus(src) become_hearing_sensitive() log_mob_tag("TAG: [tag] CREATED: [key_name(src)] \[[src.type]\]") @@ -33,10 +33,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) #define SERVER_HOPPER_TRAIT "server_hopper" -/mob/dead/proc/server_hop() - set category = "OOC" - set name = "Server Hop" - set desc= "Jump to the other server" +GAME_VERB_PROC_DESC(/mob/dead, server_hop, "Server Hop", "Jump to the other server", "OOC") if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) // in case the round is ending and a cinematic is already playing we don't wanna clash with that (yes i know) return var/list/our_id = CONFIG_GET(string/cross_comms_name) @@ -44,7 +41,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) var/pick switch(length(csa)) if(0) - remove_verb(src, /mob/dead/proc/server_hop) + UNASSIGN_GAME_VERB(src, /mob/dead, server_hop) to_chat(src, span_notice("Server Hop has been disabled.")) if(1) pick = csa[1] diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 7e038a23688..69f3edd141d 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -34,7 +34,7 @@ . = ..() GLOB.new_player_list += src - add_verb(src, /mob/dead/new_player/proc/reset_menu_hud) + ASSIGN_GAME_VERB(src, /mob/dead/new_player, reset_menu_hud) /mob/dead/new_player/Destroy() GLOB.new_player_list -= src @@ -356,13 +356,11 @@ I.ui_interact(src) // Add verb for re-opening the interview panel, fixing chat and re-init the verbs for the stat panel - add_verb(src, /mob/dead/new_player/proc/open_interview) + ASSIGN_GAME_VERB(src, /mob/dead/new_player, open_interview) add_verb(client, /client/verb/fix_tgui_panel) ///Resets the Lobby Menu HUD, recreating and reassigning it to the new player -/mob/dead/new_player/proc/reset_menu_hud() - set name = "Reset Lobby Menu HUD" - set category = "OOC" +GAME_VERB_PROC(/mob/dead/new_player, reset_menu_hud, "Reset Lobby Menu HUD", "OOC") var/mob/dead/new_player/new_player = usr if(!COOLDOWN_FINISHED(new_player, reset_hud_cooldown)) to_chat(new_player, span_warning("You must wait [DisplayTimeText(COOLDOWN_TIMELEFT(new_player, reset_hud_cooldown))] before resetting the Lobby Menu HUD again!")) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index cde8790ee63..edeab5334bd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -306,10 +306,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) /* This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. */ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." +GAME_VERB_DESC(/mob/living, ghost, "Ghost", "Relinquish your life and enter the land of the dead.", "OOC") if(stat != CONSCIOUS && stat != DEAD) succumb() @@ -323,10 +320,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghostize(FALSE) // FALSE parameter is so we can never re-enter our body. U ded. return TRUE -/mob/eye/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." +GAME_VERB_DESC(/mob/eye, ghost, "Ghost", "Relinquish your life and enter the land of the dead.", "OOC") var/response = tgui_alert(usr, "Are you sure you want to ghost? If you ghost whilst still alive you cannot re-enter your body!", "Confirm Ghost Observe", list("Ghost", "Stay in Body")) if(response != "Ghost") @@ -368,8 +362,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(new_area != ambience_tracked_area) update_ambience_area(new_area) -/mob/dead/observer/verb/reenter_corpse() - set name = "Re-enter Corpse" +GAME_VERB(/mob/dead/observer, reenter_corpse, "Re-enter Corpse", null) if(!client) return @@ -390,8 +383,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp mind.current.client.init_verbs() return TRUE -/mob/dead/observer/verb/do_not_resuscitate() - set name = "Do Not Resuscitate" +GAME_VERB(/mob/dead/observer, do_not_resuscitate, "Do Not Resuscitate", null) if(!can_reenter_corpse) to_chat(usr, span_warning("You're already stuck out of your body!")) @@ -445,8 +437,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(sound) SEND_SOUND(src, sound(sound)) -/mob/dead/observer/verb/dead_tele() - set name = "Teleport" +GAME_VERB(/mob/dead/observer, dead_tele, "Teleport", null) if(!isobserver(usr)) to_chat(usr, span_warning("Not when you're not dead!")) @@ -473,13 +464,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr.abstract_move(pick(L)) -/mob/dead/observer/verb/follow() - set name = "Orbit" +GAME_VERB(/mob/dead/observer, follow, "Orbit", null) GLOB.orbit_menu.show(src) -/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set name = "Jump to Mob" +GAME_VERB(/mob/dead/observer, jumptomob, "Jump to Mob", null) //Moves the ghost instead of just changing the ghosts's eye -Nodrak if(!isobserver(usr)) //Make sure they're an observer! return @@ -507,8 +496,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(source_mob, span_danger("This mob is not located in the game world.")) -/mob/dead/observer/verb/change_view_range() - set name = "View Range" +GAME_VERB(/mob/dead/observer, change_view_range, "View Range", null) if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) to_chat(usr, span_notice("That verb is currently globally disabled.")) @@ -525,15 +513,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else client.view_size.resetToDefault() -/mob/dead/observer/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" +GAME_VERB(/mob/dead/observer, toggle_ghostsee, "Toggle Ghost Vision", null) toggle_ghost_hud_flag(GHOST_VISION) update_sight() to_chat(usr, span_boldnotice("You [(ghost_hud_flags & GHOST_VISION) ? "now" : "no longer"] have ghost vision.")) -/mob/dead/observer/verb/toggle_darkness() - set name = "Toggle Darkness" +GAME_VERB(/mob/dead/observer, toggle_darkness, "Toggle Darkness", null) switch(lighting_cutoff) if (LIGHTING_CUTOFF_VISIBLE) @@ -547,13 +533,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp update_sight() -/mob/dead/observer/verb/view_manifest() - set name = "View Crew Manifest" +GAME_VERB(/mob/dead/observer, view_manifest, "View Crew Manifest", null) GLOB.manifest.ui_interact(src) -/mob/dead/observer/verb/observe() - set name = "Observe" +GAME_VERB(/mob/dead/observer, observe, "Observe", null) if(!isobserver(usr) || HAS_TRAIT(src, TRAIT_NO_OBSERVE)) //Make sure they're an observer! return @@ -582,8 +566,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp do_observe(chosen_target) -/mob/dead/observer/verb/tray_view() - set name = "T-ray scan" +GAME_VERB(/mob/dead/observer, tray_view, "T-ray scan", null) if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) to_chat(usr, span_notice("That verb is currently globally disabled.")) @@ -591,8 +574,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp t_ray_scan(src) -/mob/dead/observer/verb/toggle_data_huds() - set name = "Toggle Sec/Med/Diag HUD" +GAME_VERB(/mob/dead/observer, toggle_data_huds, "Toggle Sec/Med/Diag HUD", null) toggle_ghost_hud_flag(GHOST_DATA_HUDS) if(ghost_hud_flags & GHOST_DATA_HUDS) @@ -600,8 +582,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(src, span_notice("Data HUDs disabled.")) -/mob/dead/observer/verb/toggle_health_scan() - set name = "Toggle Health Scan" +GAME_VERB(/mob/dead/observer, toggle_health_scan, "Toggle Health Scan", null) toggle_ghost_hud_flag(GHOST_HEALTH) if(ghost_hud_flags & GHOST_HEALTH) @@ -609,8 +590,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(src, span_notice("Health scan disabled.")) -/mob/dead/observer/verb/toggle_chem_scan() - set name = "Toggle Chem Scan" +GAME_VERB(/mob/dead/observer, toggle_chem_scan, "Toggle Chem Scan", null) toggle_ghost_hud_flag(GHOST_CHEM) if(ghost_hud_flags & GHOST_CHEM) @@ -618,8 +598,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(src, span_notice("Chem scan disabled.")) -/mob/dead/observer/verb/toggle_gas_scan() - set name = "Toggle Gas Scan" +GAME_VERB(/mob/dead/observer, toggle_gas_scan, "Toggle Gas Scan", null) toggle_ghost_hud_flag(GHOST_GAS) if(ghost_hud_flags & GHOST_GAS) @@ -627,8 +606,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(src, span_notice("Gas scan disabled.")) -/mob/dead/observer/verb/restore_ghost_appearance() - set name = "Restore Ghost Character" +GAME_VERB(/mob/dead/observer, restore_ghost_appearance, "Restore Ghost Character", null) set_ghost_appearance() if(client?.prefs) @@ -688,9 +666,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!isnull(client) && !isnull(client.eye)) reset_perspective(null) -/mob/dead/observer/verb/add_view_range(input as num) - set name = "Add View Range" - set hidden = TRUE +GAME_VERB_HIDDEN(/mob/dead/observer, add_view_range, "Add View Range", input as num) if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) to_chat(usr, span_notice("That verb is currently globally disabled.")) @@ -989,15 +965,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(G, message) GLOB.observer_default_invisibility = amount -/mob/dead/observer/proc/open_spawners_menu() - set name = "Spawners Menu" +GAME_VERB_PROC(/mob/dead/observer, open_spawners_menu, "Spawners Menu", null) if(!spawners_menu) spawners_menu = new(src) spawners_menu.ui_interact(src) -/mob/dead/observer/proc/open_minigames_menu() - set name = "Minigames Menu" +GAME_VERB_PROC(/mob/dead/observer, open_minigames_menu, "Minigames Menu", null) if(!client) return if(!isobserver(src)) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 5fd9172e160..d61dcd47c5e 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -644,9 +644,7 @@ qdel(item) return FALSE -/mob/verb/quick_equip() - set name = "quick-equip" - set hidden = TRUE +GAME_VERB_HIDDEN(/mob, quick_equip, "quick-equip") DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_quick_equip))) diff --git a/code/modules/mob/living/basic/drone/verbs.dm b/code/modules/mob/living/basic/drone/verbs.dm index a66d17048fd..e5a941d0a92 100644 --- a/code/modules/mob/living/basic/drone/verbs.dm +++ b/code/modules/mob/living/basic/drone/verbs.dm @@ -3,9 +3,7 @@ * * See [/mob/living/basic/drone/var/laws] */ -/mob/living/basic/drone/verb/check_laws() - set category = "Drone" - set name = "Check Laws" +GAME_VERB(/mob/living/basic/drone, check_laws, "Check Laws", "Drone") to_chat(src, "Drone Laws") to_chat(src, laws) @@ -21,9 +19,7 @@ * * Attaches area name to message */ -/mob/living/basic/drone/verb/drone_ping() - set category = "Drone" - set name = "Drone ping" +GAME_VERB(/mob/living/basic/drone, drone_ping, "Drone ping", "Drone") var/alert_s = input(src,"Alert severity level","Drone ping",null) as null|anything in list("Low","Medium","High","Critical") diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 00adadd33fd..09bcf02737e 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -259,12 +259,7 @@ /obj/item/mmi/proc/replacement_ai_name() return brainmob.name -/obj/item/mmi/verb/Toggle_Listening() - set name = "Toggle Listening" - set desc = "Toggle listening channel on or off." - set category = "MMI" - set src = usr.loc - set popup_menu = FALSE +GAME_VERB_SRC_DESC(/obj/item/mmi, Toggle_Listening, usr.loc, "Toggle Listening", "Toggle listening channel on or off.", "MMI") if(brainmob.stat) to_chat(brainmob, span_warning("Can't do that while incapacitated or dead!")) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index a524b6c91b6..3de9f365c95 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -43,7 +43,7 @@ ) /mob/living/carbon/alien/Initialize(mapload) - add_verb(src, /mob/living/proc/mob_sleep) + ASSIGN_GAME_VERB(src, /mob/living, mob_sleep) add_verb(src, /mob/living/proc/toggle_resting) create_bodyparts() //initialize bodyparts diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bfebd95c028..d624f0b0090 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human/Initialize(mapload) - add_verb(src, /mob/living/proc/mob_sleep) + ASSIGN_GAME_VERB(src, /mob/living, mob_sleep) add_verb(src, /mob/living/proc/toggle_resting) icon_state = "" //Remove the inherent human icon that is visible on the map editor. We're rendering ourselves limb by limb, having it still be there results in a bug where the basic human icon appears below as south in all directions and generally looks nasty. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ad9ebb59068..eaf193e7b06 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -515,9 +515,7 @@ //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm -/mob/living/verb/pulled(atom/movable/thing_pulled as mob|obj in oview(1)) - set name = "Pull" - +GAME_VERB(/mob/living, pulled, "Pull", null, atom/movable/thing_pulled as mob|obj in oview(1)) if(istype(thing_pulled) && Adjacent(thing_pulled)) start_pulling(thing_pulled) @@ -541,8 +539,7 @@ log_message("points at [pointing_at]", LOG_EMOTE) visible_message(span_infoplain("[span_name("[src]")] points at [pointing_at]."), span_notice("You point at [pointing_at].")) -/mob/living/verb/succumb(whispered as num|null) - set hidden = TRUE +GAME_VERB_HIDDEN(/mob/living, succumb, "succumb", whispered as num|null) if (!CAN_SUCCUMB(src)) if(HAS_TRAIT(src, TRAIT_SUCCUMB_OVERRIDE)) if(whispered) @@ -600,9 +597,7 @@ // MOB PROCS //END -/mob/living/proc/mob_sleep() - set name = "Sleep" - set hidden = TRUE +GAME_VERB_PROC(/mob/living, mob_sleep, "Sleep", null) if(IsSleeping()) to_chat(src, span_warning("You are already sleeping!")) diff --git a/code/modules/mob/living/navigation.dm b/code/modules/mob/living/navigation.dm index c63b4594b65..7d0ef67d107 100644 --- a/code/modules/mob/living/navigation.dm +++ b/code/modules/mob/living/navigation.dm @@ -8,9 +8,7 @@ /// Images of the path created by navigate(). var/list/navigation_images = list() -/mob/living/verb/navigate() - set name = "Navigate" - set hidden = TRUE +GAME_VERB_HIDDEN(/mob/living, navigate, "Navigate") if(incapacitated) return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0689c2c59e5..7b630865df9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -60,7 +60,7 @@ spark_system = new /datum/effect_system/basic/spark_spread(src, 5, FALSE) spark_system.attach(src) - add_verb(src, /mob/living/silicon/ai/proc/show_laws_verb) + ASSIGN_GAME_VERB(src, /mob/living/silicon/ai, show_laws_verb) aiMulti = new(src) aicamera = new/obj/item/camera/siliconcam/ai_camera(src) @@ -68,13 +68,11 @@ deploy_action.Grant(src) if(isturf(loc)) - add_verb(src, list( - /mob/living/silicon/ai/proc/ai_network_change, - /mob/living/silicon/ai/proc/ai_hologram_change, - /mob/living/silicon/ai/proc/botcall, - /mob/living/silicon/ai/proc/control_integrated_radio, - /mob/living/silicon/ai/proc/set_automatic_say_channel, - )) + ASSIGN_GAME_VERB(src, /mob/living/silicon/ai, ai_network_change) + ASSIGN_GAME_VERB(src, /mob/living/silicon/ai, ai_hologram_change) + ASSIGN_GAME_VERB(src, /mob/living/silicon/ai, botcall) + ASSIGN_GAME_VERB(src, /mob/living/silicon/ai, control_integrated_radio) + ASSIGN_GAME_VERB(src, /mob/living/silicon/ai, set_automatic_say_channel) GLOB.ai_list += src GLOB.shuttle_caller_list += src @@ -224,10 +222,7 @@ ai_display.emotion = emote ai_display.update() -/mob/living/silicon/ai/verb/pick_icon() - set category = "AI Commands" - set name = "Set AI Core Display" - set desc = "Choose what appears on your AI core display" +GAME_VERB_DESC(/mob/living/silicon/ai, pick_icon, "Set AI Core Display", "Choose what appears on your AI core display", "AI Commands") if(incapacitated) to_chat(src, span_warning("You cannot access the core display controls in your current state.")) @@ -241,10 +236,7 @@ var/obj/item/aicard/card = loc card.update_appearance() -/mob/living/silicon/ai/verb/pick_status_display() - set category = "AI Commands" - set name = "Set AI Status Display" - set desc = "Choose what appears on status displays around the station" +GAME_VERB_DESC(/mob/living/silicon/ai, pick_status_display, "Set AI Status Display", "Choose what appears on status displays around the station", "AI Commands") if(incapacitated) to_chat(src, span_warning("You cannot access the status display controls in your current state.")) @@ -335,9 +327,7 @@ /mob/living/silicon/ai/cancel_camera() view_core() -/mob/living/silicon/ai/verb/ai_camera_track() - set name = "track" - set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass +GAME_VERB_HIDDEN(/mob/living/silicon/ai, ai_camera_track, "track") //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass ai_tracking_tool.track_input(src) @@ -355,9 +345,7 @@ if(eyeobj) eyeobj.glide_size = new_glide_size -/mob/living/silicon/ai/verb/toggle_anchor() - set category = "AI Commands" - set name = "Toggle Floor Bolts" +GAME_VERB(/mob/living/silicon/ai, toggle_anchor, "Toggle Floor Bolts", "AI Commands") if(!isturf(loc)) // if their location isn't a turf return // stop if(stat == DEAD) @@ -517,10 +505,7 @@ eyeobj.setLoc(get_turf(C)) return TRUE -/mob/living/silicon/ai/proc/botcall() - set category = "AI Commands" - set name = "Access Robot Control" - set desc = "Wirelessly control various automatic robots." +GAME_VERB_PROC_DESC(/mob/living/silicon/ai, botcall, "Access Robot Control", "Wirelessly control various automatic robots.", "AI Commands") if(!robot_control) robot_control = new(src) @@ -574,9 +559,7 @@ //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead //Addition by Mord_Sith to define AI's network change ability -/mob/living/silicon/ai/proc/ai_network_change() - set category = "AI Commands" - set name = "Jump To Network" +GAME_VERB_PROC(/mob/living/silicon/ai, ai_network_change, "Jump To Network", "AI Commands") ai_tracking_tool.reset_tracking() var/cameralist[0] @@ -617,10 +600,7 @@ //End of code by Mord_Sith //I am the icon meister. Bow fefore me. //>fefore -/mob/living/silicon/ai/proc/ai_hologram_change() - set name = "Change Hologram" - set desc = "Change the default hologram available to AI to something else." - set category = "AI Commands" +GAME_VERB_PROC_DESC(/mob/living/silicon/ai, ai_hologram_change, "Change Hologram", "Change the default hologram available to AI to something else.", "AI Commands") if(incapacitated) return @@ -764,10 +744,7 @@ C.Togglelight(1) lit_cameras |= C -/mob/living/silicon/ai/proc/control_integrated_radio() - set name = "Transceiver Settings" - set desc = "Allows you to change settings of your radio." - set category = "AI Commands" +GAME_VERB_PROC_DESC(/mob/living/silicon/ai, control_integrated_radio, "Transceiver Settings", "Allows you to change settings of your radio.", "AI Commands") if(incapacitated) return @@ -780,10 +757,7 @@ if(radio) radio.make_syndie() -/mob/living/silicon/ai/proc/set_automatic_say_channel() - set name = "Set Auto Announce Mode" - set desc = "Modify the default radio setting for your automatic announcements." - set category = "AI Commands" +GAME_VERB_PROC_DESC(/mob/living/silicon/ai, set_automatic_say_channel, "Set Auto Announce Mode", "Modify the default radio setting for your automatic announcements.", "AI Commands") if(incapacitated) return @@ -981,10 +955,7 @@ playsound(get_turf(src), 'sound/machines/ding.ogg', 50, TRUE, ignore_walls = FALSE) to_chat(src, "Hack complete. [apc] is now under your exclusive control.") -/mob/living/silicon/ai/verb/deploy_to_shell() - set category = "AI Commands" - set desc = "Transfer to an available remote body." - set name = "Deploy to Shell" +GAME_VERB_DESC(/mob/living/silicon/ai, deploy_to_shell, "Deploy to Shell", "Transfer to an available remote body.", "AI Commands") select_shell() diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index 7895dd65882..a2864ca7cd4 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -68,11 +68,7 @@ // Make sure that the code compiles with AI_VOX undefined #ifdef AI_VOX #define VOX_DELAY 600 -/mob/living/silicon/ai/verb/announcement_help() - - set name = "Announcement Help" - set desc = "Display a list of vocal words to announce to the crew." - set category = "AI Commands" +GAME_VERB_DESC(/mob/living/silicon/ai, announcement_help, "Announcement Help", "Display a list of vocal words to announce to the crew.", "AI Commands") if(incapacitated) return diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index d329b62f39f..0014c57959a 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -211,9 +211,7 @@ else eyeobj.RemoveInvisibility(type) -/mob/living/silicon/ai/verb/toggle_acceleration() - set category = "AI Commands" - set name = "Toggle Camera Acceleration" +GAME_VERB(/mob/living/silicon/ai, toggle_acceleration, "Toggle Camera Acceleration", "AI Commands") if(incapacitated) return diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index 2d21fd260dc..97d855d6bb9 100644 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -1,9 +1,5 @@ -/mob/living/silicon/ai/proc/show_laws_verb() - set category = "AI Commands" - set name = "Show Laws" - set desc = "Check what your laws are privately. \ - Also ensures all synced cyborgs are up to date with your laws, reminds them of your laws." +GAME_VERB_PROC_DESC(/mob/living/silicon/ai, show_laws_verb, "Show Laws", "Check what your laws are privately. Also ensures all synced cyborgs are up to date with your laws, reminds them of your laws.", "AI Commands") if(usr.stat == DEAD) return //won't work if dead src.show_laws() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 09208558022..434275a1333 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -199,9 +199,7 @@ /** * Some kind of debug verb that gives atmosphere environment details */ -/mob/proc/Cell() - set category = "Admin" - set hidden = TRUE +GAME_VERB_PROC(/mob, Cell, "Cell", "Admin") if(!loc) return @@ -545,8 +543,7 @@ * [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716) * for why this isn't atom/verb/examine() */ -/mob/verb/examinate(atom/examinify as mob|obj|turf in view()) //It used to be oview(12), but I can't really say why - set name = "Examine" +GAME_VERB(/mob, examinate, "Examine", null, atom/examinify as mob|obj|turf in view()) //It used to be oview(12), but I can't really say why DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(run_examinate), examinify)) @@ -808,9 +805,7 @@ * * Only works if flag/allow_respawn is allowed in config */ -/mob/verb/abandon_mob() - set name = "Respawn" - set category = "OOC" +GAME_VERB(/mob, abandon_mob, "Respawn", "OOC") switch(CONFIG_GET(flag/allow_respawn)) if(RESPAWN_FLAG_NEW_CHARACTER) @@ -876,31 +871,21 @@ /** * Sometimes helps if the user is stuck in another perspective or camera */ -/mob/verb/cancel_camera() - set name = "Cancel Camera View" - set category = "OOC" +GAME_VERB(/mob, cancel_camera, "Cancel Camera View", "OOC") reset_perspective(null) /** * Helpful for when a players uplink window gets glitched to above their screen. * preventing them from moving the UPLINK window. */ -/mob/verb/reset_ui_positions_for_mob() - set name = "Reset UI Positions" - set category = "OOC" +GAME_VERB(/mob, reset_ui_positions_for_mob, "Reset UI Positions", "OOC") SStgui.reset_ui_position(src) //suppress the .click/dblclick macros so people can't use them to identify the location of items or aimbot -/mob/verb/DisClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num) - set name = ".click" - set hidden = TRUE - set category = null +GAME_VERB_HIDDEN(/mob, DisClick, ".click", argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num) return -/mob/verb/DisDblClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num) - set name = ".dblclick" - set hidden = TRUE - set category = null +GAME_VERB_HIDDEN(/mob, DisDblClick, ".dblclick", argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num) return /// Adds this list to the output to the stat browser diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 93c9dce974e..9a0d3db4c33 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -3,8 +3,7 @@ * * This is a hidden verb, likely for binding with winset for hotkeys */ -/client/verb/drop_item() - set hidden = TRUE +GAME_VERB_HIDDEN(/client, drop_item, "drop item") if(!iscyborg(mob) && mob.stat == CONSCIOUS) mob.dropItemToGround(mob.get_active_held_item()) return @@ -403,9 +402,7 @@ */ ///Hidden verb to cycle through head zone with repeated presses, head - eyes - mouth. Bound to 8 -/client/verb/body_toggle_head() - set name = "body-toggle-head" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_toggle_head, "body-toggle-head") if(!check_has_body_select()) return @@ -423,9 +420,7 @@ selector.set_selected_zone(next_in_line, mob) ///Hidden verb to target the head, unbound by default. -/client/verb/body_head() - set name = "body-head" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_head, "body-head") if(!check_has_body_select()) return @@ -434,9 +429,7 @@ selector.set_selected_zone(BODY_ZONE_HEAD, mob) ///Hidden verb to target the eyes, bound to 7 -/client/verb/body_eyes() - set name = "body-eyes" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_eyes, "body-eyes") if(!check_has_body_select()) return @@ -445,9 +438,7 @@ selector.set_selected_zone(BODY_ZONE_PRECISE_EYES, mob) ///Hidden verb to target the mouth, bound to 9 -/client/verb/body_mouth() - set name = "body-mouth" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_mouth, "body-mouth") if(!check_has_body_select()) return @@ -456,9 +447,7 @@ selector.set_selected_zone(BODY_ZONE_PRECISE_MOUTH, mob) ///Hidden verb to target the right arm, bound to 4 -/client/verb/body_r_arm() - set name = "body-r-arm" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_r_arm, "body-r-arm") if(!check_has_body_select()) return @@ -467,9 +456,7 @@ selector.set_selected_zone(BODY_ZONE_R_ARM, mob) ///Hidden verb to target the chest, bound to 5 -/client/verb/body_chest() - set name = "body-chest" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_chest, "body-chest") if(!check_has_body_select()) return @@ -478,9 +465,7 @@ selector.set_selected_zone(BODY_ZONE_CHEST, mob) ///Hidden verb to target the left arm, bound to 6 -/client/verb/body_l_arm() - set name = "body-l-arm" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_l_arm, "body-l-arm") if(!check_has_body_select()) return @@ -489,9 +474,7 @@ selector.set_selected_zone(BODY_ZONE_L_ARM, mob) ///Hidden verb to target the right leg, bound to 1 -/client/verb/body_r_leg() - set name = "body-r-leg" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_r_leg, "body-r-leg") if(!check_has_body_select()) return @@ -500,9 +483,7 @@ selector.set_selected_zone(BODY_ZONE_R_LEG, mob) ///Hidden verb to target the groin, bound to 2 -/client/verb/body_groin() - set name = "body-groin" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_groin, "body-groin") if(!check_has_body_select()) return @@ -511,9 +492,7 @@ selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) ///Hidden verb to target the left leg, bound to 3 -/client/verb/body_l_leg() - set name = "body-l-leg" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, body_l_leg, "body-l-leg") if(!check_has_body_select()) return @@ -522,10 +501,7 @@ selector.set_selected_zone(BODY_ZONE_L_LEG, mob) ///Verb to toggle the walk or run status -/client/verb/toggle_walk_run() - set name = "toggle-walk-run" - set hidden = TRUE - set instant = TRUE +GAME_VERB_HIDDEN_INSTANT(/client, toggle_walk_run, "toggle-walk-run") if(isliving(mob)) var/mob/living/user_mob = mob user_mob.toggle_move_intent() diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 92931a028f8..9d564daae61 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -1,8 +1,7 @@ //Speech verbs. ///what clients use to speak. when you type a message into the chat bar in say mode, this is the first thing that goes off serverside. -/mob/verb/say_verb(message as text) - set name = VERB_SAY +GAME_VERB(/mob, say_verb, VERB_SAY, null, message as text) if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) @@ -14,8 +13,7 @@ QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/atom/movable, say), message), SSspeech_controller) ///Whisper verb -/mob/verb/whisper_verb(message as text) - set name = VERB_WHISPER +GAME_VERB(/mob, whisper_verb, VERB_WHISPER, null, message as text) if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) @@ -35,8 +33,7 @@ say(message, language = language) ///The me emote verb -/mob/verb/me_verb(message as text) - set name = VERB_ME +GAME_VERB(/mob, me_verb, VERB_ME, null, message as text) if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index d366e6b74ff..6c68da7dcaa 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -70,9 +70,7 @@ else return ..() -/obj/item/modular_computer/laptop/verb/open_computer() - set name = "Toggle Open" - set src in view(1) +GAME_VERB_SRC(/obj/item/modular_computer/laptop, open_computer, view(1), "Toggle Open", null) try_toggle_open(usr) diff --git a/code/modules/pai/debug.dm b/code/modules/pai/debug.dm index 1cc0115c747..0677e10cc7a 100644 --- a/code/modules/pai/debug.dm +++ b/code/modules/pai/debug.dm @@ -1,13 +1,9 @@ -/client/proc/makepAI(turf/target in GLOB.mob_list) - set category = "Admin.Fun" - set name = "Make pAI" - set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" - +ADMIN_VERB(makepAI, R_FUN, "Make pAI", "Specify a location to spawn a pAI device, then specify a key to play that pAI", ADMIN_CATEGORY_FUN, turf/target in GLOB.mob_list) var/list/available = list() for(var/mob/player as anything in GLOB.player_list) if(player.client && player.key) available.Add(player) - var/mob/choice = tgui_input_list(usr, "Choose a player to play the pAI", "Spawn pAI", sort_names(available)) + var/mob/choice = tgui_input_list(user, "Choose a player to play the pAI", "Spawn pAI", sort_names(available)) if(isnull(choice)) return @@ -16,7 +12,7 @@ return if(!isobserver(choice)) - var/confirm = tgui_alert(usr, "[choice.key] isn't ghosting right now. Are you sure you want to yank them out of their body and place them in this pAI?", "Spawn pAI Confirmation", list("Yes", "No")) + var/confirm = tgui_alert(user, "[choice.key] isn't ghosting right now. Are you sure you want to yank them out of their body and place them in this pAI?", "Spawn pAI Confirmation", list("Yes", "No")) if(confirm != "Yes") return var/obj/item/pai_card/card = new(target) @@ -26,8 +22,8 @@ pai.real_name = pai.name pai.PossessByPlayer(choice.key) card.set_personality(pai) - if(SSpai.candidates[key]) - SSpai.candidates -= key + if(SSpai.candidates[user.key]) + SSpai.candidates -= user.key BLACKBOX_LOG_ADMIN_VERB("Make pAI") /** diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 5b2459d3caf..52d024df1b9 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -325,9 +325,7 @@ icon_state = initial(icon_state) return ..() -/obj/item/paper/verb/rename() - set name = "Rename paper" - set src in usr +GAME_VERB_SRC(/obj/item/paper, rename, usr, "Rename paper", null) if(!usr.can_read(src) || usr.is_blind() || INCAPACITATED_IGNORING(usr, INCAPABLE_RESTRAINTS|INCAPABLE_GRAB) || (isobserver(usr) && !isAdminGhostAI(usr))) return diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 1d98d728b29..128d9e236bc 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -114,9 +114,7 @@ + "", "window=photo_showing;size=[scribble ? "480x580" : "480x480"]") onclose(user, "[name]") -/obj/item/photo/verb/rename() - set name = "Rename photo" - set src in usr +GAME_VERB_SRC(/obj/item/photo, rename, usr, "Rename photo", null) var/n_name = tgui_input_text(usr, "What would you like to label the photo?", "Photo Labelling", max_length = MAX_NAME_LEN) //loc.loc check is for making possible renaming photos in clipboards diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm index e8a638cdd33..8e8875b3321 100644 --- a/code/modules/point/point.dm +++ b/code/modules/point/point.dm @@ -106,8 +106,7 @@ * * overridden here and in /mob/dead/observer for different point span classes and sanity checks */ -/mob/verb/pointed(atom/A as mob|obj|turf in view(client.view, src)) - set name = "Point To" +GAME_VERB(/mob, pointed, "Point To", null, atom/A as mob|obj|turf in view(client.view, src)) if(isnull(A) || istype(A, /obj/effect/temp_visual/point) || isarea(A)) return FALSE diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index d3379780261..057f997bd60 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -57,8 +57,7 @@ if(play_click) playsound(src, 'sound/items/weapons/gun/general/ballistic_click.ogg', fire_sound_volume, vary_fire_sound, frequency = click_frequency_to_use) -/obj/item/gun/ballistic/revolver/verb/spin() - set name = "Spin Chamber" +GAME_VERB(/obj/item/gun/ballistic/revolver, spin, "Spin Chamber", null) var/mob/user = usr if(user.stat || !in_range(user, src)) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index c7f332ea817..e62c81a25b1 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -137,9 +137,8 @@ current_range = spray_range to_chat(user, span_notice("You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""].")) -/obj/item/reagent_containers/spray/verb/empty() - set name = "Empty Spray Bottle" - set src in usr +GAME_VERB_SRC(/obj/item/reagent_containers/spray, empty, usr, "Empty Spray Bottle", null) + if(usr.incapacitated) return if (tgui_alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", list("Yes", "No")) != "Yes") diff --git a/code/modules/religion/dreams/dream_projection.dm b/code/modules/religion/dreams/dream_projection.dm index b4a822d6dc8..a08327b3e35 100644 --- a/code/modules/religion/dreams/dream_projection.dm +++ b/code/modules/religion/dreams/dream_projection.dm @@ -168,10 +168,7 @@ return // The IC tab was removed recently as of commenting. This should probably be adjusted. -/mob/eye/imaginary_friend/dream_projection/verb/stop_projection() - set category = "IC" - set name = "Stop Projection" - set desc = "Stop astrally projecting and return to your body." +GAME_VERB_DESC(/mob/eye/imaginary_friend/dream_projection, stop_projection, "Stop Projection", "Stop astrally projecting and return to your body.", "IC") qdel(src) diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index c1e61ccec6c..5cae3328805 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -183,10 +183,7 @@ * * required uiref ref The UI that was closed. */ -/client/verb/uiclose(window_id as text) - // Name the verb, and hide it from the user panel. - set name = "uiclose" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, uiclose, "uiclose", window_id as text) var/mob/user = src?.mob if(!user) return diff --git a/code/modules/tgui_panel/external.dm b/code/modules/tgui_panel/external.dm index ae504fdb0c5..c087f1ab44d 100644 --- a/code/modules/tgui_panel/external.dm +++ b/code/modules/tgui_panel/external.dm @@ -8,9 +8,7 @@ /** * tgui panel / chat troubleshooting verb */ -/client/verb/fix_tgui_panel() - set name = "Fix chat" - set category = "OOC" +GAME_VERB(/client, fix_tgui_panel, "Fix chat", "OOC") var/action log_tgui(src, "Started fixing.", context = "verb/fix_tgui_panel") @@ -33,9 +31,7 @@ // Force show the panel to see if there are any errors winset(src, OUTPUT_SELECTOR_LEGACY_OUTPUT_SELECTOR, "left=output_browser") -/client/verb/refresh_tgui() - set name = "Refresh TGUI" - set category = "OOC" +GAME_VERB(/client, refresh_tgui, "Refresh TGUI", "OOC") for(var/window_id in tgui_windows) var/datum/tgui_window/window = tgui_windows[window_id] diff --git a/interface/interface.dm b/interface/interface.dm index 5f0378d5dd5..2dca6b1f490 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,8 +1,5 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki() - set name = "wiki" - set desc = "Brings you to the Wiki" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, wiki, "wiki") var/wikiurl = CONFIG_GET(string/wikiurl) if(!wikiurl) @@ -21,10 +18,7 @@ output += "?title=Special%3ASearch&profile=default&search=[query]" DIRECT_OUTPUT(src, link(output)) -/client/verb/forum() - set name = "forum" - set desc = "Visit the forum." - set hidden = TRUE +GAME_VERB_HIDDEN(/client, forum, "forum") var/forumurl = CONFIG_GET(string/forumurl) if(!forumurl) @@ -32,10 +26,7 @@ return DIRECT_OUTPUT(src, link(forumurl)) -/client/verb/rules() - set name = "rules" - set desc = "Show Server Rules." - set hidden = TRUE +GAME_VERB_HIDDEN(/client, rules, "rules") var/rulesurl = CONFIG_GET(string/rulesurl) if(!rulesurl) @@ -43,10 +34,7 @@ return DIRECT_OUTPUT(src, link(rulesurl)) -/client/verb/github() - set name = "github" - set desc = "Visit Github" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, github, "github") var/githuburl = CONFIG_GET(string/githuburl) if(!githuburl) @@ -54,10 +42,7 @@ return DIRECT_OUTPUT(src, link(githuburl)) -/client/verb/config() - set name = "config" - set desc = "View the server configuration files." - set hidden = TRUE +GAME_VERB_HIDDEN(/client, config, "config") var/configurl = CONFIG_GET(string/configurl) if(!configurl) @@ -65,9 +50,7 @@ return DIRECT_OUTPUT(src, link(configurl)) -/client/verb/reportissue() - set name = "report-issue" - set desc = "Report an issue" +GAME_VERB_DESC(/client, reportissue, "report-issue", "Report an issue", null) var/githuburl = CONFIG_GET(string/githuburl) if(!githuburl) @@ -109,9 +92,7 @@ DIRECT_OUTPUT(src, link(jointext(concatable, ""))) -/client/verb/changelog() - set name = "Changelog" - set category = "OOC" +GAME_VERB(/client, changelog, "Changelog", "OOC") if(!GLOB.changelog_tgui) GLOB.changelog_tgui = new /datum/changelog() @@ -121,18 +102,14 @@ prefs.lastchangelog = GLOB.changelog_hash prefs.save_preferences() -/client/verb/hotkeys_help() - set name = "Hotkeys Help" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, hotkeys_help, "Hotkeys Help") if(!GLOB.hotkeys_tgui) GLOB.hotkeys_tgui = new /datum/hotkeys_help() GLOB.hotkeys_tgui.ui_interact(mob) -/client/verb/emote_panel() - set name = "Emote Panel" - set hidden = TRUE +GAME_VERB_HIDDEN(/client, emote_panel, "Emote Panel") if(!isliving(mob)) to_chat(mob, span_notice("You can only use this while you're alive!")) diff --git a/tgstation.dme b/tgstation.dme index 0bfd51ca163..101a530db89 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -275,6 +275,7 @@ #include "code\__DEFINES\unit_tests.dm" #include "code\__DEFINES\uplink.dm" #include "code\__DEFINES\vehicles.dm" +#include "code\__DEFINES\verb.dm" #include "code\__DEFINES\verb_manager.dm" #include "code\__DEFINES\visual_helpers.dm" #include "code\__DEFINES\vv.dm" @@ -782,6 +783,7 @@ #include "code\controllers\subsystem\unplanned_ai_idle_controllers.dm" #include "code\controllers\subsystem\unplanned_controllers.dm" #include "code\controllers\subsystem\verb_manager.dm" +#include "code\controllers\subsystem\verbs.dm" #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\wardrobe.dm" @@ -901,6 +903,7 @@ #include "code\datums\stock_market_events.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\verb_callbacks.dm" +#include "code\datums\verb_metadata.dm" #include "code\datums\view.dm" #include "code\datums\visual_data.dm" #include "code\datums\voice_of_god_command.dm" diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh index 0fbb302bc4e..3c3a610dbb8 100755 --- a/tools/ci/check_grep.sh +++ b/tools/ci/check_grep.sh @@ -158,6 +158,13 @@ if $grep '^/[\w/]\S+\(.*(var/|, ?var/.*).*\)' "${code_files[@]}"; then st=1 fi; +part "manual verb definition" +if $grep '\tset\s*(name|desc|category|hidden|popup_menu|instant)\s*=\s*(.*)\s' "${code_files[@]}" -g '!code/__DEFINES/**' -g '!code/__HELPERS/**' -g '!tools/**'; then + echo + echo -e "${RED}ERROR: Found a manual verb attribute set. Use GAME_VERB() or ADMIN_VERB() instead.${NC}" + st=1 +fi; + part "improperly pathed static lists" if $grep -i 'var/list/static/.*' "${code_files[@]}"; then echo