mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 09:42:29 +00:00
## About The Pull Request Makes wrapper procs to support working with bitflags as defined "things" rather then EXCLUSIVELY numbers, mostly for getting random flags. I've ~~also added a unit test to prevent bitfields from being double defined~~ stolen some code form moth to make double definitions here a compile error. This does rely on people actually using the bitfield lists, essentially upgrading them from breaking just admin debug to POTENTIALLY breaking game logic (slightly). Would like input on this @tgstation/commit-access ## Why It's Good For The Game More tools for feature coders to play with, more sane code
346 lines
8.4 KiB
Plaintext
346 lines
8.4 KiB
Plaintext
/client/proc/vv_get_class(var_name, var_value)
|
|
if(isnull(var_value))
|
|
. = VV_NULL
|
|
|
|
else if(isnum(var_value))
|
|
if(length(get_valid_bitflags(var_name)))
|
|
. = VV_BITFIELD
|
|
else
|
|
. = VV_NUM
|
|
|
|
else if(istext(var_value))
|
|
if(findtext(var_value, "\n"))
|
|
. = VV_MESSAGE
|
|
else if(findtext(var_value, GLOB.is_color))
|
|
. = VV_COLOR
|
|
else
|
|
. = VV_TEXT
|
|
|
|
else if(isicon(var_value))
|
|
. = VV_ICON
|
|
|
|
else if(ismob(var_value))
|
|
. = VV_MOB_REFERENCE
|
|
|
|
else if(isloc(var_value))
|
|
. = VV_ATOM_REFERENCE
|
|
|
|
else if(istype(var_value, /client))
|
|
. = VV_CLIENT
|
|
|
|
else if(isweakref(var_value))
|
|
. = VV_WEAKREF
|
|
|
|
else if(isdatum(var_value))
|
|
. = VV_DATUM_REFERENCE
|
|
|
|
else if(ispath(var_value))
|
|
if(ispath(var_value, /atom))
|
|
. = VV_ATOM_TYPE
|
|
else if(ispath(var_value, /datum))
|
|
. = VV_DATUM_TYPE
|
|
else
|
|
. = VV_TYPE
|
|
|
|
else if(islist(var_value))
|
|
if(var_name in GLOB.color_vars)
|
|
. = VV_COLOR_MATRIX
|
|
else
|
|
. = VV_LIST
|
|
|
|
else if(isfile(var_value))
|
|
. = VV_FILE
|
|
else
|
|
. = VV_NULL
|
|
|
|
/client/proc/vv_get_value(class, default_class, current_value, list/restricted_classes, list/extra_classes, list/classes, var_name)
|
|
. = list("class" = class, "value" = null)
|
|
if(!class)
|
|
if(!classes)
|
|
classes = list (
|
|
VV_NUM,
|
|
VV_TEXT,
|
|
VV_MESSAGE,
|
|
VV_ICON,
|
|
VV_COLOR,
|
|
VV_COLOR_MATRIX,
|
|
VV_ATOM_REFERENCE,
|
|
VV_DATUM_REFERENCE,
|
|
VV_MOB_REFERENCE,
|
|
VV_CLIENT,
|
|
VV_ATOM_TYPE,
|
|
VV_DATUM_TYPE,
|
|
VV_TYPE,
|
|
VV_FILE,
|
|
VV_NEW_ATOM,
|
|
VV_NEW_DATUM,
|
|
VV_NEW_TYPE,
|
|
VV_NEW_LIST,
|
|
VV_NULL,
|
|
VV_INFINITY,
|
|
VV_RESTORE_DEFAULT,
|
|
VV_TEXT_LOCATE,
|
|
VV_PROCCALL_RETVAL,
|
|
VV_WEAKREF,
|
|
)
|
|
|
|
var/markstring
|
|
if(!(VV_MARKED_DATUM in restricted_classes))
|
|
markstring = "[VV_MARKED_DATUM] (CURRENT: [(istype(holder) && istype(holder.marked_datum))? holder.marked_datum.type : "NULL"])"
|
|
classes += markstring
|
|
|
|
var/list/tagstrings = new
|
|
if(!(VV_TAGGED_DATUM in restricted_classes) && holder && LAZYLEN(holder.tagged_datums))
|
|
var/i = 0
|
|
for(var/datum/iter_tagged_datum as anything in holder.tagged_datums)
|
|
i++
|
|
var/new_tagstring = "[VV_TAGGED_DATUM] #[i]: [iter_tagged_datum.type])"
|
|
tagstrings[new_tagstring] = iter_tagged_datum
|
|
classes += new_tagstring
|
|
|
|
if(restricted_classes)
|
|
classes -= restricted_classes
|
|
|
|
if(extra_classes)
|
|
classes += extra_classes
|
|
|
|
.["class"] = input(src, "What kind of data?", "Variable Type", default_class) as null|anything in classes
|
|
if(holder && holder.marked_datum && .["class"] == markstring)
|
|
.["class"] = VV_MARKED_DATUM
|
|
|
|
if(holder && tagstrings[.["class"]])
|
|
var/datum/chosen_datum = tagstrings[.["class"]]
|
|
.["value"] = chosen_datum
|
|
.["class"] = VV_TAGGED_DATUM
|
|
|
|
|
|
switch(.["class"])
|
|
if(VV_TEXT)
|
|
.["value"] = input("Enter new text:", "Text", current_value) as null|text
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
if(VV_MESSAGE)
|
|
.["value"] = input("Enter new text:", "Text", current_value) as null|message
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
|
|
if(VV_NUM)
|
|
.["value"] = input("Enter new number:", "Num", current_value) as null|num
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_BITFIELD)
|
|
.["value"] = input_bitfield(usr, "Editing bitfield: [var_name]", var_name, current_value)
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_ATOM_TYPE)
|
|
.["value"] = pick_closest_path(FALSE)
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_DATUM_TYPE)
|
|
.["value"] = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_TYPE)
|
|
var/type = current_value
|
|
var/error = ""
|
|
do
|
|
type = input("Enter type:[error]", "Type", type) as null|text
|
|
if(!type)
|
|
break
|
|
type = text2path(type)
|
|
error = "\nType not found, Please try again"
|
|
while(!type)
|
|
if(!type)
|
|
.["class"] = null
|
|
return
|
|
.["value"] = type
|
|
|
|
if(VV_ATOM_REFERENCE)
|
|
var/type = pick_closest_path(FALSE)
|
|
var/subtypes = vv_subtype_prompt(type)
|
|
if(subtypes == null)
|
|
.["class"] = null
|
|
return
|
|
var/list/things = vv_reference_list(type, subtypes)
|
|
var/value = input("Select reference:", "Reference", current_value) as null|anything in things
|
|
if(!value)
|
|
.["class"] = null
|
|
return
|
|
.["value"] = things[value]
|
|
|
|
if(VV_DATUM_REFERENCE)
|
|
var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
|
|
var/subtypes = vv_subtype_prompt(type)
|
|
if(subtypes == null)
|
|
.["class"] = null
|
|
return
|
|
var/list/things = vv_reference_list(type, subtypes)
|
|
var/value = input("Select reference:", "Reference", current_value) as null|anything in things
|
|
if(!value)
|
|
.["class"] = null
|
|
return
|
|
.["value"] = things[value]
|
|
|
|
if(VV_MOB_REFERENCE)
|
|
var/type = pick_closest_path(FALSE, make_types_fancy(typesof(/mob)))
|
|
var/subtypes = vv_subtype_prompt(type)
|
|
if(subtypes == null)
|
|
.["class"] = null
|
|
return
|
|
var/list/things = vv_reference_list(type, subtypes)
|
|
var/value = input("Select reference:", "Reference", current_value) as null|anything in things
|
|
if(!value)
|
|
.["class"] = null
|
|
return
|
|
.["value"] = things[value]
|
|
|
|
if(VV_WEAKREF)
|
|
var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
|
|
var/subtypes = vv_subtype_prompt(type)
|
|
if(subtypes == null)
|
|
.["class"] = null
|
|
return
|
|
var/list/things = vv_reference_list(type, subtypes)
|
|
var/value = input("Select reference:", "Reference", current_value) as null|anything in things
|
|
if(!value)
|
|
.["class"] = null
|
|
return
|
|
.["value"] = WEAKREF(things[value])
|
|
|
|
if(VV_CLIENT)
|
|
.["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_FILE)
|
|
.["value"] = input("Pick file:", "File") as null|file
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_ICON)
|
|
.["value"] = input("Pick icon:", "Icon") as null|icon
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_MARKED_DATUM)
|
|
.["value"] = holder.marked_datum
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_TAGGED_DATUM)
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_PROCCALL_RETVAL)
|
|
var/list/get_retval = list()
|
|
callproc_blocking(get_retval)
|
|
.["value"] = get_retval[1] //should have been set in proccall!
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_NEW_ATOM)
|
|
var/type = pick_closest_path(FALSE)
|
|
if(!type)
|
|
.["class"] = null
|
|
return
|
|
.["type"] = type
|
|
var/atom/newguy = new type()
|
|
newguy.datum_flags |= DF_VAR_EDITED
|
|
.["value"] = newguy
|
|
|
|
if(VV_NEW_DATUM)
|
|
var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types())
|
|
if(!type)
|
|
.["class"] = null
|
|
return
|
|
.["type"] = type
|
|
var/datum/newguy = new type()
|
|
newguy.datum_flags |= DF_VAR_EDITED
|
|
.["value"] = newguy
|
|
|
|
if(VV_NEW_TYPE)
|
|
var/type = current_value
|
|
var/error = ""
|
|
do
|
|
type = input("Enter type:[error]", "Type", type) as null|text
|
|
if(!type)
|
|
break
|
|
type = text2path(type)
|
|
error = "\nType not found, Please try again"
|
|
while(!type)
|
|
if(!type)
|
|
.["class"] = null
|
|
return
|
|
.["type"] = type
|
|
var/datum/newguy = new type()
|
|
if(istype(newguy))
|
|
newguy.datum_flags |= DF_VAR_EDITED
|
|
.["value"] = newguy
|
|
|
|
if(VV_NEW_LIST)
|
|
.["type"] = /list
|
|
var/list/value = list()
|
|
|
|
var/expectation = alert("Would you like to populate the list", "Populate List?", "Yes", "No")
|
|
if(!expectation || expectation == "No")
|
|
.["value"] = value
|
|
return .
|
|
|
|
var/list/insert = null
|
|
while(TRUE)
|
|
insert = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT))
|
|
if(!insert["class"])
|
|
break
|
|
value += LIST_VALUE_WRAP_LISTS(insert["value"])
|
|
|
|
|
|
.["value"] = value
|
|
|
|
if(VV_TEXT_LOCATE)
|
|
var/datum/D
|
|
do
|
|
var/ref = input("Enter reference:", "Reference") as null|text
|
|
if(!ref)
|
|
break
|
|
D = locate(ref)
|
|
if(!D)
|
|
tgui_alert(usr,"Invalid ref!")
|
|
continue
|
|
if(!D.can_vv_mark())
|
|
tgui_alert(usr,"Datum can not be marked!")
|
|
continue
|
|
while(!D)
|
|
.["type"] = D.type
|
|
.["value"] = D
|
|
|
|
if(VV_COLOR)
|
|
.["value"] = input("Enter new color:", "Color", current_value) as color|null
|
|
if(.["value"] == null)
|
|
.["class"] = null
|
|
return
|
|
|
|
if(VV_COLOR_MATRIX)
|
|
.["value"] = open_color_matrix_editor()
|
|
if(.["value"] == COLOR_MATRIX_IDENTITY) //identity is equivalent to null
|
|
.["class"] = null
|
|
|
|
if(VV_INFINITY)
|
|
.["value"] = INFINITY
|