// Variables to not even show in the list. // step_* and bound_* are here because they literally break the game and do nothing else. // parent_type is here because it's pointless to show in VV. /var/list/view_variables_hide_vars = list("bound_x", "bound_y", "bound_height", "bound_width", "bounds", "parent_type", "step_x", "step_y", "step_size") // Variables not to expand the lists of. Vars is pointless to expand, and overlays/underlays cannot be expanded. /var/list/view_variables_dont_expand = list("overlays", "underlays", "vars") /client/proc/debug_variables(datum/D in world) set category = "Debug" set name = "View Variables" if(!check_rights(0)) return if(!D) return var/icon/sprite if(istype(D, /atom)) var/atom/A = D if(A.icon && A.icon_state) sprite = icon(A.icon, A.icon_state) usr << browse_rsc(sprite, "view_vars_sprite.png") usr << browse_rsc('code/js/view_variables.js', "view_variables.js") var/html = {" [D] (\ref[D] - [D.type])
[sprite ? "" : ""]
[D.get_view_variables_header()]
[replacetext("[D.type]", "/", "/")] [holder.marked_datum == D ? "
Marked Object" : ""]
Refresh

E - Edit, tries to determine the variable type by itself.
C - Change, asks you for the var type first.
M - Mass modify: changes this variable for all objects of this type.

Search:

    [make_view_variables_var_list(D)]
"} usr << browse(html, "window=variables\ref[D];size=475x650") /proc/make_view_variables_var_list(datum/D) . = "" var/list/variables = list() for(var/x in D.vars) if(x in view_variables_hide_vars) continue variables += x variables = sortList(variables) for(var/x in variables) . += make_view_variables_var_entry(D, x, D.vars[x]) /proc/make_view_variables_var_entry(datum/D, varname, value, level=0) var/ecm = null var/vtext = null var/extra = null if(D) ecm = {" (E) (C) (M) "} if(isnull(value)) vtext = "null" else if(istext(value)) vtext = "\"[value]\"" else if(isicon(value)) vtext = "[value]" else if(isfile(value)) vtext = "'[value]'" else if(istype(value, /datum)) var/datum/DA = value if("[DA]" == "[DA.type]" || !"[DA]") vtext = "\ref[DA] - [DA.type]" else vtext = "\ref[DA] - [DA] ([DA.type])" else if(istype(value, /client)) var/client/C = value vtext = "\ref[C] - [C] ([C.type])" else if(islist(value)) var/list/L = value var/removed = 0 if(varname == "contents") var/list/original = value L = original.Copy() //We'll take a copy to manipulate removed = D.view_variables_filter_contents(L) vtext = "/list ([L.len]+[removed]H)" if(!(varname in view_variables_dont_expand) && L.len > 0 && L.len < 100) extra = "" else vtext = "[value]" return "
  • [ecm][varname] = [vtext][extra]
  • " //Allows us to mask out some contents when it's not necessary to show them //For example, organs on humans, as the organs are stored in other lists which will also be present //So there's really no need to list them twice. /datum/proc/view_variables_filter_contents(list/L) return 0 //Return how many items you removed. /mob/living/carbon/human/view_variables_filter_contents(list/L) . = ..() L -= ability_master .++ /mob/living/carbon/human/view_variables_filter_contents(list/L) . = ..() var/len_before = L.len L -= organs L -= internal_organs . += len_before - L.len