anchor.diff:  	if(!procname)
   		return
   	if(!hascall(A,procname))
  -		to_chat(usr, "<font color='red'>Error: callproc_datum(): type [A.type] has no proc named [procname].</font>")
  +		to_chat(usr, "<span class='warning'>Error: callproc_datum(): type [A.type] has no proc named [procname].</span>")
   		return
   	var/list/lst = get_callproc_args()
   	if(!lst)
  
positive.code: 	. = get_callproc_returnval(returnval,procname)
  	if(.)
  		to_chat(usr, .)
  
  
  
  /client/proc/get_callproc_args()
  	var/argnum = input("Number of arguments","Number:",0) as num|null
  
negative.code: /client/proc/callproc()
  	set category = "Debug"
  	set name = "Advanced ProcCall"
  	set waitfor = FALSE
  
  	if(!check_rights(R_DEBUG))
  		return
  
  	var/datum/target = null
  	var/targetselected = FALSE
  	var/returnval = null
  
  	if(alert("Proc owned by something?",,"Yes","No") == "Yes")
  		targetselected = TRUE
  		var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT))
  		if (!value["class"] || !value["value"])
  			return
  		target = value["value"]
  
  	var/procpath = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
  	if(!procpath)
  		return
  
  	//strip away everything but the proc name
  	var/list/proclist = splittext(procpath, "/")
  	if (!length(proclist))
  		return
  
  	var/procname = proclist[proclist.len]
  	var/proctype = ("verb" in proclist) ? "verb" :"proc"
  
  	if(targetselected)
  		if(!hascall(target, procname))
  			to_chat(usr, "<span class='warning'>Error: callproc(): type [target.type] has no [proctype] named [procpath].</span>")
  			return
  	else
  		procpath = "/[proctype]/[procname]"
  		if(!text2path(procpath))
  			to_chat(usr, "<span class='warning'>Error: callproc(): [procpath] does not exist.</span>")
  			return
  
  	var/list/lst = get_callproc_args()
  	if(!lst)
  		return
  
  	if(targetselected)
  		if(!target)
  			to_chat(usr, "<span class='warning'>Error: callproc(): owner of proc no longer exists.</span>")
  			return
  		var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]."
  		log_admin(msg)
  		message_admins(msg)
  		admin_ticket_log(target, msg)
  		returnval = WrapAdminProcCall(target, procname, lst)
  	else
  		var/msg = "[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]."
  		log_admin(msg)
  		message_admins(msg)
  		returnval = WrapAdminProcCall(GLOBAL_PROC, procpath, lst) //calling globals needs full qualified name (e.g /proc/foo)
  	. = get_callproc_returnval(returnval, procname)
  	if(.)
  		to_chat(usr, .)
  