Skip to content

Commit

Permalink
Various VV work and fixes (#19288)
Browse files Browse the repository at this point in the history
Refactored various procs used by VV: Header generation, dropdown menu
generation, moved various things around, some defines.
Fixed VV to be able to edit associative lists.
Fixed VV to be able to make a list ex nihilo on a var.
Removed various dropdown menus that didn't exist anymore and were doing
nothing.
Fixed add verb option to not wipe the already existing verbs of the mob.
Fixed a runtime error on some lists view building that were not handled
correctly.
Fixed an issue with build mode not having the correct permissions for
devs.
Fixed an issue with editing a list referenced by a key in another list
via the edit referenced object option.
Added DF_VAR_EDITED flag.
  • Loading branch information
FluffyGhoster authored Sep 23, 2024
1 parent 426c961 commit 7cc7778
Show file tree
Hide file tree
Showing 11 changed files with 212 additions and 112 deletions.
2 changes: 2 additions & 0 deletions aurorastation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@
#include "code\__DEFINES\turfs.dm"
#include "code\__DEFINES\typeids.dm"
#include "code\__DEFINES\verbs.dm"
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\webhook.dm"
#include "code\__DEFINES\wires.dm"
#include "code\__DEFINES\xenoarch.dm"
Expand Down Expand Up @@ -422,6 +423,7 @@
#include "code\datums\category.dm"
#include "code\datums\computerfiles.dm"
#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\feedback.dm"
#include "code\datums\late_choices.dm"
#include "code\datums\local_network.dm"
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/_flags.dm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204

// for /datum/var/datum_flags
#define DF_USE_TAG (1<<0)
#define DF_VAR_EDITED (1<<1)
#define DF_ISPROCESSING (1<<2)

///Whether /atom/Initialize() has already run for the object
Expand Down
15 changes: 15 additions & 0 deletions code/__DEFINES/vv.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//#define IS_VALID_ASSOC_KEY(V) (istext(V) || ispath(V) || isdatum(V) || islist(V))
#define IS_VALID_ASSOC_KEY(V) (!isnum(V)) //hhmmm..

// vv_do_basic() keys
#define VV_HK_BASIC_EDIT "datumedit"
#define VV_HK_BASIC_CHANGE "datumchange"
//This differs from TG
#define VV_HK_BASIC_MASSEDIT "datummass"

// /datum
#define VV_HK_CALLPROC "proc_call"
#define VV_HK_MARK "mark"

//Helpers for vv_get_dropdown() - yes this is different from the tg one, cope
#define VV_DROPDOWN_OPTION(href_key, name) . += "<option value='?_src_=vars;[href_key]=[REF(src)]'>[name]</option>"
11 changes: 0 additions & 11 deletions code/datums/datum.dm
Original file line number Diff line number Diff line change
Expand Up @@ -148,17 +148,6 @@
for(var/target in _signal_procs)
UnregisterSignal(target, _signal_procs[target])

/datum/proc/can_vv_get(var_name)
return TRUE

/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited
if(var_name == NAMEOF(src, vars))
return FALSE
if(!can_vv_get(var_name))
return FALSE
vars[var_name] = var_value
return TRUE

///Generate a tag for this /datum, if it implements one
///Should be called as early as possible, best would be in New, to avoid weakref mistargets
///Really just don't use this, you don't need it, global lists will do just fine MOST of the time
Expand Down
30 changes: 30 additions & 0 deletions code/datums/datumvars.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/datum/proc/can_vv_get(var_name)
return TRUE

/// Called when a var is edited with the new value to change to
/datum/proc/vv_edit_var(var_name, var_value)
if(var_name == NAMEOF(src, vars))
return FALSE
if(!can_vv_get(var_name)) //This if block does not exist in tgstation code
return FALSE
vars[var_name] = var_value
datum_flags |= DF_VAR_EDITED
return TRUE

/**
* Gets all the dropdown options in the vv menu.
* When overriding, make sure to call . = ..() first and appent to the result, that way parent items are always at the top and child items are further down.
* Add seperators by doing VV_DROPDOWN_OPTION("", "---")
*/
/datum/proc/vv_get_dropdown()
SHOULD_CALL_PARENT(TRUE)

. = list()
VV_DROPDOWN_OPTION("", "---")
VV_DROPDOWN_OPTION(VV_HK_CALLPROC, "Call Proc")
VV_DROPDOWN_OPTION(VV_HK_MARK, "Mark Object")

/datum/proc/vv_get_header()
. = list()
if(("name" in vars) && !isatom(src))
. += "<b>[vars["name"]]</b><br>"
2 changes: 1 addition & 1 deletion code/modules/admin/admin_verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,7 @@ var/list/admin_verbs_cciaa = list(
set name = "Toggle Build Mode Self"
set category = "Special Verbs"

if(!check_rights(R_ADMIN))
if(!check_rights(R_ADMIN|R_SPAWN))
return
var/datum/click_handler/handler = mob.GetClickHandler()
if(handler.type == /datum/click_handler/build_mode)
Expand Down
13 changes: 11 additions & 2 deletions code/modules/admin/verbs/modifyvariables.dm
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,13 @@ var/list/VVdynamic_lock = list(

/client/proc/mod_list(var/list/L, atom/O, original_name, objectvar)
if(!check_rights(R_VAREDIT|R_DEV)) return
if(!istype(L,/list)) to_chat(src, "Not a List.")
if(!islist(L))
//May the omnissiah forgive me for this
if(tgui_alert(usr, "Not a list, make it a list?", "Make list", list("Yes", "No")) == "Yes")
O.vars[objectvar] = list()
L = O.vars[objectvar]
else
return

if(L.len > 1000)
var/confirm = alert(src, "The list you're trying to edit is very long, continuing may crash the server.", "Warning", "Continue", "Abort")
Expand Down Expand Up @@ -314,7 +320,10 @@ var/list/VVdynamic_lock = list(
L[L.Find(variable)] = variable

if("edit referenced object")
modify_variables(variable)
if(islist(L?[variable]))
mod_list(L[variable], O, original_name, objectvar)
else
modify_variables(variable)

if("DELETE FROM LIST")
world.log << "### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[variable]")]"
Expand Down
103 changes: 44 additions & 59 deletions code/modules/admin/view_variables/helpers.dm
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
/datum/proc/get_view_variables_header()
return "<b>[src]</b>"

/atom/get_view_variables_header()
return {"
/atom/vv_get_header()
. = ..()
. += {"
<a href='?_src_=vars;datumedit=[REF(src)];varnameedit=name'><b>[src]</b></a>
<br><font size='1'>
<a href='?_src_=vars;rotatedatum=[REF(src)];rotatedir=left'><<</a>
Expand All @@ -11,10 +9,10 @@
</font>
"}

/mob/living/get_view_variables_header()
return {"
<a href='?_src_=vars;rename=[REF(src)]'><b>[src]</b></a><font size='1'>
<br><a href='?_src_=vars;rotatedatum=[REF(src)];rotatedir=left'><<</a> <a href='?_src_=vars;datumedit=[REF(src)];varnameedit=dir'>[dir2text(dir)]</a> <a href='?_src_=vars;rotatedatum=[REF(src)];rotatedir=right'>>></a>
/mob/living/vv_get_header()
. = ..()
. += {"
<br><font size='1'>
<br><a href='?_src_=vars;datumedit=[REF(src)];varnameedit=ckey'>[ckey ? ckey : "No ckey"]</a> / <a href='?_src_=vars;datumedit=[REF(src)];varnameedit=real_name'>[real_name ? real_name : "No real name"]</a>
<br>
BRUTE:<a href='?_src_=vars;mobToDamage=[REF(src)];adjustDamage=brute'>[getBruteLoss()]</a>
Expand All @@ -26,60 +24,47 @@
</font>
"}

/datum/proc/get_view_variables_options()
return ""

/mob/get_view_variables_options()
return ..() + {"
<option value='?_src_=vars;mob_player_panel=[REF(src)]'>Show player panel</option>
<option>---</option>
<option value='?_src_=vars;give_spell=[REF(src)]'>Give Spell</option>
<option value='?_src_=vars;give_disease2=[REF(src)]'>Give Disease</option>
<option value='?_src_=vars;give_disease=[REF(src)]'>Give TG-style Disease</option>
<option value='?_src_=vars;godmode=[REF(src)]'>Toggle Godmode</option>
<option value='?_src_=vars;build_mode=[REF(src)]'>Toggle Build Mode</option>

<option value='?_src_=vars;ninja=[REF(src)]'>Make Space Ninja</option>
<option value='?_src_=vars;make_skeleton=[REF(src)]'>Make 2spooky</option>
/mob/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("mob_player_panel", "Show player panel")
VV_DROPDOWN_OPTION("", "---")
VV_DROPDOWN_OPTION("give_spell", "Give Spell")
VV_DROPDOWN_OPTION("godmode", "Toggle Godmode")

<option value='?_src_=vars;direct_control=[REF(src)]'>Assume Direct Control</option>
<option value='?_src_=vars;drop_everything=[REF(src)]'>Drop Everything</option>
VV_DROPDOWN_OPTION("make_skeleton", "Make 2spooky")

<option value='?_src_=vars;regenerateicons=[REF(src)]'>Regenerate Icons</option>
<option value='?_src_=vars;addlanguage=[REF(src)]'>Add Language</option>
<option value='?_src_=vars;remlanguage=[REF(src)]'>Remove Language</option>
<option value='?_src_=vars;addorgan=[REF(src)]'>Add Organ</option>
<option value='?_src_=vars;remorgan=[REF(src)]'>Remove Organ</option>
VV_DROPDOWN_OPTION("direct_control", "Assume Direct Control")
VV_DROPDOWN_OPTION("drop_everything", "Drop Everything")

<option value='?_src_=vars;fix_nano=[REF(src)]'>Fix NanoUI</option>
VV_DROPDOWN_OPTION("regenerateicons", "Regenerate Icons")
VV_DROPDOWN_OPTION("addlanguage", "Add Language")
VV_DROPDOWN_OPTION("remlanguage", "Remove Language")
VV_DROPDOWN_OPTION("addorgan", "Add Organ")
VV_DROPDOWN_OPTION("remorgan", "Remove Organ")

<option value='?_src_=vars;addverb=[REF(src)]'>Add Verb</option>
<option value='?_src_=vars;remverb=[REF(src)]'>Remove Verb</option>
<option>---</option>
<option value='?_src_=vars;gib=[REF(src)]'>Gib</option>
<option value='?_src_=vars;dust=[REF(src)]'>Turn to dust</option>
<option value='?_src_=vars;explode=[REF(src)]'>Trigger explosion</option>
<option value='?_src_=vars;emp=[REF(src)]'>Trigger EM pulse</option>
"}
VV_DROPDOWN_OPTION("addverb", "Add Verb")
VV_DROPDOWN_OPTION("remverb", "Remove Verb")
VV_DROPDOWN_OPTION("", "---")
VV_DROPDOWN_OPTION("gib", "Gib")
VV_DROPDOWN_OPTION("dust", "Turn to dust")
VV_DROPDOWN_OPTION("explode", "Trigger explosion")
VV_DROPDOWN_OPTION("emp", "Trigger EM pulse")

/mob/living/carbon/human/get_view_variables_options()
return ..() + {"
<option value='?_src_=vars;setspecies=[REF(src)]'>Set Species</option>
<option value='?_src_=vars;makeai=[REF(src)]'>Make AI</option>
<option value='?_src_=vars;makerobot=[REF(src)]'>Make cyborg</option>
<option value='?_src_=vars;makemonkey=[REF(src)]'>Make monkey</option>
<option value='?_src_=vars;makeslime=[REF(src)]'>Make slime</option>
"}
/mob/living/carbon/human/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("setspecies", "Set Species")
VV_DROPDOWN_OPTION("makeai", "Make AI")
VV_DROPDOWN_OPTION("makerobot", "Make cyborg")
VV_DROPDOWN_OPTION("makemonkey", "Make monkey")
VV_DROPDOWN_OPTION("makeslime", "Make slime")

/obj/get_view_variables_options()
return ..() + {"
<option value='?_src_=vars;delall=[REF(src)]'>Delete all of type</option>
<option value='?_src_=vars;explode=[REF(src)]'>Trigger explosion</option>
<option value='?_src_=vars;emp=[REF(src)]'>Trigger EM pulse</option>
"}
/obj/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("delall", "Delete all of type")
VV_DROPDOWN_OPTION("explode", "Trigger explosion")
VV_DROPDOWN_OPTION("emp", "Trigger EM pulse")

/turf/get_view_variables_options()
return ..() + {"
<option value='?_src_=vars;explode=[REF(src)]'>Trigger explosion</option>
<option value='?_src_=vars;emp=[REF(src)]'>Trigger EM pulse</option>
"}
/turf/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION("explode", "Trigger explosion")
VV_DROPDOWN_OPTION("emp", "Trigger EM pulse")
24 changes: 12 additions & 12 deletions code/modules/admin/view_variables/topic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -29,30 +29,30 @@

href_list["datumrefresh"] = href_list["rename"]

else if(href_list["varnameedit"] && href_list["datumedit"])
else if(href_list["varnameedit"] && href_list[VV_HK_BASIC_EDIT])
if(!check_rights(R_VAREDIT|R_DEV)) return

var/D = locate(href_list["datumedit"])
var/D = locate(href_list[VV_HK_BASIC_EDIT])
if(!istype(D,/datum) && !istype(D,/client))
to_chat(usr, "This can only be used on instances of types /client or /datum")
return

modify_variables(D, href_list["varnameedit"], 1)

else if(href_list["varnamechange"] && href_list["datumchange"])
else if(href_list["varnamechange"] && href_list[VV_HK_BASIC_CHANGE])
if(!check_rights(R_VAREDIT|R_DEV)) return

var/D = locate(href_list["datumchange"])
var/D = locate(href_list[VV_HK_BASIC_CHANGE])
if(!istype(D,/datum) && !istype(D,/client))
to_chat(usr, "This can only be used on instances of types /client or /datum")
return

modify_variables(D, href_list["varnamechange"], 0)

else if(href_list["varnamemass"] && href_list["datummass"])
else if(href_list["varnamemass"] && href_list[VV_HK_BASIC_MASSEDIT])
if(!check_rights(R_VAREDIT|R_DEV)) return

var/atom/A = locate(href_list["datummass"])
var/atom/A = locate(href_list[VV_HK_BASIC_MASSEDIT])
if(!istype(A))
to_chat(usr, "This can only be used on instances of type /atom")
return
Expand Down Expand Up @@ -230,16 +230,16 @@
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]

else if(href_list["mark_object"])
else if(href_list[VV_HK_MARK])
if(!check_rights(0)) return

var/datum/D = locate(href_list["mark_object"])
var/datum/D = locate(href_list[VV_HK_MARK])
if(!istype(D))
to_chat(usr, "This can only be done to instances of type /datum")
return

src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
href_list["datumrefresh"] = href_list[VV_HK_MARK]

else if(href_list["rotatedatum"])
if(!check_rights(0)) return
Expand Down Expand Up @@ -395,7 +395,7 @@
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb)
if(/mob/living/silicon/ai)
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
remove_verb(H, H.verbs)
possibleverbs -= H.verbs
possibleverbs += "Cancel" // ...And one for the bottom

var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs
Expand Down Expand Up @@ -507,8 +507,8 @@
message_admins(SPAN_NOTICE("[key_name(usr)] dealt [amount] amount of [Text] damage to [L]"))
href_list["datumrefresh"] = href_list["mobToDamage"]

else if(href_list["call_proc"])
var/datum/D = locate(href_list["call_proc"])
else if(href_list[VV_HK_CALLPROC])
var/datum/D = locate(href_list[VV_HK_CALLPROC])
if(istype(D) || istype(D, /client)) // can call on clients too, not just datums
callproc_targetpicked(1, D)

Expand Down
Loading

0 comments on commit 7cc7778

Please sign in to comment.