From e6bfb7f449b4d5084e1d30f9e698fb959c30801f Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 6 Jun 2017 21:21:26 -0400 Subject: [PATCH] Refactors datum verbs to be general (#28109) --- code/datums/verbs.dm | 101 +++++++++++++ code/modules/admin/adminmenu.dm | 4 +- code/modules/client/client_procs.dm | 8 +- code/modules/client/preferences_toggles.dm | 76 +++++----- code/world.dm | 2 +- interface/menu.dm | 162 +++++---------------- tgstation.dme | 1 + 7 files changed, 187 insertions(+), 167 deletions(-) create mode 100644 code/datums/verbs.dm diff --git a/code/datums/verbs.dm b/code/datums/verbs.dm new file mode 100644 index 00000000000..2c124d3114b --- /dev/null +++ b/code/datums/verbs.dm @@ -0,0 +1,101 @@ +/datum/verbs + var/name + var/list/children + var/datum/verbs/parent + var/list/verblist + var/abstract = FALSE + +//returns the master list for verbs of a type +/datum/verbs/proc/GetList() + CRASH("Abstract verblist for [type]") + +//modify outlist for each entry in Generate_list +/datum/verbs/proc/HandleVerb(list/outlist, atom/verb/verbpath, ...) + +/datum/verbs/New() + var/mainlist = GetList() + var/ourentry = mainlist[type] + children = list() + verblist = list() + if (ourentry) + if (!islist(ourentry)) //some of our childern already loaded + qdel(src) + CRASH("Verb double load: [type]") + Add_children(ourentry) + + mainlist[type] = src + + Load_verbs(type, typesof("[type]/verb")) + + var/datum/verbs/parent = mainlist[parent_type] + if (!parent) + mainlist[parent_type] = list(src) + else if (islist(parent)) + parent += src + else + parent.Add_children(list(src)) + +/datum/verbs/proc/Set_parent(datum/verbs/_parent) + parent = _parent + if (abstract) + parent.Add_children(children) + var/list/verblistoftypes = list() + for(var/thing in verblist) + LAZYADD(verblistoftypes[verblist[thing]], thing) + + for(var/verbparenttype in verblistoftypes) + parent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype]) + +/datum/verbs/proc/Add_children(list/kids) + if (abstract && parent) + parent.Add_children(kids) + return + + for(var/thing in kids) + var/datum/verbs/item = thing + item.Set_parent(src) + if (!item.abstract) + children += item + +/datum/verbs/proc/Load_verbs(verb_parent_type, list/verbs) + if (abstract && parent) + parent.Load_verbs(verb_parent_type, verbs) + return + + for (var/verbpath in verbs) + verblist[verbpath] = verb_parent_type + +/datum/verbs/proc/Generate_list(...) + . = list() + if (length(children)) + for (var/thing in children) + var/datum/verbs/child = thing + var/list/childlist = child.Generate_list(arglist(args)) + if (childlist) + var/childname = "[child]" + if (childname == "[child.type]") + var/list/tree = splittext(childname, "/") + childname = tree[tree.len] + .[child.type] = "parent=[url_encode(type)];name=[url_encode(childname)]" + . += childlist + + for (var/thing in verblist) + var/atom/verb/verbpath = thing + if (!verbpath) + stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]") + var/list/entry = list() + entry["parent"] = "[type]" + entry["name"] = verbpath.desc + if (copytext(verbpath.name,1,2) == "@") + entry["command"] = copytext(verbpath.name,2) + else + entry["command"] = replacetext(verbpath.name, " ", "-") + + HandleVerb(arglist(list(entry, verbpath) + args)) + .[verbpath] = entry + +/world/proc/LoadVerbs(verb_type) + if(!ispath(verb_type, /datum/verbs) || verb_type == /datum/verbs) + CRASH("Invalid verb_type: [verb_type]") + for (var/typepath in subtypesof(verb_type)) + new typepath() diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm index fc7a57e212b..5a75accde45 100644 --- a/code/modules/admin/adminmenu.dm +++ b/code/modules/admin/adminmenu.dm @@ -1,8 +1,8 @@ -/datum/menu/Admin/Generate_list(client/C) +/datum/verbs/menu/Admin/Generate_list(client/C) if (C.holder) . = ..() -/datum/menu/Admin/verb/playerpanel() +/datum/verbs/menu/Admin/verb/playerpanel() set name = "Player Panel" set desc = "Player Panel" set category = "Admin" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index faf2d0ad6dc..3bf57375f47 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -327,9 +327,9 @@ GLOBAL_LIST(external_rsc_urls) if(!tooltips) tooltips = new /datum/tooltip(src) - var/list/topmenus = GLOB.menulist[/datum/menu] + var/list/topmenus = GLOB.menulist[/datum/verbs/menu] for (var/thing in topmenus) - var/datum/menu/topmenu = thing + var/datum/verbs/menu/topmenu = thing var/topmenuname = "[topmenu]" if (topmenuname == "[topmenu.type]") var/list/tree = splittext(topmenuname, "/") @@ -338,13 +338,13 @@ GLOBAL_LIST(external_rsc_urls) var/list/entries = topmenu.Generate_list(src) for (var/child in entries) winset(src, "[url_encode(child)]", "[entries[child]]") - if (!ispath(child, /datum/menu)) + if (!ispath(child, /datum/verbs/menu)) var/atom/verb/verbpath = child if (copytext(verbpath.name,1,2) != "@") new child(src) for (var/thing in prefs.menuoptions) - var/datum/menu/menuitem = GLOB.menulist[thing] + var/datum/verbs/menu/menuitem = GLOB.menulist[thing] if (menuitem) menuitem.Load_checked(src) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 5ed5980883f..943999aecc9 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -1,10 +1,10 @@ //this works as is to create a single checked item, but has no back end code for toggleing the check yet #define TOGGLE_CHECKBOX(PARENT, CHILD) PARENT/CHILD/abstract = TRUE;PARENT/CHILD/checkbox = CHECKBOX_TOGGLE;PARENT/CHILD/verb/CHILD -//Example usage TOGGLE_CHECKBOX(datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() +//Example usage TOGGLE_CHECKBOX(datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() //override because we don't want to save preferences twice. -/datum/menu/Settings/Set_checked(client/C, verbpath) +/datum/verbs/menu/Settings/Set_checked(client/C, verbpath) if (checkbox == CHECKBOX_GROUP) C.prefs.menuoptions[type] = verbpath else if (checkbox == CHECKBOX_TOGGLE) @@ -12,7 +12,7 @@ C.prefs.menuoptions[type] = !checked winset(C, "[verbpath]", "is-checked = [!checked]") -/datum/menu/Settings/verb/setup_character() +/datum/verbs/menu/Settings/verb/setup_character() set name = "Game Preferences" set category = "Preferences" set desc = "Open Game Preferences Window" @@ -20,10 +20,10 @@ usr.client.prefs.ShowChoices(usr) //toggles -/datum/menu/Settings/Ghost/chatterbox +/datum/verbs/menu/Settings/Ghost/chatterbox name = "Chat Box Spam" -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() set name = "Show/Hide GhostEars" set category = "Preferences" set desc = "See All Speech" @@ -31,10 +31,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_ears)() to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Ghost Ears|[usr.client.prefs.chat_toggles & CHAT_GHOSTEARS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_ears/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTEARS -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)() set name = "Show/Hide GhostSight" set category = "Preferences" set desc = "See All Emotes" @@ -42,10 +42,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_sight)() to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Ghost Sight|[usr.client.prefs.chat_toggles & CHAT_GHOSTSIGHT]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_sight/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTSIGHT -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)() set name = "Show/Hide GhostWhispers" set category = "Preferences" set desc = "See All Whispers" @@ -53,10 +53,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_whispers)() to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"].") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Ghost Whispers|[usr.client.prefs.chat_toggles & CHAT_GHOSTWHISPER]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_whispers/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTWHISPER -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)() set name = "Show/Hide GhostRadio" set category = "Preferences" set desc = "See All Radio Chatter" @@ -64,10 +64,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_radio)() to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO) ? "see radio chatter" : "not see radio chatter"].") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Ghost Radio|[usr.client.prefs.chat_toggles & CHAT_GHOSTRADIO]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //social experiment, increase the generation whenever you copypaste this shamelessly GENERATION 1 -/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_radio/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTRADIO -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)() set name = "Show/Hide GhostPDA" set category = "Preferences" set desc = "See All PDA Messages" @@ -75,14 +75,14 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox, toggle_ghost_pda)() to_chat(usr, "As a ghost, you will now [(usr.client.prefs.chat_toggles & CHAT_GHOSTPDA) ? "see all pda messages in the world" : "only see pda messages from nearby mobs"].") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Ghost PDA|[usr.client.prefs.chat_toggles & CHAT_GHOSTPDA]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/toggle_ghost_pda/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_GHOSTPDA -/datum/menu/Settings/Ghost/chatterbox/Events +/datum/verbs/menu/Settings/Ghost/chatterbox/Events name = "Events" //please be aware that the following two verbs have inverted stat output, so that "Toggle Deathrattle|1" still means you activated it -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle)() set name = "Toggle Deathrattle" set category = "Preferences" set desc = "Death" @@ -90,10 +90,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_deathrattle usr.client.prefs.save_preferences() to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_DEATHRATTLE) ? "no longer" : "now"] get messages when a sentient mob dies.") SSblackbox.add_details("preferences_verb", "Toggle Deathrattle|[!(usr.client.prefs.toggles & DISABLE_DEATHRATTLE)]") //If you are copy-pasting this, maybe you should spend some time reading the comments. -/datum/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_deathrattle/Get_checked(client/C) return !(C.prefs.toggles & DISABLE_DEATHRATTLE) -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalrattle)() set name = "Toggle Arrivalrattle" set category = "Preferences" set desc = "New Player Arrival" @@ -101,10 +101,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost/chatterbox/Events, toggle_arrivalratt to_chat(usr, "You will [(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE) ? "no longer" : "now"] get messages when someone joins the station.") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb", "Toggle Arrivalrattle|[!(usr.client.prefs.toggles & DISABLE_ARRIVALRATTLE)]") //If you are copy-pasting this, maybe you should rethink where your life went so wrong. -/datum/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/chatterbox/Events/toggle_arrivalrattle/Get_checked(client/C) return !(C.prefs.toggles & DISABLE_ARRIVALRATTLE) -TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost, togglemidroundantag)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Ghost, togglemidroundantag)() set name = "Toggle Midround Antagonist" set category = "Preferences" set desc = "Midround Antagonist" @@ -112,10 +112,10 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Ghost, togglemidroundantag)() usr.client.prefs.save_preferences() to_chat(usr, "You will [(usr.client.prefs.toggles & MIDROUND_ANTAG) ? "now" : "no longer"] be considered for midround antagonist positions.") SSblackbox.add_details("preferences_verb","Toggle Midround Antag|[usr.client.prefs.toggles & MIDROUND_ANTAG]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C) +/datum/verbs/menu/Settings/Ghost/togglemidroundantag/Get_checked(client/C) return C.prefs.toggles & MIDROUND_ANTAG -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggletitlemusic)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggletitlemusic)() set name = "Hear/Silence LobbyMusic" set category = "Preferences" set desc = "Hear Music In Lobby" @@ -129,11 +129,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggletitlemusic)() to_chat(usr, "You will no longer hear music in the game lobby.") usr.stop_sound_channel(CHANNEL_LOBBYMUSIC) SSblackbox.add_details("preferences_verb","Toggle Lobby Music|[usr.client.prefs.toggles & SOUND_LOBBY]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C) return C.prefs.toggles & SOUND_LOBBY -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, togglemidis)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)() set name = "Hear/Silence Midis" set category = "Preferences" set desc = "Hear Admin Triggered Sounds (Midis)" @@ -145,11 +145,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, togglemidis)() to_chat(usr, "You will no longer hear sounds uploaded by admins") usr.stop_sound_channel(CHANNEL_ADMIN) SSblackbox.add_details("preferences_verb","Toggle Hearing Midis|[usr.client.prefs.toggles & SOUND_MIDI]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Sound/togglemidis/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C) return C.prefs.toggles & SOUND_MIDI -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_instruments)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_instruments)() set name = "Hear/Silence Instruments" set category = "Preferences" set desc = "Hear In-game Instruments" @@ -160,11 +160,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_instruments)() else to_chat(usr, "You will no longer hear musical instruments.") SSblackbox.add_details("preferences_verb","Toggle Instruments|[usr.client.prefs.toggles & SOUND_INSTRUMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Sound/toggle_instruments/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/toggle_instruments/Get_checked(client/C) return C.prefs.toggles & SOUND_INSTRUMENTS -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, Toggle_Soundscape)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, Toggle_Soundscape)() set name = "Hear/Silence Ambience" set category = "Preferences" set desc = "Hear Ambient Sound Effects" @@ -177,11 +177,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, Toggle_Soundscape)() usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) SSblackbox.add_details("preferences_verb","Toggle Ambience|[usr.client.prefs.toggles & SOUND_AMBIENCE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C) return C.prefs.toggles & SOUND_AMBIENCE -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_ship_ambience)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_ship_ambience)() set name = "Hear/Silence Ship Ambience" set category = "Preferences" set desc = "Hear Ship Ambience Roar" @@ -194,11 +194,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_ship_ambience)() usr << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) usr.client.ambience_playing = 0 SSblackbox.add_details("preferences_verb", "Toggle Ship Ambience|[usr.client.prefs.toggles & SOUND_SHIP_AMBIENCE]") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^) -/datum/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/toggle_ship_ambience/Get_checked(client/C) return C.prefs.toggles & SOUND_SHIP_AMBIENCE -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_announcement_sound)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_announcement_sound)() set name = "Hear/Silence Announcements" set category = "Preferences" set desc = "Hear Announcement Sound" @@ -206,11 +206,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggle_announcement_sound)() to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS) ? "hear announcement sounds" : "no longer hear announcements"].") usr.client.prefs.save_preferences() SSblackbox.add_details("preferences_verb","Toggle Announcement Sound|[usr.client.prefs.toggles & SOUND_ANNOUNCEMENTS]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/toggle_announcement_sound/Get_checked(client/C) return C.prefs.toggles & SOUND_ANNOUNCEMENTS -TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() set name = "Hear/Silence Prayer Sounds" set category = "Preferences" set desc = "Hear Prayer Sounds" @@ -221,11 +221,11 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)() else to_chat(usr, "You will no longer prayer sounds.") SSblackbox.add_details("admin_toggle", "Toggle Prayer Sounds|[usr.client.prefs.toggles & SOUND_PRAYERS]") -/datum/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C) +/datum/verbs/menu/Settings/Sound/toggleprayersounds/Get_checked(client/C) return C.prefs.toggles & SOUND_PRAYERS -/datum/menu/Settings/Sound/verb/stop_client_sounds() +/datum/verbs/menu/Settings/Sound/verb/stop_client_sounds() set name = "Stop Sounds" set category = "Preferences" set desc = "Stop Current Sounds" @@ -233,7 +233,7 @@ TOGGLE_CHECKBOX(/datum/menu/Settings/Sound, toggleprayersounds)() SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -TOGGLE_CHECKBOX(/datum/menu/Settings, listen_ooc)() +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings, listen_ooc)() set name = "Show/Hide OOC" set category = "Preferences" set desc = "Show OOC Chat" @@ -241,7 +241,7 @@ TOGGLE_CHECKBOX(/datum/menu/Settings, listen_ooc)() usr.client.prefs.save_preferences() to_chat(usr, "You will [(usr.client.prefs.chat_toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.") SSblackbox.add_details("preferences_verb","Toggle Seeing OOC|[usr.client.prefs.chat_toggles & CHAT_OOC]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/datum/menu/Settings/listen_ooc/Get_checked(client/C) +/datum/verbs/menu/Settings/listen_ooc/Get_checked(client/C) return C.prefs.chat_toggles & CHAT_OOC diff --git a/code/world.dm b/code/world.dm index 7b81dfd7831..526e4cf7ee4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -33,7 +33,7 @@ load_motd() load_admins() - load_menu() + LoadVerbs(/datum/verbs/menu) if(config.usewhitelist) load_whitelist() LoadBans() diff --git a/interface/menu.dm b/interface/menu.dm index 4bebd5b2023..a2220d529fc 100644 --- a/interface/menu.dm +++ b/interface/menu.dm @@ -1,5 +1,5 @@ /* -/datum/menu/Example/verb/Example() +/datum/verbs/menu/Example/verb/Example() set name = "" //if this starts with @ the verb is not created and name becomes the command to invoke. set desc = "" //desc is the text given to this entry in the menu //You can not use src in these verbs. It will be the menu at compile time, but the client at runtime. @@ -7,126 +7,44 @@ GLOBAL_LIST_EMPTY(menulist) -/world/proc/load_menu() - for (var/typepath in subtypesof(/datum/menu)) - new typepath() - -/datum/menu - var/name - var/list/children - var/datum/menu/myparent - var/list/verblist +/datum/verbs/menu var/checkbox = CHECKBOX_NONE //checkbox type. var/default //default checked type. //Set to true to append our children to our parent, //Rather then add us as a node (used for having more then one checkgroups in the same menu) - var/abstract = FALSE -/datum/menu/New() - var/ourentry = GLOB.menulist[type] - children = list() - verblist = list() - if (ourentry) - if (islist(ourentry)) //some of our childern already loaded - Add_children(ourentry) - else - stack_trace("Menu item double load: [type]") - qdel(src) - return +/datum/verbs/menu/GetList() + return GLOB.menulist - GLOB.menulist[type] = src +/datum/verbs/menu/Generate_list() + . = ..() + for(var/I in .) + .[I] = list2params(.[I]) - Load_verbs(type, typesof("[type]/verb")) +/datum/verbs/menu/HandleVerb(list/entry, verbpath, client/C) + var/datum/verbs/menu/verb_true_parent = GLOB.menulist[verblist[verbpath]] + var/true_checkbox = verb_true_parent.checkbox + if (true_checkbox != CHECKBOX_NONE) + var/checkedverb = verb_true_parent.Get_checked(C) + if (true_checkbox == CHECKBOX_GROUP) + if (verbpath == checkedverb) + entry["is-checked"] = TRUE + else + entry["is-checked"] = FALSE + else if (true_checkbox == CHECKBOX_TOGGLE) + entry["is-checked"] = checkedverb - var/datum/menu/parent = GLOB.menulist[parent_type] - if (!parent) - GLOB.menulist[parent_type] = list(src) - else if (islist(parent)) - parent += src - else - parent.Add_children(list(src)) + entry["command"] = ".updatemenuchecked \"[verb_true_parent.type]\" \"[verbpath]\"\n[entry["command"]]" + entry["can-check"] = TRUE + entry["group"] = "[verb_true_parent.type]" -/datum/menu/proc/Set_parent(datum/menu/parent) - myparent = parent - if (abstract) - myparent.Add_children(children) - var/list/verblistoftypes = list() - for(var/thing in verblist) - LAZYADD(verblistoftypes[verblist[thing]], thing) - - for(var/verbparenttype in verblistoftypes) - myparent.Load_verbs(verbparenttype, verblistoftypes[verbparenttype]) - -/datum/menu/proc/Add_children(list/kids) - if (abstract && myparent) - myparent.Add_children(kids) - return - - for(var/thing in kids) - var/datum/menu/menuitem = thing - menuitem.Set_parent(src) - if (!menuitem.abstract) - children += menuitem - -/datum/menu/proc/Load_verbs(verb_parent_type, list/verbs) - if (abstract && myparent) - myparent.Load_verbs(verb_parent_type, verbs) - return - - for (var/verbpath in verbs) - verblist[verbpath] = verb_parent_type - -/datum/menu/proc/Generate_list(client/C) - . = list() - if (length(children)) - for (var/thing in children) - var/datum/menu/child = thing - var/list/childlist = child.Generate_list(C) - if (childlist) - var/childname = "[child]" - if (childname == "[child.type]") - var/list/tree = splittext(childname, "/") - childname = tree[tree.len] - .[child.type] = "parent=[url_encode(type)];name=[url_encode(childname)]" - . += childlist - - - - for (var/thing in verblist) - var/atom/verb/verbpath = thing - if (!verbpath) - stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]") - var/list/entry = list() - entry["parent"] = "[type]" - entry["name"] = verbpath.desc - if (copytext(verbpath.name,1,2) == "@") - entry["command"] = copytext(verbpath.name,2) - else - entry["command"] = replacetext(verbpath.name, " ", "-") - var/datum/menu/verb_true_parent = GLOB.menulist[verblist[verbpath]] - var/true_checkbox = verb_true_parent.checkbox - if (true_checkbox != CHECKBOX_NONE) - var/checkedverb = verb_true_parent.Get_checked(C) - if (true_checkbox == CHECKBOX_GROUP) - if (verbpath == checkedverb) - entry["is-checked"] = TRUE - else - entry["is-checked"] = FALSE - else if (true_checkbox == CHECKBOX_TOGGLE) - entry["is-checked"] = checkedverb - - entry["command"] = ".updatemenuchecked \"[verb_true_parent.type]\" \"[verbpath]\"\n[entry["command"]]" - entry["can-check"] = TRUE - entry["group"] = "[verb_true_parent.type]" - .[verbpath] = list2params(entry) - -/datum/menu/proc/Get_checked(client/C) +/datum/verbs/menu/proc/Get_checked(client/C) return C.prefs.menuoptions[type] || default || FALSE -/datum/menu/proc/Load_checked(client/C) //Loads the checked menu item into a new client. Used by icon menus to invoke the checked item. +/datum/verbs/menu/proc/Load_checked(client/C) //Loads the checked menu item into a new client. Used by icon menus to invoke the checked item. return -/datum/menu/proc/Set_checked(client/C, verbpath) +/datum/verbs/menu/proc/Set_checked(client/C, verbpath) if (checkbox == CHECKBOX_GROUP) C.prefs.menuoptions[type] = verbpath C.prefs.save_preferences() @@ -142,7 +60,7 @@ GLOBAL_LIST_EMPTY(menulist) verbpath = text2path(verbpath) if (!menutype || !verbpath) return - var/datum/menu/M = GLOB.menulist[menutype] + var/datum/verbs/menu/M = GLOB.menulist[menutype] if (!M) return if (!(verbpath in typesof("[menutype]/verb"))) @@ -150,7 +68,7 @@ GLOBAL_LIST_EMPTY(menulist) M.Set_checked(src, verbpath) -/datum/menu/Icon/Load_checked(client/C) //So we can be lazy, we invoke the "checked" menu item on menu load. +/datum/verbs/menu/Icon/Load_checked(client/C) //So we can be lazy, we invoke the "checked" menu item on menu load. var/atom/verb/verbpath = Get_checked(C) if (!verbpath || !(verbpath in typesof("[type]/verb"))) return @@ -159,45 +77,45 @@ GLOBAL_LIST_EMPTY(menulist) else winset(C, null, "command = [replacetext(verbpath.name, " ", "-")]") -/datum/menu/Icon/Size +/datum/verbs/menu/Icon/Size checkbox = CHECKBOX_GROUP - default = /datum/menu/Icon/Size/verb/iconstretchtofit + default = /datum/verbs/menu/Icon/Size/verb/iconstretchtofit -/datum/menu/Icon/Size/verb/iconstretchtofit() +/datum/verbs/menu/Icon/Size/verb/iconstretchtofit() set name = "@.winset \"mapwindow.map.icon-size=0\"" set desc = "&Auto (stretch-to-fit)" -/datum/menu/Icon/Size/verb/icon96() +/datum/verbs/menu/Icon/Size/verb/icon96() set name = "@.winset \"mapwindow.map.icon-size=96\"" set desc = "&96x96 (3x)" -/datum/menu/Icon/Size/verb/icon64() +/datum/verbs/menu/Icon/Size/verb/icon64() set name = "@.winset \"mapwindow.map.icon-size=64\"" set desc = "&64x64 (2x)" -/datum/menu/Icon/Size/verb/icon48() +/datum/verbs/menu/Icon/Size/verb/icon48() set name = "@.winset \"mapwindow.map.icon-size=48\"" set desc = "&48x48 (1.5x)" -/datum/menu/Icon/Size/verb/icon32() +/datum/verbs/menu/Icon/Size/verb/icon32() set name = "@.winset \"mapwindow.map.icon-size=32\"" set desc = "&32x32 (1x)" -/datum/menu/Icon/Scaling +/datum/verbs/menu/Icon/Scaling checkbox = CHECKBOX_GROUP name = "Scaling Mode" - default = /datum/menu/Icon/Scaling/verb/NN + default = /datum/verbs/menu/Icon/Scaling/verb/NN -/datum/menu/Icon/Scaling/verb/NN() +/datum/verbs/menu/Icon/Scaling/verb/NN() set name = "@.winset \"mapwindow.map.zoom-mode=distort\"" set desc = "Nearest Neighbor" -/datum/menu/Icon/Scaling/verb/PS() +/datum/verbs/menu/Icon/Scaling/verb/PS() set name = "@.winset \"mapwindow.map.zoom-mode=normal\"" set desc = "Point Sampling" -/datum/menu/Icon/Scaling/verb/BL() +/datum/verbs/menu/Icon/Scaling/verb/BL() set name = "@.winset \"mapwindow.map.zoom-mode=blur\"" set desc = "Bilinear" diff --git a/tgstation.dme b/tgstation.dme index 16b18655272..db30de6b1f8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -235,6 +235,7 @@ #include "code\datums\ruins.dm" #include "code\datums\shuttles.dm" #include "code\datums\soullink.dm" +#include "code\datums\verbs.dm" #include "code\datums\antagonists\antag_datum.dm" #include "code\datums\antagonists\datum_clockcult.dm" #include "code\datums\antagonists\datum_cult.dm"