[MIRROR] missing VV options (#11180)

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-07-13 07:41:33 -07:00
committed by GitHub
parent 2655eddc8e
commit 668bc1e4e9
15 changed files with 327 additions and 31 deletions

View File

@@ -114,6 +114,7 @@
// /obj
#define VV_HK_OSAY "osay"
#define VV_HK_FAKE_CONVO "fakepdapropconvo"
#define VV_HK_MASS_DEL_TYPE "mass_delete_type"
// /mob
@@ -135,6 +136,12 @@
#define VV_HK_VIEW_PLANES "view_planes"
#define VV_HK_GIVE_AI "give_ai"
#define VV_HK_GIVE_AI_SPEECH "give_ai_speech"
#define VV_HK_ADDLANGUAGE "addlanguage"
#define VV_HK_REMOVELANGUAGE "remlanguage"
#define VV_HK_ADDVERB "addverb"
#define VV_HK_REMOVEVERB "remverb"
#define VV_HK_ADDORGAN "addorgan"
#define VV_HK_REMOVEORGAN "remorgan"
// /mob/living
#define VV_HK_GIVE_SPEECH_IMPEDIMENT "impede_speech"
@@ -160,8 +167,14 @@
#define VV_HK_PURRBATION "purrbation"
#define VV_HK_APPLY_DNA_INFUSION "apply_dna_infusion"
#define VV_HK_TURN_INTO_MMI "turn_into_mmi"
#define VV_HK_TURN_MONKEY "turn_monkey"
#define VV_HK_TURN_ALIEN "turn_alien"
#define VK_HK_TURN_SKELETON "turn_skeleton"
#define VK_HK_TURN_AI "turn_ai"
#define VK_HK_TURN_ROBOT "turn_robot"
#define VV_HK_WEAKREF_RESOLVE "weakref_resolve"
#define VV_HK_DATUM_REFRESH "datumrefresh"
// Flags for debug_variable() that do little things to what we end up rendering

View File

@@ -41,3 +41,4 @@ var/datum/controller/transfer_controller/transfer_controller
shift_hard_end = calculated_end
shift_last_vote = calculated_end
timerbuffer = calculated_end

View File

@@ -234,7 +234,7 @@ SUBSYSTEM_DEF(media_tracks)
. = ..()
IF_VV_OPTION("add_track")
manual_track_add()
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
IF_VV_OPTION("remove_track")
manual_track_remove()
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"

View File

@@ -350,7 +350,7 @@ GLOBAL_LIST_EMPTY(areas_by_type)
if(!check_rights(R_DEBUG))
return
src.check_static_power(usr)
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
// Debugging proc to report if static power is correct or not.
/area/proc/check_static_power(var/user)

View File

@@ -669,7 +669,7 @@ GLOBAL_LIST_EMPTY(dispenser_presets)
. = ..()
IF_VV_OPTION("admin_add")
admin_add()
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
/obj/machinery/gear_dispenser/proc/admin_add()
if(!check_rights(R_DEBUG|R_FUN))

View File

@@ -456,7 +456,7 @@
. = ..()
IF_VV_OPTION("add_track")
manual_track_add()
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
IF_VV_OPTION("remove_track")
manual_track_remove()
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"

View File

@@ -236,6 +236,7 @@
. = ..()
VV_DROPDOWN_OPTION("", "---")
VV_DROPDOWN_OPTION(VV_HK_MASS_DEL_TYPE, "Delete all of type")
VV_DROPDOWN_OPTION(VV_HK_FAKE_CONVO, "Add Fake Prop Conversation")
//VV_DROPDOWN_OPTION(VV_HK_OSAY, "Object Say")
/obj/vv_do_topic(list/href_list)
@@ -283,3 +284,14 @@
return
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins(span_notice("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) "))
if(href_list[VV_HK_FAKE_CONVO])
if(!check_rights(R_FUN))
return
var/obj/item/pda/P = src
if(!istype(P))
to_chat(usr, span_warning("This can only be done to instances of type /pda"))
return
P.createPropFakeConversation_admin(usr)

View File

@@ -111,7 +111,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
if(issmall(player))
body += span_bold("Monkeyized") + " | "
else
body += "<A href='byond://?_src_=holder;[HrefToken()];monkeyone=\ref[player]'>Monkeyize</A> | "
body += "<A href='byond://?_src_=holder;[HrefToken()];turn_monkey=\ref[player]'>Monkeyize</A> | "
//Corgi
if(iscorgi(player))
@@ -123,9 +123,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_HOLDER, "Show Player Panel", m
if(isAI(player))
body += span_bold("Is an AI ")
else if(ishuman(player))
body += {"<A href='byond://?_src_=holder;[HrefToken()];makeai=\ref[player]'>Make AI</A> |
<A href='byond://?_src_=holder;[HrefToken()];makerobot=\ref[player]'>Make Robot</A> |
<A href='byond://?_src_=holder;[HrefToken()];makealien=\ref[player]'>Make Alien</A>
body += {"<A href='byond://?_src_=holder;[HrefToken()];turn_ai=\ref[player]'>Make AI</A> |
<A href='byond://?_src_=holder;[HrefToken()];turn_robot=\ref[player]'>Make Robot</A> |
<A href='byond://?_src_=holder;[HrefToken()];turn_alien=\ref[player]'>Make Alien</A>
"}
//Simple Animals

View File

@@ -968,10 +968,10 @@
Game() // updates the main game menu
.(href, list("f_secret"=1))
else if(href_list["monkeyone"])
else if(href_list[VV_HK_TURN_MONKEY])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["monkeyone"])
var/mob/living/carbon/human/H = locate(href_list[VV_HK_TURN_MONKEY])
if(!istype(H))
to_chat(usr, span_filter_adminlog("This can only be used on instances of type /mob/living/carbon/human"))
return
@@ -1185,10 +1185,10 @@
else
to_chat(usr, span_filter_adminlog(span_filter_warning("Admin Rejuvinates have been disabled")))
else if(href_list["makeai"])
else if(href_list[VK_HK_TURN_AI])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makeai"])
var/mob/living/carbon/human/H = locate(href_list[VK_HK_TURN_AI])
if(!istype(H))
to_chat(usr, span_filter_adminlog("This can only be used on instances of type /mob/living/carbon/human"))
return
@@ -1197,20 +1197,20 @@
log_admin("[key_name(usr)] AIized [key_name(H)]")
H.AIize()
else if(href_list["makealien"])
else if(href_list[VV_HK_TURN_ALIEN])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makealien"])
var/mob/living/carbon/human/H = locate(href_list[VV_HK_TURN_ALIEN])
if(!istype(H))
to_chat(usr, span_filter_adminlog("This can only be used on instances of type /mob/living/carbon/human"))
return
usr.client.cmd_admin_alienize(H)
else if(href_list["makerobot"])
else if(href_list[VK_HK_TURN_ROBOT])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
var/mob/living/carbon/human/H = locate(href_list[VK_HK_TURN_ROBOT])
if(!istype(H))
to_chat(usr, span_filter_adminlog("This can only be used on instances of type /mob/living/carbon/human"))
return

View File

@@ -151,7 +151,7 @@
vv_update_display(editing, href_list["var_tweak"], istext(new_val) ? uppertext(new_val) : new_val)
//Finally, refresh if something modified the list.
if(href_list["datumrefresh"])
var/datum/DAT = locate(href_list["datumrefresh"])
if(href_list[VV_HK_DATUM_REFRESH])
var/datum/DAT = locate(href_list[VV_HK_DATUM_REFRESH])
if(isdatum(DAT) || istype(DAT, /client) || islist(DAT))
debug_variables(DAT)

View File

@@ -91,7 +91,7 @@
return
if(snapshot)
to_chat(usr, span_warning("Someone (or you) may have started a mass edit on this AI datum already. Refresh the VV window to get the option to end the mass edit instead."))
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
return
snapshot = vars.Copy() //'vars' appears to be special in that vars.Copy produces a flat list of keys with no values. It seems that 'vars[key]' is handled somewhere in the byond engine differently than normal lists.
@@ -133,7 +133,7 @@
VARSET_IN(src, snapshot, null, 2 MINUTES) // Safety
to_chat(usr, span_notice("Variable snapshot saved. Begin editing the datum, and end the mass edit from the dropdown menu within 2 minutes. Note that editing the contents of lists is not supported."))
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
IF_VV_OPTION("mass_edit_finish")
if(!check_rights(R_ADMIN))
@@ -157,7 +157,7 @@
if(!diff.len)
to_chat(usr, span_warning("You don't appear to have changed anything on the AI datum you were editing."))
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
else
var/message = "These differences were detected in your varedit. If you notice any that you didn't change, please redo your edit:<br>"
for(var/key in diff)
@@ -192,7 +192,7 @@
var/choice = tgui_input_list(usr,"Based on your AI holder's mob location, we'll edit mobs on Z [levels_working.Join(",")]. What types do you want to alter?", "Types", choices)
if(!choice)
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
return
var/list/selected = choices[choice]
for(var/mob/living/L as anything in selected)
@@ -209,7 +209,7 @@
to_chat(usr,span_warning("Skipping unavailable var '[newvar]' on: [L] [ADMIN_COORDJMP(L)]"))
to_chat(usr,span_notice("Mass AI edit done."))
href_list["datumrefresh"] = "\ref[src]"
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
/datum/ai_holder/New(var/new_holder)
ASSERT(new_holder)

View File

@@ -63,7 +63,7 @@
Invoked by vv topic "fakepdapropconvo" in code\modules\admin\view_variables\topic.dm found in PDA vv dropdown.
*/
/obj/item/pda/proc/createPropFakeConversation_admin(mob/M)
if(!M.client || !check_rights_for(M.client,R_FUN))
if(!M.client || !check_rights_for(M.client, R_FUN))
return
var/datum/eventkit/fake_pdaconvos/FPC = M.client.fakeConversations

View File

@@ -1890,6 +1890,12 @@
//VV_DROPDOWN_OPTION(VV_HK_MOD_MUTATIONS, "Add/Remove Mutation")
//VV_DROPDOWN_OPTION(VV_HK_MOD_QUIRKS, "Add/Remove Quirks")
VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species")
VV_DROPDOWN_OPTION(VV_HK_TURN_MONKEY, "Make Monkey")
VV_DROPDOWN_OPTION(VV_HK_TURN_ALIEN, "Make Alien")
VV_DROPDOWN_OPTION(VK_HK_TURN_SKELETON, "Make Skeleton")
VV_DROPDOWN_OPTION(VK_HK_TURN_AI, "Make AI")
VV_DROPDOWN_OPTION(VK_HK_TURN_ROBOT, "Make Robot")
//VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation")
//VV_DROPDOWN_OPTION(VV_HK_APPLY_DNA_INFUSION, "Apply DNA Infusion")
//VV_DROPDOWN_OPTION(VV_HK_TURN_INTO_MMI, "Turn into MMI")
@@ -1953,12 +1959,93 @@
if(href_list[VV_HK_SET_SPECIES])
if(!check_rights(R_SPAWN))
return
var/result = tgui_input_list(usr, "Please choose a new species","Species", sortTim(GLOB.all_species, GLOBAL_PROC_REF(cmp_text_asc)))
var/result = tgui_input_list(usr, "Please choose a new species", "Species", sortTim(GLOB.all_species, GLOBAL_PROC_REF(cmp_text_asc)))
if(result)
var/newtype = GLOB.all_species[result]
admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src] to [result]")
set_species(newtype)
if(href_list[VV_HK_TURN_MONKEY])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = src
if(!istype(H))
to_chat(src, "This can only be done to instances of type /mob/living/carbon/human")
return
if(tgui_alert(src, "Confirm mob type change?","Confirm", list("Transform", "Cancel")) != "Transform")
return
if(!H)
to_chat(src, "Mob doesn't exist anymore")
return
log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]")
message_admins(span_blue("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]"), 1)
H.monkeyize()
if(href_list[VV_HK_TURN_ALIEN])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = src
if(!istype(H))
to_chat(src, "This can only be done to instances of type /mob/living/carbon/human")
return
if(tgui_alert(src, "Confirm mob type change?","Confirm",list("Transform", "Cancel")) != "Transform")
return
if(!H)
to_chat(src, "Mob doesn't exist anymore")
return
usr.client.cmd_admin_alienize(H)
if(href_list[VK_HK_TURN_SKELETON])
if(!check_rights(R_FUN))
return
var/mob/living/carbon/human/H = src
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
H.ChangeToSkeleton()
href_list[VV_HK_DATUM_REFRESH] = "\ref[src]"
if(href_list[VK_HK_TURN_AI])
if(!check_rights(R_SPAWN))
return
var/mob/living/carbon/human/H = src
if(!istype(H))
to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human")
return
if(tgui_alert(usr, "Confirm mob type change?", "Confirm", list("Transform", "Cancel")) != "Transform")
return
if(!H)
to_chat(usr, "Mob doesn't exist anymore")
return
message_admins(span_red("Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!"), 1)
log_admin("[key_name(usr)] AIized [key_name(H)]")
H.AIize()
if(href_list[VK_HK_TURN_ROBOT])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = src
if(!istype(H))
to_chat(src, "This can only be done to instances of type /mob/living/carbon/human")
return
if(tgui_alert(src, "Confirm mob type change?", "Confirm", list("Transform", "Cancel")) != "Transform") return
if(!H)
to_chat(src, "Mob doesn't exist anymore")
return
usr.client.cmd_admin_robotize(H)
/*
if(href_list[VV_HK_PURRBATION])
if(!check_rights(R_SPAWN))

View File

@@ -1350,10 +1350,16 @@ GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list)
. = ..()
VV_DROPDOWN_OPTION("", "---------")
VV_DROPDOWN_OPTION(VV_HK_GIB, "Gib")
//VV_DROPDOWN_OPTION(VV_HK_GIVE_AI, "Give AI Controller")
VV_DROPDOWN_OPTION(VV_HK_GIVE_AI, "Give AI Controller")
//VV_DROPDOWN_OPTION(VV_HK_GIVE_AI_SPEECH, "Give Random AI Speech")
VV_DROPDOWN_OPTION(VV_HK_GIVE_SPELL, "Give Spell")
VV_DROPDOWN_OPTION(VV_HK_REMOVE_SPELL, "Remove Spell")
VV_DROPDOWN_OPTION(VV_HK_ADDLANGUAGE, "Add Language")
VV_DROPDOWN_OPTION(VV_HK_REMOVELANGUAGE, "Remove Language")
VV_DROPDOWN_OPTION(VV_HK_ADDVERB, "Add Verb")
VV_DROPDOWN_OPTION(VV_HK_REMOVEVERB, "Remove Verb")
VV_DROPDOWN_OPTION(VV_HK_ADDORGAN, "Add Organ")
VV_DROPDOWN_OPTION(VV_HK_REMOVEORGAN, "Remove Organ")
//VV_DROPDOWN_OPTION(VV_HK_GIVE_MOB_ACTION, "Give Mob Ability")
//VV_DROPDOWN_OPTION(VV_HK_REMOVE_MOB_ACTION, "Remove Mob Ability")
//VV_DROPDOWN_OPTION(VV_HK_GIVE_DISEASE, "Give Disease")
@@ -1393,8 +1399,185 @@ GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list)
return
usr.client.cmd_admin_godmode(src)
//if(href_list[VV_HK_GIVE_AI])
// return SSadmin_verbs.dynamic_invoke_verb(usr, /datum/admin_verb/give_ai_controller, src)
if(href_list[VV_HK_ADDLANGUAGE])
if(!check_rights(R_SPAWN))
return
var/mob/H = src
if(!istype(H))
to_chat(usr, "This can only be done to instances of type /mob")
return
var/new_language = tgui_input_list(usr, "Please choose a language to add.", "Language", GLOB.all_languages)
if(!new_language)
return
if(!H)
to_chat(usr, "Mob doesn't exist anymore")
return
if(H.add_language(new_language))
to_chat(usr, "Added [new_language] to [H].")
return
to_chat(usr, "Mob already knows that language.")
if(href_list[VV_HK_REMOVELANGUAGE])
if(!check_rights(R_SPAWN))
return
var/mob/H = src
if(!istype(H))
to_chat(usr, "This can only be done to instances of type /mob")
return
if(!H.languages.len)
to_chat(usr, "This mob knows no languages.")
return
var/datum/language/rem_language = tgui_input_list(usr, "Please choose a language to remove.", "Language", H.languages)
if(!rem_language)
return
if(!H)
to_chat(usr, "Mob doesn't exist anymore")
return
if(H.remove_language(rem_language.name))
to_chat(usr, "Removed [rem_language] from [H].")
return
to_chat(usr, "Mob doesn't know that language.")
if(href_list[VV_HK_ADDVERB])
if(!check_rights(R_DEBUG))
return
var/mob/H = src
if(!ismob(H))
to_chat(usr, "This can only be done to instances of type /mob")
return
var/list/possibleverbs = list()
possibleverbs += "Cancel" // One for the top...
possibleverbs += typesof(/mob/proc, /mob/verb)
if(isobserver(H))
possibleverbs += typesof(/mob/observer/dead/proc,/mob/observer/dead/verb)
if(isliving(H))
possibleverbs += typesof(/mob/living/proc,/mob/living/verb)
if(ishuman(H))
possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc)
if(isrobot(H))
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb)
if(isAI(H))
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
if(isanimal(H))
possibleverbs += typesof(/mob/living/simple_mob/proc)
possibleverbs -= H.verbs
possibleverbs += "Cancel" // ...And one for the bottom
var/verb = tgui_input_list(usr, "Select a verb!", "Verbs", possibleverbs)
if(!verb || verb == "Cancel")
return
if(!H)
to_chat(usr, "Mob doesn't exist anymore")
return
add_verb(H, verb)
if(href_list[VV_HK_REMOVEVERB])
if(!check_rights(R_DEBUG))
return
var/mob/H = src
if(!istype(H))
to_chat(usr, "This can only be done to instances of type /mob")
return
var/verb = tgui_input_list(usr, "Please choose a verb to remove.", "Verbs", H.verbs)
if(!verb)
return
if(!H)
to_chat(usr, "Mob doesn't exist anymore")
return
remove_verb(H, verb)
if(href_list[VV_HK_ADDORGAN])
if(!check_rights(R_SPAWN))
return
var/mob/living/carbon/M = src
if(!istype(M))
to_chat(usr, "This can only be done to instances of type /mob/living/carbon")
return
var/new_organ = tgui_input_list(usr, "Please choose an organ to add.", "Organ", subtypesof(/obj/item/organ))
if(!new_organ)
return
if(!M)
to_chat(usr, "Mob doesn't exist anymore")
return
if(locate(new_organ) in M.internal_organs)
to_chat(usr, "Mob already has that organ.")
return
new new_organ(M)
if(href_list[VV_HK_REMOVEORGAN])
if(!check_rights(R_SPAWN))
return
var/mob/living/carbon/M = src
if(!istype(M))
to_chat(usr, "This can only be done to instances of type /mob/living/carbon")
return
var/obj/item/organ/rem_organ = tgui_input_list(usr, "Please choose an organ to remove.", "Organ", M.internal_organs)
if(!rem_organ)
return
if(!M)
to_chat(usr, "Mob doesn't exist anymore")
return
if(!(locate(rem_organ) in M.internal_organs))
to_chat(usr, "Mob does not have that organ.")
return
to_chat(usr, "Removed [rem_organ] from [M].")
rem_organ.removed()
qdel(rem_organ)
if(href_list[VV_HK_GIVE_AI])
if(!check_rights(R_HOLDER))
return
var/mob/M = src
if(!isliving(M))
to_chat(src, span_notice("This can only be used on instances of type /mob/living"))
return
var/mob/living/L = M
if(L.client || L.teleop)
to_chat(src, span_warning("This cannot be used on player mobs!"))
return
if(L.ai_holder) //Cleaning up the original ai
var/ai_holder_old = L.ai_holder
L.ai_holder = null
qdel(ai_holder_old) //Only way I could make #TESTING - Unable to be GC'd to stop. del() logs show it works.
L.ai_holder_type = tgui_input_list(usr, "Choose AI holder", "AI Type", typesof(/datum/ai_holder/))
L.initialize_ai_holder()
L.faction = sanitize(tgui_input_text(usr, "Please input AI faction", "AI faction", "neutral"))
L.a_intent = tgui_input_list(usr, "Please choose AI intent", "AI intent", list(I_HURT, I_HELP))
if(tgui_alert(usr, "Make mob wake up? This is needed for carbon mobs.", "Wake mob?", list("Yes", "No")) == "Yes")
L.AdjustSleeping(-100)
//if(href_list[VV_HK_GIVE_AI_SPEECH])
// return SSadmin_verbs.dynamic_invoke_verb(usr, /datum/admin_verb/give_ai_speech, src)

View File

@@ -9,7 +9,7 @@
"scripts": {
"tgui:analyze": "rspack --analyze",
"tgui:build": "rspack build",
"tgui:dev": "bun packages/tgui-dev-server/index.ts",
"tgui:dev": "bun --smol packages/tgui-dev-server/index.ts",
"tgui:lint": "eslint packages --ext .js,.cjs,.ts,.tsx",
"tgui:prettier": "prettier --check .",
"tgui:test": "bun test",