Revert "Tg status tab"

This reverts commit 931f3ca63b.
This commit is contained in:
QuoteFox
2021-02-27 04:02:22 +00:00
parent 931f3ca63b
commit b4fa877cc7
75 changed files with 364 additions and 1659 deletions

View File

@@ -1 +0,0 @@
**QuoteFox/(Test Character)** *()*```cum```

View File

@@ -1,26 +0,0 @@
/// Represents a proc or verb path.
///
/// Despite having no DM-defined static type, proc paths have some variables,
/// listed below. These are not modifiable, but for a given procpath P,
/// `new P(null, "Name", "Desc")` can be used to create a new procpath with the
/// same code but new `name` and `desc` values. The other variables cannot be
/// changed in this way.
///
/// This type exists only to act as an annotation, providing reasonable static
/// typing for procpaths. Previously, types like `/atom/verb` were used, with
/// the `name` and `desc` vars of `/atom` thus being accessible. Proc and verb
/// paths will fail `istype` and `ispath` checks against `/procpath`.
/procpath
// Although these variables are effectively const, if they are marked const
// below, their accesses are optimized away.
/// A text string of the verb's name.
var/name as text
/// The verb's help text or description.
var/desc as text
/// The category or tab the verb will appear in.
var/category as text
/// Only clients/mobs with `see_invisibility` higher can use the verb.
var/invisibility as num
/// Whether or not the verb appears in statpanel and commandbar when you press space
var/hidden as num

View File

@@ -6,14 +6,10 @@
#define RETURN_TYPE(X) set SpacemanDMM_return_type = X
#define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X
#define UNLINT(X) SpacemanDMM_unlint(X)
#define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X
#define SHOULD_NOT_SLEEP(X) set SpacemanDMM_should_not_sleep = X
#else
#define RETURN_TYPE(X)
#define SHOULD_CALL_PARENT(X)
#define UNLINT(X) X
#define SHOULD_NOT_OVERRIDE(X)
#define SHOULD_NOT_SLEEP(X)
#endif
/world/proc/enable_debugger()

View File

@@ -84,7 +84,6 @@
#define INIT_ORDER_MINOR_MAPPING -40
#define INIT_ORDER_PATH -50
#define INIT_ORDER_PERSISTENCE -95
#define INIT_ORDER_STATPANELS -98
#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
// Subsystem fire priority, from lowest to highest priority

View File

@@ -337,7 +337,7 @@
if(!previous)
var/list/report_parts = list(personal_report(C), GLOB.common_report)
content = report_parts.Join()
remove_verb(C, /client/proc/show_previous_roundend_report)
C.verbs -= /client/proc/show_previous_roundend_report
fdel(filename)
text2file(content, filename)
else

View File

@@ -1,96 +0,0 @@
/**
* handles adding verbs and updating the stat panel browser
*
* pass the verb type path to this instead of adding it directly to verbs so the statpanel can update
* Arguments:
* * target - Who the verb is being added to, client or mob typepath
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
*/
/proc/add_verb(client/target, verb_or_list_to_add)
if(!target)
CRASH("add_verb called without a target")
if(IsAdminAdvancedProcCall())
return
var/mob/mob_target = null
if(ismob(target))
mob_target = target
target = mob_target.client
else if(!istype(target, /client))
CRASH("add_verb called on a non-mob and non-client")
var/list/verbs_list = list()
if(!islist(verb_or_list_to_add))
verbs_list += verb_or_list_to_add
else
var/list/verb_listref = verb_or_list_to_add
var/list/elements_to_process = verb_listref.Copy()
while(length(elements_to_process))
var/element_or_list = elements_to_process[length(elements_to_process)] //Last element
elements_to_process.len--
if(islist(element_or_list))
elements_to_process += element_or_list //list/a += list/b adds the contents of b into a, not the reference to the list itself
else
verbs_list += element_or_list
if(mob_target)
mob_target.verbs += verbs_list
if(!target)
return //Our work is done.
else
target.verbs += verbs_list
var/list/output_list = list()
for(var/thing in verbs_list)
var/procpath/verb_to_add = thing
output_list[++output_list.len] = list(verb_to_add.category, verb_to_add.name)
output_list = url_encode(json_encode(output_list))
target << output("[output_list];", "statbrowser:add_verb_list")
/**
* handles removing verb and sending it to browser to update, use this for removing verbs
*
* pass the verb type path to this instead of removing it from verbs so the statpanel can update
* Arguments:
* * target - Who the verb is being removed from, client or mob typepath
* * verb - typepath to a verb, or a list of verbs, supports lists of lists
*/
/proc/remove_verb(client/target, verb_or_list_to_remove)
if(IsAdminAdvancedProcCall())
return
var/mob/mob_target = null
if(ismob(target))
mob_target = target
target = mob_target.client
else if(!istype(target, /client))
CRASH("remove_verb called on a non-mob and non-client")
var/list/verbs_list = list()
if(!islist(verb_or_list_to_remove))
verbs_list += verb_or_list_to_remove
else
var/list/verb_listref = verb_or_list_to_remove
var/list/elements_to_process = verb_listref.Copy()
while(length(elements_to_process))
var/element_or_list = elements_to_process[length(elements_to_process)] //Last element
elements_to_process.len--
if(islist(element_or_list))
elements_to_process += element_or_list //list/a += list/b adds the contents of b into a, not the reference to the list itself
else
verbs_list += element_or_list
if(mob_target)
mob_target.verbs -= verbs_list
if(!target)
return //Our work is done.
else
target.verbs -= verbs_list
var/list/output_list = list()
for(var/thing in verbs_list)
var/procpath/verb_to_remove = thing
output_list[++output_list.len] = list(verb_to_remove.category, verb_to_remove.name)
output_list = url_encode(json_encode(output_list))
target << output("[output_list];", "statbrowser:remove_verb_list")

View File

@@ -374,10 +374,6 @@
/atom/proc/AltClick(mob/user)
. = SEND_SIGNAL(src, COMSIG_CLICK_ALT, user)
var/turf/T = get_turf(src)
if(T && (isturf(loc) || isturf(src)) && user.TurfAdjacent(T))
user.listed_turf = T
user.client << output("[url_encode(json_encode(T.name))];", "statbrowser:create_listedturf")
/mob/proc/TurfAdjacent(turf/T)
return T.Adjacent(src)

View File

@@ -11,7 +11,7 @@
var/icon/credits_icon = new(CREDITS_PATH)
LAZYINITLIST(credits)
var/list/_credits = credits
add_verb(src, /client/proc/ClearCredits)
verbs += /client/proc/ClearCredits
var/static/list/credit_order_for_this_round
if(isnull(credit_order_for_this_round))
credit_order_for_this_round = list("Thanks for playing!") + (shuffle(icon_states(credits_icon)) - "Thanks for playing!")
@@ -21,13 +21,13 @@
_credits += new /obj/screen/credit(null, I, src, credits_icon)
sleep(CREDIT_SPAWN_SPEED)
sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED)
remove_verb(src, /client/proc/ClearCredits)
verbs -= /client/proc/ClearCredits
qdel(credits_icon)
/client/proc/ClearCredits()
set name = "Hide Credits"
set category = "OOC"
remove_verb(src, /client/proc/ClearCredits)
verbs -= /client/proc/ClearCredits
QDEL_LIST(credits)
credits = null

View File

@@ -165,9 +165,10 @@
log_world(msg)
return time
//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc.
/datum/controller/subsystem/stat_entry(msg)
if(!statclick)
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
@@ -176,7 +177,11 @@
else
msg = "OFFLINE\t[msg]"
return msg
var/title = name
if (can_fire)
title = "\[[state_letter()]][title]"
stat(title, statclick.update(msg))
/datum/controller/subsystem/proc/state_letter()
switch (state)

View File

@@ -7,9 +7,9 @@ SUBSYSTEM_DEF(acid)
var/list/currentrun = list()
var/list/processing = list()
/datum/controller/subsystem/acid/stat_entry(msg)
msg = "P:[length(processing)]"
return ..()
/datum/controller/subsystem/acid/stat_entry()
..("P:[processing.len]")
/datum/controller/subsystem/acid/fire(resumed = 0)
if (!resumed)

View File

@@ -6,13 +6,12 @@ SUBSYSTEM_DEF(adjacent_air)
priority = FIRE_PRIORITY_ATMOS_ADJACENCY
var/list/queue = list()
/datum/controller/subsystem/adjacent_air/stat_entry(msg)
/datum/controller/subsystem/adjacent_air/stat_entry()
#ifdef TESTING
msg = "P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]"
..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]")
#else
msg = "P:[length(queue)]"
..("P:[length(queue)]")
#endif
return ..()
/datum/controller/subsystem/adjacent_air/Initialize()
while(length(queue))

View File

@@ -9,8 +9,7 @@ SUBSYSTEM_DEF(augury)
var/list/observers_given_action = list()
/datum/controller/subsystem/augury/stat_entry(msg)
msg = "W:[watchers.len]|D:[length(doombringers)]"
return ..()
..("W:[watchers.len]|D:[doombringers.len]")
/datum/controller/subsystem/augury/proc/register_doom(atom/A, severity)
doombringers[A] = severity

View File

@@ -20,8 +20,7 @@ SUBSYSTEM_DEF(disease)
return ..()
/datum/controller/subsystem/disease/stat_entry(msg)
msg = "P:[length(active_diseases)]"
return ..()
..("P:[active_diseases.len]")
/datum/controller/subsystem/disease/proc/get_disease_name(id)
var/datum/disease/advance/A = archive_diseases[id]

View File

@@ -7,9 +7,9 @@ SUBSYSTEM_DEF(fire_burning)
var/list/currentrun = list()
var/list/processing = list()
/datum/controller/subsystem/fire_burning/stat_entry(msg)
msg = "P:[length(processing)]"
return ..()
/datum/controller/subsystem/fire_burning/stat_entry()
..("P:[processing.len]")
/datum/controller/subsystem/fire_burning/fire(resumed = 0)
if (!resumed)

View File

@@ -57,7 +57,7 @@ SUBSYSTEM_DEF(garbage)
msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%"
msg += " P:[pass_counts.Join(",")]"
msg += "|F:[fail_counts.Join(",")]"
return ..()
..(msg)
/datum/controller/subsystem/garbage/Shutdown()
//Adds the del() log to the qdel log file

View File

@@ -8,11 +8,10 @@ SUBSYSTEM_DEF(idlenpcpool)
var/list/currentrun = list()
var/static/list/idle_mobs_by_zlevel[][]
/datum/controller/subsystem/idlenpcpool/stat_entry(msg)
/datum/controller/subsystem/idlenpcpool/stat_entry()
var/list/idlelist = GLOB.simple_animals[AI_IDLE]
var/list/zlist = GLOB.simple_animals[AI_Z_OFF]
msg = "IdleNPCS:[length(idlelist)]|Z:[length(zlist)]"
return ..()
..("IdleNPCS:[idlelist.len]|Z:[zlist.len]")
/datum/controller/subsystem/idlenpcpool/proc/MaxZChanged()
if (!islist(idle_mobs_by_zlevel))

View File

@@ -7,13 +7,10 @@ SUBSYSTEM_DEF(lighting)
wait = 2
init_order = INIT_ORDER_LIGHTING
flags = SS_TICKER
var/static/list/sources_queue = list() // List of lighting sources queued for update.
var/static/list/corners_queue = list() // List of lighting corners queued for update.
var/static/list/objects_queue = list() // List of lighting objects queued for update.
/datum/controller/subsystem/lighting/stat_entry(msg)
msg = "L:[length(sources_queue)]|C:[length(corners_queue)]|O:[length(objects_queue)]"
return ..()
/datum/controller/subsystem/lighting/stat_entry()
..("L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]")
/datum/controller/subsystem/lighting/Initialize(timeofday)
if(!initialized)

View File

@@ -22,10 +22,9 @@ SUBSYSTEM_DEF(machines)
NewPN.add_cable(PC)
propagate_network(PC,PC.powernet)
/datum/controller/subsystem/machines/stat_entry()
..("M:[processing.len]|PN:[powernets.len]")
/datum/controller/subsystem/machines/stat_entry(msg)
msg = "M:[length(processing)]|PN:[length(powernets)]"
return ..()
/datum/controller/subsystem/machines/fire(resumed = 0)
if (!resumed)

View File

@@ -10,9 +10,8 @@ SUBSYSTEM_DEF(mobs)
var/static/list/cubemonkeys = list()
var/static/list/cheeserats = list()
/datum/controller/subsystem/mobs/stat_entry(msg)
msg = "P:[length(GLOB.mob_living_list)]"
return ..()
/datum/controller/subsystem/mobs/stat_entry()
..("P:[GLOB.mob_living_list.len]")
/datum/controller/subsystem/mobs/proc/MaxZChanged()
if (!islist(clients_by_zlevel))

View File

@@ -6,10 +6,9 @@ SUBSYSTEM_DEF(npcpool)
var/list/currentrun = list()
/datum/controller/subsystem/npcpool/stat_entry(msg)
/datum/controller/subsystem/npcpool/stat_entry()
var/list/activelist = GLOB.simple_animals[AI_ON]
msg = "NPCS:[length(activelist)]"
return ..()
..("NPCS:[activelist.len]")
/datum/controller/subsystem/npcpool/fire(resumed = FALSE)

View File

@@ -21,9 +21,10 @@ SUBSYSTEM_DEF(overlays)
fire(mc_check = FALSE)
return ..()
/datum/controller/subsystem/overlays/stat_entry(msg)
msg = "Ov:[length(queue)]"
return ..()
/datum/controller/subsystem/overlays/stat_entry()
..("Ov:[length(queue)]")
/datum/controller/subsystem/overlays/Shutdown()
text2file(render_stats(stats), "[GLOB.log_directory]/overlay.log")

View File

@@ -10,9 +10,8 @@ SUBSYSTEM_DEF(processing)
var/list/processing = list()
var/list/currentrun = list()
/datum/controller/subsystem/processing/stat_entry(msg)
msg = "[stat_tag]:[length(processing)]"
return ..()
/datum/controller/subsystem/processing/stat_entry()
..("[stat_tag]:[processing.len]")
/datum/controller/subsystem/processing/fire(resumed = 0)
if (!resumed)

View File

@@ -8,9 +8,9 @@ SUBSYSTEM_DEF(spacedrift)
var/list/currentrun = list()
var/list/processing = list()
/datum/controller/subsystem/spacedrift/stat_entry(msg)
msg = "P:[length(processing)]"
return ..()
/datum/controller/subsystem/spacedrift/stat_entry()
..("P:[processing.len]")
/datum/controller/subsystem/spacedrift/fire(resumed = 0)
if (!resumed)

View File

@@ -1,114 +0,0 @@
SUBSYSTEM_DEF(statpanels)
name = "Stat Panels"
wait = 4
init_order = INIT_ORDER_STATPANELS
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
var/list/currentrun = list()
var/encoded_global_data
var/mc_data_encoded
var/list/cached_images = list()
/datum/controller/subsystem/statpanels/fire(resumed = FALSE)
if (!resumed)
var/datum/map_config/cached = SSmapping.next_map_config
var/round_time = world.time - SSticker.round_start_time
var/list/global_data = list(
"Map: [SSmapping.config?.map_name || "Loading..."]",
cached ? "Next Map: [cached.map_name]" : null,
"Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]",
"Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]",
"Round Time: [round_time > MIDNIGHT_ROLLOVER ? "[round(round_time/MIDNIGHT_ROLLOVER)]:[worldtime2text()]" : worldtime2text()]",
"Station Time: [station_time_timestamp()]",
"Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)"
)
if(SSshuttle.emergency)
var/ETA = SSshuttle.emergency.getModeStr()
if(ETA)
global_data += "[ETA] [SSshuttle.emergency.getTimerStr()]"
encoded_global_data = url_encode(json_encode(global_data))
var/list/mc_data = list(
list("CPU:", world.cpu),
list("Instances:", "[num2text(world.contents.len, 10)]"),
list("World Time:", "[world.time]"),
list("Globals:", "Edit", "\ref[GLOB]"),
list("[config]:", "Edit", "\ref[config]"),
list("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))"),
list("Master Controller:", Master ? "(TickRate:[Master.processing]) (Iteration:[Master.iteration])" : "ERROR", "\ref[Master]"),
list("Failsafe Controller:", Failsafe ? "Defcon: [Failsafe.defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])" : "ERROR", "\ref[Failsafe]"),
list("","")
)
for(var/ss in Master.subsystems)
var/datum/controller/subsystem/sub_system = ss
mc_data[++mc_data.len] = list("\[[sub_system.state_letter()]][sub_system.name]", sub_system.stat_entry(), "\ref[sub_system]")
mc_data[++mc_data.len] = list("Camera Net", "Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", "\ref[GLOB.cameranet]")
mc_data_encoded = url_encode(json_encode(mc_data))
src.currentrun = GLOB.clients.Copy()
var/list/currentrun = src.currentrun
while(length(currentrun))
var/client/target = currentrun[length(currentrun)]
currentrun.len--
var/ping_str = url_encode("Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)")
var/other_str = url_encode(json_encode(target.mob.get_status_tab_items()))
target << output("[encoded_global_data];[ping_str];[other_str]", "statbrowser:update")
if(!target.holder)
target << output("", "statbrowser:remove_admin_tabs")
else
var/turf/eye_turf = get_turf(target.eye)
var/coord_entry = url_encode(COORD(eye_turf))
target << output("[mc_data_encoded];[coord_entry];[url_encode(target.holder.href_token)]", "statbrowser:update_mc")
var/list/ahelp_tickets = GLOB.ahelp_tickets.stat_entry()
target << output("[url_encode(json_encode(ahelp_tickets))];", "statbrowser:update_tickets")
if(!length(GLOB.sdql2_queries))
target << output("", "statbrowser:remove_sqdl2")
else
var/list/sqdl2A = list()
sqdl2A[++sqdl2A.len] = list("", "Access Global SDQL2 List", REF(GLOB.sdql2_vv_statobj))
var/list/sqdl2B = list()
sqdl2A += sqdl2B
target << output(url_encode(json_encode(sqdl2A)), "statbrowser:update_sqdl2")
var/list/proc_holders = target.mob.get_proc_holders()
target.spell_tabs.Cut()
for(var/phl in proc_holders)
var/list/proc_holder_list = phl
target.spell_tabs |= proc_holder_list[1]
var/proc_holders_encoded = ""
if(length(proc_holders))
proc_holders_encoded = url_encode(json_encode(proc_holders))
target << output("[url_encode(json_encode(target.spell_tabs))];[proc_holders_encoded]", "statbrowser:update_spells")
if(target.mob?.listed_turf)
var/mob/target_mob = target.mob
if(!target_mob.TurfAdjacent(target_mob.listed_turf))
target << output("", "statbrowser:remove_listedturf")
target_mob.listed_turf = null
else
var/list/overrides = list()
var/list/turfitems = list()
for(var/img in target.images)
var/image/target_image = img
if(!target_image.loc || target_image.loc.loc != target_mob.listed_turf || !target_image.override)
continue
overrides += target_image.loc
for(var/tc in target_mob.listed_turf)
var/atom/movable/turf_content = tc
if(turf_content.mouse_opacity == MOUSE_OPACITY_TRANSPARENT)
continue
if(turf_content.invisibility > target_mob.see_invisible)
continue
if(turf_content in overrides)
continue
if(turf_content.IsObscured())
continue
if(length(turfitems) < 30) // only create images for the first 30 items on the turf, for performance reasons
if(!(REF(turf_content) in cached_images))
target << browse_rsc(getFlatIcon(turf_content, no_anim = TRUE), "[REF(turf_content)].png")
cached_images += REF(turf_content)
turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content), "[REF(turf_content)].png")
else
turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content))
turfitems = url_encode(json_encode(turfitems))
target << output("[turfitems];", "statbrowser:update_listedturf")
if(MC_TICK_CHECK)
return

View File

@@ -16,9 +16,8 @@ SUBSYSTEM_DEF(tgui)
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
/datum/controller/subsystem/tgui/stat_entry(msg)
msg = "P:[length(open_uis)]"
return ..()
/datum/controller/subsystem/tgui/stat_entry()
..("P:[processing_uis.len]")
/datum/controller/subsystem/tgui/fire(resumed = 0)
if (!resumed)

View File

@@ -11,9 +11,9 @@ SUBSYSTEM_DEF(throwing)
var/list/currentrun
var/list/processing = list()
/datum/controller/subsystem/throwing/stat_entry(msg)
msg = "P:[length(processing)]"
return ..()
/datum/controller/subsystem/throwing/stat_entry()
..("P:[processing.len]")
/datum/controller/subsystem/throwing/fire(resumed = 0)
if (!resumed)

View File

@@ -402,7 +402,6 @@ SUBSYSTEM_DEF(ticker)
if(living.client)
var/obj/screen/splash/S = new(living.client, TRUE)
S.Fade(TRUE)
living.client.init_verbs()
livings += living
if(livings.len)
addtimer(CALLBACK(src, .proc/release_characters, livings), 30, TIMER_CLIENT_TIME)
@@ -678,7 +677,7 @@ SUBSYSTEM_DEF(ticker)
if(!round_end_sound)
round_end_sound = pick(\
'sound/roundend/iwishtherewassomethingmore.ogg',
'sound/roundend/likeisaid.ogg',
'sound/roundend/likeisaid.ogg',
'sound/roundend/whatarottenwaytodie.ogg',
'sound/roundend/whatashame.ogg',
'sound/roundend/newroundsexy.ogg',

View File

@@ -34,8 +34,7 @@ SUBSYSTEM_DEF(timer)
bucket_resolution = world.tick_lag
/datum/controller/subsystem/timer/stat_entry(msg)
msg = "B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]"
return ..()
..("B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]")
/datum/controller/subsystem/timer/fire(resumed = FALSE)
var/lit = last_invoke_tick

View File

@@ -12,48 +12,6 @@
var/rotation_flags = NONE
var/default_rotation_direction = ROTATION_CLOCKWISE
/*
/proc/add_verb(client/target, verb_or_list_to_add)
if(!target)
CRASH("add_verb called without a target")
if(IsAdminAdvancedProcCall())
return
var/mob/mob_target = null
if(ismob(target))
mob_target = target
target = mob_target.client
else if(!istype(target, /client))
CRASH("add_verb called on a non-mob and non-client")
var/list/verbs_list = list()
if(!islist(verb_or_list_to_add))
verbs_list += verb_or_list_to_add
else
var/list/verb_listref = verb_or_list_to_add
var/list/elements_to_process = verb_listref.Copy()
while(length(elements_to_process))
var/element_or_list = elements_to_process[length(elements_to_process)] //Last element
elements_to_process.len--
if(islist(element_or_list))
elements_to_process += element_or_list //list/a += list/b adds the contents of b into a, not the reference to the list itself
else
verbs_list += element_or_list
if(mob_target)
mob_target.verbs += verbs_list
if(!target)
return //Our work is done.
else
target.verbs += verbs_list
var/list/output_list = list()
for(var/thing in verbs_list)
var/procpath/verb_to_add = thing
//output_list[++output_list.len] = list(verb_to_add.category, verb_to_add.name)
output_list = url_encode(json_encode(output_list))
target << output("[output_list];", "statbrowser:add_verb_list")
*/
/datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation)
if(!ismovableatom(parent))

View File

@@ -128,9 +128,6 @@
transfer_martial_arts(new_character)
if(active || force_key_move)
new_character.key = key //now transfer the key to link the client to our new body
if(new_character.client)
//LAZYCLEARLIST(new_character.client.recent_examines)
new_character.client.init_verbs() // re-initialize character specific verbs
//CIT CHANGE - makes arousal update when transfering bodies
if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.
@@ -774,7 +771,6 @@
if(istype(S, spell))
spell_list -= S
qdel(S)
current?.client << output(null, "statbrowser:check_spells")
/datum/mind/proc/RemoveAllSpells()
for(var/obj/effect/proc_holder/S in spell_list)

View File

@@ -873,20 +873,3 @@ Proc for attack log creation, because really why not
/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
. |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
///Passes Stat Browser Panel clicks to the game and calls client click on an atom
/atom/Topic(href, list/href_list)
. = ..()
if(!usr?.client)
return
var/client/usr_client = usr.client
var/list/paramslist = list()
if(href_list["statpanel_item_shiftclick"])
paramslist["shift"] = "1"
if(href_list["statpanel_item_ctrlclick"])
paramslist["ctrl"] = "1"
if(href_list["statpanel_item_altclick"])
paramslist["alt"] = "1"
if(href_list["statpanel_item_click"])
// first of all make sure we valid
var/mouseparams = list2params(paramslist)
usr_client.Click(src, loc, null, mouseparams)

View File

@@ -9,8 +9,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
sandbox.owner = src.ckey
if(src.client.holder)
sandbox.admin = 1
add_verb(src, /mob/proc/sandbox_panel)
verbs += new/mob/proc/sandbox_panel
/mob/proc/sandbox_panel()
set name = "Sandbox Panel"
if(sandbox)

View File

@@ -74,7 +74,6 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/client/proc/addbunkerbypass,
/client/proc/revokebunkerbypass,
/client/proc/stop_sounds,
/client/proc/debugstatpanel,
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/datum/admins/proc/open_borgopanel
@@ -257,36 +256,36 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
control_freak = CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
var/rights = holder.rank.rights
add_verb(src, GLOB.admin_verbs_default)
verbs += GLOB.admin_verbs_default
if(rights & R_BUILDMODE)
add_verb(src, /client/proc/togglebuildmodeself)
verbs += /client/proc/togglebuildmodeself
if(rights & R_ADMIN)
add_verb(src, GLOB.admin_verbs_admin)
verbs += GLOB.admin_verbs_admin
if(rights & R_BAN)
add_verb(src, GLOB.admin_verbs_ban)
verbs += GLOB.admin_verbs_ban
if(rights & R_FUN)
add_verb(src, GLOB.admin_verbs_fun)
verbs += GLOB.admin_verbs_fun
if(rights & R_SERVER)
add_verb(src, GLOB.admin_verbs_server)
verbs += GLOB.admin_verbs_server
if(rights & R_DEBUG)
add_verb(src, GLOB.admin_verbs_debug)
verbs += GLOB.admin_verbs_debug
if(rights & R_POSSESS)
add_verb(src, GLOB.admin_verbs_possess)
verbs += GLOB.admin_verbs_possess
if(rights & R_PERMISSIONS)
add_verb(src, GLOB.admin_verbs_permissions)
verbs += GLOB.admin_verbs_permissions
if(rights & R_STEALTH)
add_verb(src, /client/proc/stealth)
verbs += /client/proc/stealth
if(rights & R_ADMIN)
add_verb(src, GLOB.admin_verbs_poll)
verbs += GLOB.admin_verbs_poll
if(rights & R_SOUNDS)
add_verb(src, GLOB.admin_verbs_sounds)
verbs += GLOB.admin_verbs_sounds
if(CONFIG_GET(string/invoke_youtubedl))
add_verb(src, /client/proc/play_web_sound)
verbs += /client/proc/play_web_sound
if(rights & R_SPAWN)
add_verb(src, GLOB.admin_verbs_spawn)
verbs += GLOB.admin_verbs_spawn
/client/proc/remove_admin_verbs()
remove_verb(src, list(
verbs.Remove(
GLOB.admin_verbs_default,
/client/proc/togglebuildmodeself,
GLOB.admin_verbs_admin,
@@ -305,14 +304,14 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
GLOB.admin_verbs_debug_mapping,
/client/proc/disable_debug_verbs,
/client/proc/readmin
))
)
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Adminverbs - Hide Most"
set category = "Admin"
verbs.Remove(/client/proc/hide_most_verbs, GLOB.admin_verbs_hideable)
add_verb(src, /client/proc/show_verbs)
verbs += /client/proc/show_verbs
to_chat(src, "<span class='interface'>Most of your adminverbs have been hidden.</span>")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -323,7 +322,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
set category = "Admin"
remove_admin_verbs()
add_verb(src, /client/proc/show_verbs)
verbs += /client/proc/show_verbs
to_chat(src, "<span class='interface'>Almost all of your adminverbs have been hidden.</span>")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide All Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -333,7 +332,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
set name = "Adminverbs - Show"
set category = "Admin"
remove_verb(src, /client/proc/show_verbs)
verbs -= /client/proc/show_verbs
add_admin_verbs()
to_chat(src, "<span class='interface'>All of your adminverbs are now visible.</span>")
@@ -366,7 +365,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
message_admins("[key_name_admin(usr)] admin ghosted.")
var/mob/body = mob
body.ghostize(1)
init_verbs()
if(body && !body.key)
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin Ghost") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -719,10 +717,3 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
log_admin("[key_name(usr)] has [AI_Interact ? "activated" : "deactivated"] Admin AI Interact")
message_admins("[key_name_admin(usr)] has [AI_Interact ? "activated" : "deactivated"] their AI interaction")
/client/proc/debugstatpanel()
set name = "Debug Stat Panel"
set category = "Debug"
src << output("", "statbrowser:create_debug")

View File

@@ -93,7 +93,7 @@ GLOBAL_PROTECT(href_token)
var/client/C
if ((C = owner) || (C = GLOB.directory[target]))
disassociate()
add_verb(C, /client/proc/readmin)
C.verbs += /client/proc/readmin
/datum/admins/proc/associate(client/C)
if(IsAdminAdvancedProcCall())
@@ -113,8 +113,7 @@ GLOBAL_PROTECT(href_token)
owner = C
owner.holder = src
owner.add_admin_verbs() //TODO <--- todo what? the proc clearly exists and works since its the backbone to our entire admin system
remove_verb(owner, /client/proc/readmin)
owner.init_verbs() //re-initialize the verb list
owner.verbs -= /client/proc/readmin
GLOB.admins |= C
/datum/admins/proc/disassociate()
@@ -126,7 +125,6 @@ GLOBAL_PROTECT(href_token)
if(owner)
GLOB.admins -= owner
owner.remove_admin_verbs()
owner.init_verbs()
owner.holder = null
owner = null

View File

@@ -393,14 +393,11 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
delete_click = new(null, "INITIALIZING", src)
if(!action_click)
action_click = new(null, "INITIALIZNG", src)
var/list/L = list()
L[++L.len] = list("[id] ", "[delete_click.update("DELETE QUERY | STATE : [text_state()] | ALL/ELIG/FIN \
stat("[id] ", delete_click.update("DELETE QUERY | STATE : [text_state()] | ALL/ELIG/FIN \
[islist(obj_count_all)? length(obj_count_all) : (isnull(obj_count_all)? "0" : obj_count_all)]/\
[islist(obj_count_eligible)? length(obj_count_eligible) : (isnull(obj_count_eligible)? "0" : obj_count_eligible)]/\
[islist(obj_count_finished)? length(obj_count_finished) : (isnull(obj_count_finished)? "0" : obj_count_finished)] - [get_query_text()]")]", REF(delete_click))
L[++L.len] = list(" ", "[action_click.update("[SDQL2_IS_RUNNING? "HALT" : "RUN"]")]", REF(action_click))
return L
[islist(obj_count_finished)? length(obj_count_finished) : (isnull(obj_count_finished)? "0" : obj_count_finished)] - [get_query_text()]"))
stat(" ", action_click.update("[SDQL2_IS_RUNNING? "HALT" : "RUN"]"))
/datum/SDQL2_query/proc/delete_click()
admin_del(usr)
@@ -1164,18 +1161,10 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
return istype(thing, /datum) || istype(thing, /client)
/obj/effect/statclick/SDQL2_delete/Click()
if(!usr.client?.holder)
message_admins("[key_name_admin(usr)] non-holder clicked on a statclick! ([src])")
log_game("[key_name(usr)] non-holder clicked on a statclick! ([src])")
return
var/datum/SDQL2_query/Q = target
Q.delete_click()
/obj/effect/statclick/SDQL2_action/Click()
if(!usr.client?.holder)
message_admins("[key_name_admin(usr)] non-holder clicked on a statclick! ([src])")
log_game("[key_name(usr)] non-holder clicked on a statclick! ([src])")
return
var/datum/SDQL2_query/Q = target
Q.action_click()
@@ -1183,13 +1172,4 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
name = "VIEW VARIABLES"
/obj/effect/statclick/SDQL2_VV_all/Click()
if(!usr.client?.holder)
message_admins("[key_name_admin(usr)] non-holder clicked on a statclick! ([src])")
log_game("[key_name(usr)] non-holder clicked on a statclick! ([src])")
return
usr.client.debug_variables(GLOB.sdql2_queries)
if(!usr.client?.holder)
message_admins("[key_name_admin(usr)] non-holder clicked on a statclick! ([src])")
log_game("[key_name(usr)] non-holder clicked on a statclick! ([src])")
return

View File

@@ -89,23 +89,18 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//Tickets statpanel
/datum/admin_help_tickets/proc/stat_entry()
SHOULD_CALL_PARENT(TRUE)
SHOULD_NOT_SLEEP(TRUE)
var/list/L = list()
var/num_disconnected = 0
L[++L.len] = list("Active Tickets:", "[astatclick.update("[active_tickets.len]")]", null, REF(astatclick))
astatclick.update("[active_tickets.len]")
stat("Active Tickets:", astatclick.update("[active_tickets.len]"))
for(var/I in active_tickets)
var/datum/admin_help/AH = I
if(AH.initiator)
L[++L.len] = list("#[AH.id]. [AH.initiator_key_name]:", "[AH.statclick.update()]", REF(AH))
stat("#[AH.id]. [AH.initiator_key_name]:", AH.statclick.update())
else
++num_disconnected
if(num_disconnected)
L[++L.len] = list("Disconnected:", "[astatclick.update("[num_disconnected]")]", null, REF(astatclick))
L[++L.len] = list("Closed Tickets:", "[cstatclick.update("[closed_tickets.len]")]", null, REF(cstatclick))
L[++L.len] = list("Resolved Tickets:", "[rstatclick.update("[resolved_tickets.len]")]", null, REF(rstatclick))
return L
stat("Disconnected:", astatclick.update("[num_disconnected]"))
stat("Closed Tickets:", cstatclick.update("[closed_tickets.len]"))
stat("Resolved Tickets:", rstatclick.update("[resolved_tickets.len]"))
//Reassociate still open ticket if one exists
/datum/admin_help_tickets/proc/ClientLogin(client/C)
@@ -142,13 +137,6 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
/obj/effect/statclick/ticket_list/Click()
GLOB.ahelp_tickets.BrowseTickets(current_state)
//called by admin topic
/obj/effect/statclick/ticket_list/proc/Action()
Click()
//
//TICKET DATUM
//
@@ -233,7 +221,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//Removes the ahelp verb and returns it after 30 seconds
/datum/admin_help/proc/TimeoutVerb()
remove_verb(initiator, /client/verb/adminhelp)
initiator.verbs -= /client/verb/adminhelp
initiator.adminhelptimerid = addtimer(CALLBACK(initiator, /client/proc/giveadminhelpverb), 300, TIMER_STOPPABLE) //30 seconds cooldown of admin helps
//private
@@ -504,7 +492,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//
/client/proc/giveadminhelpverb()
add_verb(src, /client/verb/adminhelp)
src.verbs |= /client/verb/adminhelp
deltimer(adminhelptimerid)
adminhelptimerid = 0

View File

@@ -205,15 +205,15 @@ GLOBAL_LIST_EMPTY(dirty_vars)
set name = "Debug verbs - Enable"
if(!check_rights(R_DEBUG))
return
remove_verb(src, /client/proc/enable_debug_verbs)
add_verb(src, list(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping))
verbs -= /client/proc/enable_debug_verbs
verbs.Add(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/disable_debug_verbs()
set category = "Debug"
set name = "Debug verbs - Disable"
remove_verb(src, list(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping))
add_verb(src, /client/proc/enable_debug_verbs)
verbs.Remove(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping)
verbs += /client/proc/enable_debug_verbs
SSblackbox.record_feedback("tally", "admin_verb", 1, "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/count_objects_on_z_level()

View File

@@ -48,6 +48,6 @@
set desc = "Give this guy possess/release verbs"
set category = "Debug"
set name = "Give Possessing Verbs"
add_verb(M, /proc/possess)
add_verb(M, /proc/release)
M.verbs += /proc/possess
M.verbs += /proc/release
SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Possessing Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -223,16 +223,19 @@ GLOBAL_LIST_EMPTY(blob_nodes)
/mob/camera/blob/blob_act(obj/structure/blob/B)
return
/mob/camera/blob/get_status_tab_items()
. = ..()
if(blob_core)
. += "Core Health: [blob_core.obj_integrity]"
. += "Power Stored: [blob_points]/[max_blob_points]"
. += "Blobs to Win: [blobs_legit.len]/[blobwincount]"
if(!placed)
if(manualplace_min_time)
. += "Time Before Manual Placement: [max(round((manualplace_min_time - world.time)*0.1, 0.1), 0)]"
. += "Time Before Automatic Placement: [max(round((autoplace_max_time - world.time)*0.1, 0.1), 0)]"
/mob/camera/blob/Stat()
..()
if(statpanel("Status"))
if(blob_core)
stat(null, "Core Health: [blob_core.obj_integrity]")
stat(null, "Power Stored: [blob_points]/[max_blob_points]")
stat(null, "Blobs to Win: [blobs_legit.len]/[blobwincount]")
if(free_chem_rerolls)
stat(null, "You have [free_chem_rerolls] Free Chemical Reroll\s Remaining")
if(!placed)
if(manualplace_min_time)
stat(null, "Time Before Manual Placement: [max(round((manualplace_min_time - world.time)*0.1, 0.1), 0)]")
stat(null, "Time Before Automatic Placement: [max(round((autoplace_max_time - world.time)*0.1, 0.1), 0)]")
/mob/camera/blob/Move(NewLoc, Dir = 0)
if(placed)

View File

@@ -84,16 +84,17 @@ the new instance inside the host to be updated to the template's stats.
to_chat(src, "<span class='warning'>You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.</span>")
/mob/camera/disease/get_status_tab_items()
if(freemove)
. += "Host Selection Time: [round((freemove_end - world.time)/10)]s"
else
. += "Adaptation Points: [points]/[total_points]"
. += "Hosts: [disease_instances.len]"
var/adapt_ready = next_adaptation_time - world.time
if(adapt_ready > 0)
. += "Adaptation Ready: [round(adapt_ready/10, 0.1)]s"
/mob/camera/disease/Stat()
..()
if(statpanel("Status"))
if(freemove)
stat("Host Selection Time: [round((freemove_end - world.time)/10)]s")
else
stat("Adaptation Points: [points]/[total_points]")
stat("Hosts: [disease_instances.len]")
var/adapt_ready = next_adaptation_time - world.time
if(adapt_ready > 0)
stat("Adaptation Ready: [round(adapt_ready/10, 0.1)]s")
/mob/camera/disease/examine(mob/user)

View File

@@ -124,12 +124,12 @@
update_health_hud()
..()
/mob/living/simple_animal/revenant/get_status_tab_items()
. = ..()
. += "Current essence: [essence]/[essence_regen_cap]E"
. += "Stolen essence: [essence_accumulated]E"
. += "Stolen perfect souls: [perfectsouls]"
/mob/living/simple_animal/revenant/Stat()
..()
if(statpanel("Status"))
stat(null, "Current essence: [essence]/[essence_regen_cap]E")
stat(null, "Stolen essence: [essence_accumulated]E")
stat(null, "Stolen perfect souls: [perfectsouls]")
/mob/living/simple_animal/revenant/update_health_hud()
if(hud_used)

View File

@@ -107,7 +107,7 @@
/mob/living/simple_animal/hostile/swarmer/Initialize()
. = ..()
remove_verb(src, /mob/living/verb/pulled)
verbs -= /mob/living/verb/pulled
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.add_to_hud(src)
@@ -123,9 +123,10 @@
holder.pixel_y = I.Height() - world.icon_size
holder.icon_state = "hudstat"
/mob/living/simple_animal/hostile/swarmer/get_status_tab_items()
. = ..()
. += "Resources: [resources]"
/mob/living/simple_animal/hostile/swarmer/Stat()
..()
if(statpanel("Status"))
stat("Resources:",resources)
/mob/living/simple_animal/hostile/swarmer/emp_act()
. = ..()

View File

@@ -105,7 +105,7 @@
if("Immortality")
to_chat(user, "<B>Your wish is granted, but at a terrible cost...</B>")
to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.")
add_verb(user, /mob/living/carbon/proc/immortality)
user.verbs += /mob/living/carbon/proc/immortality
user.set_species(/datum/species/shadow)
if("To Kill")
to_chat(user, "<B>Your wish is granted, but at a terrible cost...</B>")

View File

@@ -4,10 +4,6 @@
//BLACK MAGIC THINGS//
//////////////////////
parent_type = /datum
/// hides the byond verb panel as we use our own custom version
show_verb_panel = FALSE
////////////////
//ADMIN THINGS//
////////////////
@@ -28,12 +24,6 @@
var/move_delay = 0
var/area = null
/// list of tabs containing spells and abilities
var/list/spell_tabs = list()
/// list of tabs containing verbs
var/list/verb_tabs = list()
///////////////
//SOUND STUFF//
///////////////

View File

@@ -197,7 +197,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
debug_tools_allowed = TRUE
//END CITADEL EDIT
else if(GLOB.deadmins[ckey])
add_verb(src, /client/proc/readmin)
verbs += /client/proc/readmin
connecting_admin = TRUE
if(CONFIG_GET(flag/autoadmin))
if(!GLOB.admin_datums[ckey])
@@ -243,7 +243,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
fps = 40
if(fexists(roundend_report_file()))
add_verb(src, /client/proc/show_previous_roundend_report)
verbs += /client/proc/show_previous_roundend_report
var/full_version = "[byond_version].[byond_build ? byond_build : "xxx"]"
log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[full_version]")
@@ -304,7 +304,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
set_macros()
chatOutput.start() // Starts the chat
src << browse(file('html/statbrowser.html'), "window=statbrowser") //starts stats tab
if(alert_mob_dupe_login)
spawn()
@@ -799,9 +798,9 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
/client/proc/add_verbs_from_config()
if(CONFIG_GET(flag/see_own_notes))
add_verb(src, /client/proc/self_notes)
verbs += /client/proc/self_notes
if(CONFIG_GET(flag/use_exp_tracking))
add_verb(src, /client/proc/self_playtime)
verbs += /client/proc/self_playtime
#undef UPLOAD_LIMIT
@@ -866,24 +865,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
y = CLAMP(y+change, min,max)
change_view("[x]x[y]")
/// compiles a full list of verbs and sends it to the browser
/client/proc/init_verbs()
if(IsAdminAdvancedProcCall())
return
var/list/verblist = list()
verb_tabs.Cut()
for(var/thing in (verbs + mob?.verbs))
var/procpath/verb_to_init = thing
if(!verb_to_init)
continue
if(verb_to_init.hidden)
continue
if(!istext(verb_to_init.category))
continue
verb_tabs |= verb_to_init.category
verblist[++verblist.len] = list(verb_to_init.category, verb_to_init.name)
src << output("[url_encode(json_encode(verb_tabs))];[url_encode(json_encode(verblist))]", "statbrowser:init_verbs")
/client/proc/change_view(new_size)
if (isnull(new_size))
CRASH("change_view called without argument.")

View File

@@ -37,7 +37,6 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
src << output(null, "statbrowser:set_light_theme")
/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
//Main windows
@@ -63,5 +62,4 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
//Etc.
winset(src, "say", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
src << output(null, "statbrowser:set_dark_theme")
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")

View File

@@ -366,10 +366,3 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
pct += delta
winset(src, "mainwindow.split", "splitter=[pct]")
/client/verb/fix_stat_panel()
set name = "Fix Stat Panel"
set hidden = TRUE
init_verbs()

View File

@@ -21,6 +21,6 @@
/datum/round_event/wizard/possession/start()
for(var/mob/dead/observer/G in GLOB.player_list)
add_verb(G, /mob/dead/observer/verb/boo)
add_verb(G, /mob/dead/observer/verb/possess)
G.verbs += /mob/dead/observer/verb/boo
G.verbs += /mob/dead/observer/verb/possess
to_chat(G, "You suddenly feel a welling of new spooky powers...")

View File

@@ -17,7 +17,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
prepare_huds()
if(length(CONFIG_GET(keyed_list/cross_server)))
add_verb(src, /mob/dead/proc/server_hop)
verbs += /mob/dead/proc/server_hop
set_focus(src)
return INITIALIZE_HINT_NORMAL
@@ -42,26 +42,27 @@ INITIALIZE_IMMEDIATE(/mob/dead)
loc = destination
Moved(oldloc, NONE, TRUE)
/mob/dead/Stat()
..()
/mob/dead/get_status_tab_items()
. = ..()
. += ""
//. += "Game Mode: [SSticker.hide_mode ? "Secret" : "[GLOB.master_mode]"]"
if(!statpanel("Status"))
return
//stat(null, "Game Mode: [SSticker.hide_mode ? "Secret" : "[GLOB.master_mode]"]")
if(SSticker.HasRoundStarted())
return
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining > 0)
. += "Time To Start: [round(time_remaining/10)]s"
stat(null, "Time To Start: [round(time_remaining/10)]s")
else if(time_remaining == -10)
. += "Time To Start: DELAYED"
stat(null, "Time To Start: DELAYED")
else
. += "Time To Start: SOON"
stat(null, "Time To Start: SOON")
. += "Players: [SSticker.totalPlayers]"
stat(null, "Players: [SSticker.totalPlayers]")
if(client.holder)
. += "Players Ready: [SSticker.totalPlayersReady]"
stat(null, "Players Ready: [SSticker.totalPlayersReady]")
/mob/dead/proc/server_hop()
set category = "OOC"
@@ -73,7 +74,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
var/pick
switch(csa.len)
if(0)
remove_verb(src, /mob/dead/proc/server_hop)
verbs -= /mob/dead/proc/server_hop
to_chat(src, "<span class='notice'>Server Hop has been disabled.</span>")
if(1)
pick = csa[0]

View File

@@ -303,7 +303,6 @@
if(observer.client && observer.client.prefs)
observer.real_name = observer.client.prefs.real_name
observer.name = observer.real_name
observer.client.init_verbs()
observer.update_icon()
observer.stop_sound_channel(CHANNEL_LOBBYMUSIC)
QDEL_NULL(mind)
@@ -398,7 +397,6 @@
character.update_parallax_teleport()
SSticker.minds += character.mind
character.client.init_verbs() // init verbs for the late join
var/mob/living/carbon/human/humanc
if(ishuman(character))
@@ -592,7 +590,6 @@
mind.transfer_to(H) //won't transfer key since the mind is not active
H.name = real_name
client.init_verbs()
//h13 assign your characters custom height.
if (H.custom_body_size) //Do they have it set?
H.resize(H.custom_body_size * 0.01)

View File

@@ -59,10 +59,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
/mob/dead/observer/Initialize()
set_invisibility(GLOB.observer_default_invisibility)
add_verb(src, list(
verbs += list(
/mob/dead/observer/proc/dead_tele,
/mob/dead/observer/proc/open_spawners_menu,
/mob/dead/observer/proc/view_gas))
/mob/dead/observer/proc/view_gas)
if(icon_state in GLOB.ghost_forms_with_directions_list)
ghostimage_default = image(src.icon,src,src.icon_state + "_nodir")
@@ -120,8 +120,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
real_name = name
if(!fun_verbs)
remove_verb(src, /mob/dead/observer/verb/boo)
remove_verb(src, /mob/dead/observer/verb/possess)
verbs -= /mob/dead/observer/verb/boo
verbs -= /mob/dead/observer/verb/possess
animate(src, pixel_y = 2, time = 10, loop = -1)
@@ -270,7 +270,6 @@ Works together with spawning an observer, noted above.
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.client.init_verbs()
if (client && client.prefs && client.prefs.auto_ooc)
if (!(client.prefs.chat_toggles & CHAT_OOC))
client.prefs.chat_toggles ^= CHAT_OOC
@@ -368,7 +367,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
client.change_view(CONFIG_GET(string/default_view))
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
mind.current.key = key
mind.current.client.init_verbs()
return 1
/mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE)
@@ -779,11 +777,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
ghostimage_simple.icon_state = icon_state
if("fun_verbs")
if(fun_verbs)
add_verb(src, /mob/dead/observer/verb/boo)
add_verb(src, /mob/dead/observer/verb/possess)
verbs += /mob/dead/observer/verb/boo
verbs += /mob/dead/observer/verb/possess
else
remove_verb(src, /mob/dead/observer/verb/boo)
remove_verb(src, /mob/dead/observer/verb/possess)
verbs -= /mob/dead/observer/verb/boo
verbs -= /mob/dead/observer/verb/possess
/mob/dead/observer/reset_perspective(atom/A)
if(client)

View File

@@ -26,8 +26,8 @@
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
/mob/living/carbon/alien/Initialize()
add_verb(src, /mob/living/proc/mob_sleep)
add_verb(src, /mob/living/proc/lay_down)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
create_bodyparts() //initialize bodyparts
@@ -86,10 +86,11 @@
/mob/living/carbon/alien/IsAdvancedToolUser()
return has_fine_manipulation
/mob/living/carbon/alien/Stat()
..()
/mob/living/carbon/alien/get_status_tab_items()
. = ..()
. += "Intent: [a_intent]"
if(statpanel("Status"))
stat(null, "Intent: [a_intent]")
/mob/living/carbon/alien/getTrail()
if(getBruteLoss() < 200)

View File

@@ -143,10 +143,10 @@ Doesn't work on other aliens/AI.*/
action_icon_state = "alien_acid"
/obj/effect/proc_holder/alien/acid/on_gain(mob/living/carbon/user)
add_verb(user, /mob/living/carbon/proc/corrosive_acid)
user.verbs.Add(/mob/living/carbon/proc/corrosive_acid)
/obj/effect/proc_holder/alien/acid/on_lose(mob/living/carbon/user)
remove_verb(user, /mob/living/carbon/proc/corrosive_acid)
user.verbs.Remove(/mob/living/carbon/proc/corrosive_acid)
/obj/effect/proc_holder/alien/acid/proc/corrode(atom/target,mob/living/carbon/user = usr)
if(target in oview(1,user))

View File

@@ -29,9 +29,11 @@
internal_organs += new /obj/item/organ/alien/plasmavessel/small/tiny
..()
/mob/living/carbon/alien/larva/get_status_tab_items()
. = ..()
. += "Progress: [amount_grown]/[max_grown]"
//This needs to be fixed
/mob/living/carbon/alien/larva/Stat()
..()
if(statpanel("Status"))
stat(null, "Progress: [amount_grown]/[max_grown]")
/mob/living/carbon/alien/larva/adjustPlasma(amount)
if(stat != DEAD && amount > 0)

View File

@@ -465,18 +465,16 @@
var/turf/target = get_turf(loc)
I.safe_throw_at(target,I.throw_range,I.throw_speed,src, force = move_force)
/mob/living/carbon/Stat()
..()
if(statpanel("Status"))
var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel)
if(vessel)
stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]")
if(locate(/obj/item/assembly/health) in src)
stat(null, "Health: [health]")
/mob/living/carbon/get_status_tab_items()
. = ..()
var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel)
if(vessel)
. += "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]"
if(locate(/obj/item/assembly/health) in src)
. += "Health: [health]"
/mob/living/carbon/get_proc_holders()
. = ..()
. += add_abilities_to_panel()
add_abilities_to_panel()
/mob/living/carbon/attack_ui(slot)
if(!has_hand_for_held_index(active_hand_index))
@@ -997,4 +995,4 @@
/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE)
if(combatmode)
toggle_combat_mode(TRUE, TRUE)
return ..()
return ..()

View File

@@ -6,8 +6,9 @@
appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
/mob/living/carbon/human/Initialize()
add_verb(src, /mob/living/proc/mob_sleep)
add_verb(src, /mob/living/proc/lay_down)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
verbs += /mob/living/carbon/human/proc/underwear_toggle //fwee
time_initialized = world.time
//initialize limbs first
@@ -61,52 +62,70 @@
add_to_all_human_data_huds()
/mob/living/carbon/human/get_status_tab_items()
. = ..()
. += "Intent: [a_intent]"
. += "Move Mode: [m_intent]"
if (internal)
if (!internal.air_contents)
qdel(internal)
else
. += ""
. += "Internal Atmosphere Info: [internal.name]"
. += "Tank Pressure: [internal.air_contents.return_pressure()]"
. += "Distribution Pressure: [internal.distribute_pressure]"
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
. += ""
. += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]"
. += "Absorbed DNA: [changeling.absorbedcount]"
/mob/living/carbon/human/Stat()
..()
//Same thing from mob
if(statpanel("Status"))
if(tickrefresh == 1)
sList2 = list()
sList2 += "Intent: [a_intent]"
sList2 += "Move Mode: [m_intent]"
if (internal)
if (!internal.air_contents)
qdel(internal)
else
sList2 += "Internal Atmosphere Info: "+ "[internal.name]"
sList2 += "Tank Pressure: "+ "[internal.air_contents.return_pressure()]"
sList2 += "Distribution Pressure: "+ "[internal.distribute_pressure]"
if(mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
sList2 += "Chemical Storage: " + "[changeling.chem_charges]/[changeling.chem_storage]"
sList2 += "Absorbed DNA: "+ "[changeling.absorbedcount]"
var/datum/antagonist/nightmare/nightmare = mind.has_antag_datum(/datum/antagonist/nightmare)
if(nightmare)
for(var/datum/objective/O in mind.objectives)
if(istype(O, /datum/objective/break_lights))
var/datum/objective/break_lights/BL = O
if(BL.mode) //Keeping lights out of areas
var/T = "Target Area(s): "
for(var/area/I in BL.area_targets)
T += "[initial(I.name)], "
sList2 += T
else //Break number of lights
sList2 += "Lights Broken: " + "[BL.lightsbroken]/[BL.target_amount]"
if (sList2 != null)
stat(null, "[sList2.Join("\n\n")]")
//NINJACODE
if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja.
var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit
. += "SpiderOS Status: [SN.s_initialized ? "Initialized" : "Disabled"]"
. += "Current Time: [station_time_timestamp()]"
if(SN.s_initialized)
//Suit gear
. += "Energy Charge: [round(SN.cell.charge/100)]%"
. += "Smoke Bombs: \Roman [SN.s_bombs]"
//Ninja status
. += "Fingerprints: [md5(dna.uni_identity)]"
. += "Unique Identity: [dna.unique_enzymes]"
. += "Overall Status: [stat > 1 ? "dead" : "[health]% healthy"]"
. += "Nutrition Status: [nutrition]"
. += "Oxygen Loss: [getOxyLoss()]"
. += "Toxin Levels: [getToxLoss()]"
. += "Burn Severity: [getFireLoss()]"
. += "Brute Trauma: [getBruteLoss()]"
. += "Radiation Levels: [radiation] rad"
. += "Body Temperature: [bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)"
if(statpanel("SpiderOS"))
stat("SpiderOS Status:","[SN.s_initialized ? "Initialized" : "Disabled"]")
stat("Current Time:", "[STATION_TIME_TIMESTAMP("hh:mm:ss")]")
if(SN.s_initialized)
//Suit gear
stat("Energy Charge:", "[round(SN.cell.charge/100)]%")
stat("Smoke Bombs:", "\Roman [SN.s_bombs]")
//Ninja status
stat("Fingerprints:", "[md5(dna.uni_identity)]")
stat("Unique Identity:", "[dna.unique_enzymes]")
stat("Overall Status:", "[stat > 1 ? "dead" : "[health]% healthy"]")
stat("Nutrition Status:", "[nutrition]")
stat("Hydration Status:", "[thirst]")
stat("Oxygen Loss:", "[getOxyLoss()]")
stat("Toxin Levels:", "[getToxLoss()]")
stat("Burn Severity:", "[getFireLoss()]")
stat("Brute Trauma:", "[getBruteLoss()]")
stat("Radiation Levels:","[radiation] rad")
stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)")
//Diseases
if(length(diseases))
. += "Viruses:"
for(var/thing in diseases)
var/datum/disease/D = thing
. += "* [D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]"
//Diseases
if(diseases.len)
stat("Viruses:", null)
for(var/thing in diseases)
var/datum/disease/D = thing
stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
/mob/living/carbon/human/show_inv(mob/user)

View File

@@ -17,8 +17,8 @@
hud_type = /datum/hud/monkey
/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
add_verb(src, /mob/living/proc/mob_sleep)
add_verb(src, /mob/living/proc/lay_down)
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
if(unique_name) //used to exclude pun pun
gender = pick(MALE, FEMALE)
@@ -89,16 +89,16 @@
return
add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
/mob/living/carbon/monkey/get_status_tab_items()
. = ..()
. += "Intent: [a_intent]"
. += "Move Mode: [m_intent]"
if(client && mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
. += ""
. += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]"
. += "Absorbed DNA: [changeling.absorbedcount]"
/mob/living/carbon/monkey/Stat()
..()
if(statpanel("Status"))
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
if(client && mind)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]")
stat("Absorbed DNA", changeling.absorbedcount)
return

View File

@@ -1104,10 +1104,8 @@
A.action.Remove(src)
/mob/living/proc/add_abilities_to_panel()
var/list/L = list()
for(var/obj/effect/proc_holder/A in abilities)
L[++L.len] = list("[A.panel]",A.get_panel_text(),A.name,"[REF(A)]")
return L
statpanel("[A.panel]",A.get_panel_text(),A)
/mob/living/lingcheck()
if(mind)

View File

@@ -137,7 +137,7 @@
spark_system.set_up(5, 0, src)
spark_system.attach(src)
add_verb(src, /mob/living/silicon/ai/proc/show_laws_verb)
verbs += /mob/living/silicon/ai/proc/show_laws_verb
aiPDA = new/obj/item/pda/ai(src)
aiPDA.owner = name
@@ -151,10 +151,10 @@
deploy_action.Grant(src)
if(isturf(loc))
add_verb(src, list(/mob/living/silicon/ai/proc/ai_network_change, \
verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
/mob/living/silicon/ai/proc/botcall, /mob/living/silicon/ai/proc/control_integrated_radio, \
/mob/living/silicon/ai/proc/set_automatic_say_channel))
/mob/living/silicon/ai/proc/set_automatic_say_channel)
GLOB.ai_list += src
GLOB.shuttle_caller_list += src
@@ -205,26 +205,26 @@
display_icon_override = ai_core_icon
set_core_display_icon(ai_core_icon)
/mob/living/silicon/ai/get_status_tab_items()
. = ..()
if(stat != CONSCIOUS)
. += text("Systems nonfunctional")
return
. += text("System integrity: [(health + 100) * 0.5]%")
. += text("Connected cyborgs: [length(connected_robots)]")
for(var/r in connected_robots)
var/mob/living/silicon/robot/connected_robot = r
var/robot_status = "Nominal"
if(connected_robot.shell)
robot_status = "AI SHELL"
else if(connected_robot.stat != CONSCIOUS || !connected_robot.client)
robot_status = "OFFLINE"
else if(!connected_robot.cell || connected_robot.cell.charge <= 0)
robot_status = "DEPOWERED"
//Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies!
. += text("[connected_robot.name] | S.Integrity: [connected_robot.health]% | Cell: [connected_robot.cell ? "[connected_robot.cell.charge]/[connected_robot.cell.maxcharge]" : "Empty"] | \
Module: [connected_robot.designation] | Loc: [get_area_name(connected_robot, TRUE)] | Status: [robot_status]")
. += text("AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]") //Count of total AI shells
/mob/living/silicon/ai/Stat()
..()
if(statpanel("Status"))
if(!stat)
stat(null, text("System integrity: [(health+100)/2]%"))
stat(null, text("Connected cyborgs: [connected_robots.len]"))
for(var/mob/living/silicon/robot/R in connected_robots)
var/robot_status = "Nominal"
if(R.shell)
robot_status = "AI SHELL"
else if(R.stat || !R.client)
robot_status = "OFFLINE"
else if(!R.cell || R.cell.charge <= 0)
robot_status = "DEPOWERED"
//Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies!
stat(null, text("[R.name] | S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "Empty"] | \
Module: [R.designation] | Loc: [get_area_name(R, TRUE)] | Status: [robot_status]"))
stat(null, text("AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]")) //Count of total AI shells
else
stat(null, text("Systems nonfunctional"))
/mob/living/silicon/ai/proc/ai_alerts()
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"

View File

@@ -172,12 +172,13 @@
else
client.eye = card
/mob/living/silicon/pai/get_status_tab_items()
. += ..()
if(!stat)
. += text("Emitter Integrity: [emitterhealth * (100/emittermaxhealth)]")
else
. += text("Systems nonfunctional")
/mob/living/silicon/pai/Stat()
..()
if(statpanel("Status"))
if(!stat)
stat(null, text("Emitter Integrity: [emitterhealth * (100/emittermaxhealth)]"))
else
stat(null, text("Systems nonfunctional"))
/mob/living/silicon/pai/restrained(ignore_grab)
. = FALSE

View File

@@ -321,20 +321,19 @@
if(thruster_button)
thruster_button.icon_state = "ionpulse[ionpulse_on]"
/mob/living/silicon/robot/Stat()
..()
if(statpanel("Status"))
if(cell)
stat("Charge Left:", "[cell.charge]/[cell.maxcharge]")
else
stat(null, text("No Cell Inserted!"))
/mob/living/silicon/robot/get_status_tab_items()
. = ..()
. += ""
if(cell)
. += "Charge Left: [cell.charge]/[cell.maxcharge]"
else
. += text("No Cell Inserted!")
if(module)
for(var/datum/robot_energy_storage/st in module.storages)
. += "[st.name]: [st.energy]/[st.max_energy]"
if(connected_ai)
. += "Master AI: [connected_ai.name]"
if(module)
for(var/datum/robot_energy_storage/st in module.storages)
stat("[st.name]:", "[st.energy]/[st.max_energy]")
if(connected_ai)
stat("Master AI:", connected_ai.name)
/mob/living/silicon/robot/restrained(ignore_grab)
. = 0

View File

@@ -38,7 +38,7 @@
/mob/living/simple_animal/pet/cat/Initialize()
. = ..()
add_verb(src, /mob/living/proc/lay_down)
verbs += /mob/living/proc/lay_down
/mob/living/simple_animal/pet/cat/ComponentInitialize()
. = ..()

View File

@@ -154,17 +154,18 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
REMOVE_TRAIT(summoner, TRAIT_NODEATH, "memento_mori")
to_chat(summoner,"<span class='danger'>You feel incredibly vulnerable as the memento mori pulls your life force in one too many directions!")
/mob/living/simple_animal/hostile/guardian/get_status_tab_items()
. += ..()
if(summoner)
var/resulthealth
if(iscarbon(summoner))
resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100)
else
resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5)
. += "Summoner Health: [resulthealth]%"
if(cooldown >= world.time)
. += "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]"
/mob/living/simple_animal/hostile/guardian/Stat()
..()
if(statpanel("Status"))
if(summoner)
var/resulthealth
if(iscarbon(summoner))
resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100)
else
resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5)
stat(null, "Summoner Health: [resulthealth]%")
if(cooldown >= world.time)
stat(null, "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]")
/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
. = ..()
@@ -440,13 +441,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
to_chat(src, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> has been summoned!</span>")
guardians -= G
if(!guardians.len)
remove_verb(src, /mob/living/proc/guardian_reset)
verbs -= /mob/living/proc/guardian_reset
else
to_chat(src, "<span class='holoparasite'>There were no ghosts willing to take control of <font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font>. Looks like you're stuck with it for now.</span>")
else
to_chat(src, "<span class='holoparasite'>You decide not to reset [guardians.len > 1 ? "any of your guardians":"your guardian"].</span>")
else
remove_verb(src, /mob/living/proc/guardian_reset)
verbs -= /mob/living/proc/guardian_reset
////////parasite tracking/finding procs
@@ -570,9 +571,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
if("carp")
to_chat(user, "[G.carp_fluff_string]")
to_chat(user, "<span class='holoparasite'><font color=\"[G.namedatum.colour]\"><b>[G.real_name]</b></font> has been caught!</span>")
add_verb(user, list(/mob/living/proc/guardian_comm, \
/mob/living/proc/guardian_recall, \
/mob/living/proc/guardian_reset))
user.verbs += /mob/living/proc/guardian_comm
user.verbs += /mob/living/proc/guardian_recall
user.verbs += /mob/living/proc/guardian_reset
/obj/item/guardiancreator/choose
random = FALSE

View File

@@ -24,10 +24,11 @@
if(loc == summoner && toggle)
ToggleMode(0)
/mob/living/simple_animal/hostile/guardian/assassin/get_status_tab_items()
. = ..()
if(stealthcooldown >= world.time)
. += "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]"
/mob/living/simple_animal/hostile/guardian/assassin/Stat()
..()
if(statpanel("Status"))
if(stealthcooldown >= world.time)
stat(null, "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]")
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
. = ..()

View File

@@ -7,10 +7,11 @@
carp_fluff_string = "<span class='holoparasite'>CARP CARP CARP! Caught one! It's an explosive carp! Boom goes the fishy.</span>"
var/bomb_cooldown = 0
/mob/living/simple_animal/hostile/guardian/bomb/get_status_tab_items()
. = ..()
if(bomb_cooldown >= world.time)
. += "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]"
/mob/living/simple_animal/hostile/guardian/bomb/Stat()
..()
if(statpanel("Status"))
if(bomb_cooldown >= world.time)
stat(null, "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]")
/mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget()
. = ..()

View File

@@ -17,11 +17,11 @@
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/living/simple_animal/hostile/guardian/healer/get_status_tab_items()
. = ..()
if(beacon_cooldown >= world.time)
. += "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]"
/mob/living/simple_animal/hostile/guardian/healer/Stat()
..()
if(statpanel("Status"))
if(beacon_cooldown >= world.time)
stat(null, "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]")
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
. = ..()

View File

@@ -128,7 +128,7 @@
/mob/living/simple_animal/hostile/jungle/leaper/Initialize()
. = ..()
remove_verb(src, /mob/living/verb/pulled)
verbs -= /mob/living/verb/pulled
/mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A)
face_atom(A)

View File

@@ -638,8 +638,8 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/lightgeist/Initialize()
. = ..()
remove_verb(src, /mob/living/verb/pulled)
remove_verb(src, /mob/verb/me_verb)
verbs -= /mob/living/verb/pulled
verbs -= /mob/verb/me_verb
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
@@ -728,7 +728,7 @@ Difficulty: Very Hard
L.mind.transfer_to(holder_animal)
var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession
holder_animal.mind.AddSpell(P)
remove_verb(holder_animal, /mob/living/verb/pulled)
holder_animal.verbs -= /mob/living/verb/pulled
/obj/structure/closet/stasis/dump_contents(var/kill = 1)
STOP_PROCESSING(SSobj, src)

View File

@@ -110,12 +110,12 @@
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
add_verb(src, list(/mob/living/simple_animal/parrot/proc/steal_from_ground, \
verbs.Add(/mob/living/simple_animal/parrot/proc/steal_from_ground, \
/mob/living/simple_animal/parrot/proc/steal_from_mob, \
/mob/living/simple_animal/parrot/verb/drop_held_item_player, \
/mob/living/simple_animal/parrot/proc/perch_player, \
/mob/living/simple_animal/parrot/proc/toggle_mode,
/mob/living/simple_animal/parrot/proc/perch_mob_player))
/mob/living/simple_animal/parrot/proc/perch_mob_player)
/mob/living/simple_animal/parrot/examine(mob/user)
@@ -137,12 +137,11 @@
..(gibbed)
/mob/living/simple_animal/parrot/get_status_tab_items()
. = ..()
. += ""
. += "Held Item: [held_item]"
. += "Mode: [a_intent]"
/mob/living/simple_animal/parrot/Stat()
..()
if(statpanel("Status"))
stat("Held Item", held_item)
stat("Mode",a_intent)
/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
. = ..()

View File

@@ -5,7 +5,7 @@
maxHealth = 20
gender = PLURAL //placeholder
blood_volume = 550 //How much blud it has for bloodsucking
status_flags = CANPUSH
var/icon_living = ""
@@ -294,11 +294,11 @@
remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE)
add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE)
/mob/living/simple_animal/get_status_tab_items()
. = ..()
. += ""
. += "Health: [round((health / maxHealth) * 100)]%"
/mob/living/simple_animal/Stat()
..()
if(statpanel("Status"))
stat(null, "Health: [round((health / maxHealth) * 100)]%")
return 1
/mob/living/simple_animal/proc/drop_loot()
if(loot.len)

View File

@@ -197,21 +197,21 @@
/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0)
return 2
/mob/living/simple_animal/slime/get_status_tab_items()
/mob/living/simple_animal/slime/Stat()
if(..())
if(!docile)
. += "Nutrition: [nutrition]/[get_max_nutrition()]"
stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
if(amount_grown >= SLIME_EVOLUTION_THRESHOLD)
if(is_adult)
. += "You can reproduce!"
stat(null, "You can reproduce!")
else
. += "You can evolve!"
stat(null, "You can evolve!")
if(stat == UNCONSCIOUS)
. += "You are knocked out by high levels of BZ!"
stat(null,"You are knocked out by high levels of BZ!")
else
. += "Power Level: [powerlevel]"
stat(null,"Power Level: [powerlevel]")
/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)

View File

@@ -572,7 +572,7 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
/mob/proc/is_muzzled()
return 0
/*
/mob/Stat()
..()
//This is where I try and add a temporary solution to the issue of the status tab. This solution is bad and I should feel bad, but it should mitigate some of the client lag.
@@ -646,31 +646,25 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
if(A.IsObscured())
continue
statpanel(listed_turf.name, null, A)
*/
/// Adds this list to the output to the stat browser
/mob/proc/get_status_tab_items()
. = list()
/// Gets all relevant proc holders for the browser statpenl
/mob/proc/get_proc_holders()
. = list()
if(mind)
. += get_spells_for_statpanel(mind.spell_list)
. += get_spells_for_statpanel(mob_spell_list)
add_spells_to_statpanel(mind.spell_list)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling)
add_stings_to_statpanel(changeling.purchasedpowers)
add_spells_to_statpanel(mob_spell_list)
/mob/proc/get_spells_for_statpanel(list/spells)
var/list/L = list()
/mob/proc/add_spells_to_statpanel(list/spells)
for(var/obj/effect/proc_holder/spell/S in spells)
if(S.can_be_cast_by(src))
switch(S.charge_type)
if("recharge")
L[++L.len] = list("[S.panel]", "[S.charge_counter/10.0]/[S.charge_max/10]", S.name, REF(S))
statpanel("[S.panel]","[S.charge_counter/10.0]/[S.charge_max/10]",S)
if("charges")
L[++L.len] = list("[S.panel]", "[S.charge_counter]/[S.charge_max]", S.name, REF(S))
statpanel("[S.panel]","[S.charge_counter]/[S.charge_max]",S)
if("holdervar")
L[++L.len] = list("[S.panel]", "[S.holder_var_type] [S.holder_var_amount]", S.name, REF(S))
return L
statpanel("[S.panel]","[S.holder_var_type] [S.holder_var_amount]",S)
/mob/proc/add_stings_to_statpanel(list/stings)
for(var/obj/effect/proc_holder/changeling/S in stings)
@@ -800,8 +794,6 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
if(istype(S, spell))
mob_spell_list -= S
qdel(S)
if(client)
client << output(null, "statbrowser:check_spells")
/mob/proc/anti_magic_check(magic = TRUE, holy = FALSE)
if(!magic && !holy)

View File

@@ -1,896 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Stat Browser</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link id="goonStyle" rel="stylesheet" type="text/css" href="browserOutput_white.css" media="all" />
<style>
body {
font-family: Verdana, Geneva, Tahoma, sans-serif;
font-size: 12px !important;
margin: 5px !important;
padding: 2px !important;
}
body.dark {
background-color: #131313;
color: #abc6ec;
}
#menu {
background-color: white;
}
.dark #menu {
background-color: #131313;
}
a {
color: black;
text-decoration: none
}
.dark a {
color: #abc6ec;
}
a:hover, .dark a:hover {
text-decoration: underline;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
background-color: #333;
}
li {
float: left;
}
li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
li a:hover:not(.active) {
background-color: #111;
}
.button-container {
display: inline-flex;
flex-wrap: wrap;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
min-width: 0;
min-height: 0;
white-space: pre-wrap;
}
.button {
background-color: #FFFFFE;
border-color: rgba(255, 255, 254, 0.5);
border-width: 1px;
color: black;
padding: 7px 14px;
text-align: center;
text-decoration: none;
font-size: 12px;
margin: 2px 2px;
cursor: pointer;
border-radius: 10%;
transition-duration: 0.25s;
order: 3;
}
.dark button {
background-color: #252525;
border-color: rgba(37, 37, 36, 0.5);
color: white;
}
.button:hover {
border-color: rgba(255, 255, 254, 0.5);
background-color: #252525;
color: white;
}
.dark button:hover {
border-color: rgba(37, 37, 36, 0.5);
background-color: #FFFFFE;
color: #252525;
}
.button:active, .button.active {
text-decoration: underline;
}
.grid-container {
display: inline-flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: flex-start;
min-width: 0;
min-height: 0;
white-space: pre-wrap;
}
.grid-item {
color: black;
width: 150px;
font-size: 11px;
line-height: 24px;
text-align: left;
min-width: 0;
min-height: 0;
white-space: pre-wrap;
padding-right: 12px; /* A little more than two spaces, to look good in IE8 where flex-justify does nothing */
}
.link {
display: inline;
background: none;
border: none;
padding: 7px 14px;
color: black;
text-decoration: none;
cursor: pointer;
font-size: 13px;
margin: 2px 2px;
}
.dark .link {
color: #abc6ec;
}
.link:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<ul id="menu" class="button-container"></ul>
<div id="statcontent"></div>
<script>
// Polyfills and compatibility ------------------------------------------------
var decoder = decodeURIComponent || unescape;
var addEventListenerKey = (document.addEventListener ? 'addEventListener' : 'attachEvent'); // IE8 handling for Wine users
var textContentKey = (typeof document.body.textContent != 'undefined') ? 'textContent' : 'innerText';
if(!Array.prototype.includes) {
Array.prototype.includes = function(thing) {
for(var i = 0; i < this.length; i++) {
if(this[i] == thing) return true;
}
return false;
}
}
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}
// Browser passthrough code ---------------------------------------------------
if (window.location) {
var anti_spam = []; // wow I wish I could use e.repeat but IE is dumb and doesn't have it.
document[addEventListenerKey]("keydown", function(e) {
if(e.target && (e.target.localName == "input" || e.target.localName == "textarea"))
return;
if(e.defaultPrevented)
return; // do e.preventDefault() to prevent this behavior.
if(e.which) {
if(!anti_spam[e.which]) {
anti_spam[e.which] = true;
var href = "?__keydown=" + e.which;
if(e.ctrlKey === false) href += "&ctrlKey=0"
else if(e.ctrlKey === true) href += "&ctrlKey=1"
window.location.href = href;
}
}
});
document[addEventListenerKey]("keyup", function(e) {
if(e.target && (e.target.localName == "input" || e.target.localName == "textarea"))
return;
if(e.defaultPrevented)
return;
if(e.which) {
anti_spam[e.which] = false;
var href = "?__keyup=" + e.which;
if(e.ctrlKey === false) href += "&ctrlKey=0"
else if(e.ctrlKey === true) href += "&ctrlKey=1"
window.location.href = href;
}
});
}
/* document.addEventListener("mousedown", function(e){
var shiftPressed=0;
var evt = e?e:window.event;
shiftPressed=evt.shiftKey;
if (shiftPressed) {
return false;
}
return true;
}); */
// Status panel implementation ------------------------------------------------
var status_tab_parts = ["loading..."];
var current_tab = null;
var mc_tab_parts = [["loading...", ""]];
var href_token = null;
var spells = [];
var spell_tabs = [];
var verb_tabs = [];
var verbs = [["", ""]]; // list with a list inside
var inner = "";
var tickets = [];
var sqdl2 = [];
var permanent_tabs = []; // tabs that won't be cleared by wipes
var turfcontents = [];
var turfname = "";
var menu = document.querySelector('#menu');
function createStatusTab(name) {
if(document.getElementById(name) || name.trim() == "")
return;
if(!verb_tabs.includes(name) && !permanent_tabs.includes(name))
return;
var B = document.createElement("BUTTON");
B.onclick = function() {tab_change(name)};
B.id = name;
B[textContentKey] = name;
B.className = "button";
//ORDERING ALPHABETICALLY
B.style.order = name.charCodeAt(0);
if(name == "Status" || name == "MC") {
if(name == "Status")
B.style.order = 1;
else
B.style.order = 2;
}
//END ORDERING
menu.appendChild(B);
}
function removeStatusTab(name) {
if(!document.getElementById(name) || permanent_tabs.includes(name))
return;
for (var i = verb_tabs.length - 1; i >= 0; --i) {
if (verb_tabs[i] == name) {
verb_tabs.splice(i, 1);
}
}
menu.removeChild(document.getElementById(name));
if(document.getElementById(name)) // repeat for duplicates
removeStatusTab(name);
}
function addPermanentTab(name) {
if(!permanent_tabs.includes(name))
permanent_tabs.push(name);
createStatusTab(name);
}
function removePermanentTab(name) {
for (var i = permanent_tabs.length - 1; i >= 0; --i) {
if (permanent_tabs[i] == name) {
permanent_tabs.splice(i, 1);
}
}
removeStatusTab(name);
}
function checkStatusTab() {
for(var i=0; i < menu.children.length; i++)
if(!verb_tabs.includes(menu.children[i].id) && !permanent_tabs.includes(menu.children[i].id))
removeStatusTab(menu.children[i].id);
}
function add_verb(v) {
var to_add = JSON.parse(v);
var cat = "";
cat = to_add[0];
if(verb_tabs.includes(cat)){ // we have the category already
verbs.push(to_add); // add it to verb list and we done
} else if(cat.trim() != "") { // we don't have the category
verb_tabs.push(cat);
verbs.push(to_add); // add verb
createStatusTab(cat); // create the category
}
if(current_tab == cat) {
draw_verbs(cat); // redraw if we added a verb to the tab we're currently in
}
}
function remove_verb(v) {
var verb_to_remove = v; // to_remove = [verb:category, verb:name]
for(var i = verbs.length - 1; i >= 0; i--){
var part_to_remove = verbs[i];
if(part_to_remove[1] == verb_to_remove[1]){
verbs.splice(i, 1)
}
}
}
function check_verbs() {
for(var v = verb_tabs.length - 1; v >= 0; v--){
verbs_cat_check(verb_tabs[v]);
}
//checkStatusTab(); // removes any empty status tabs
}
function verbs_cat_check(cat) {
var verbs_in_cat = 0;
var verbcat = "";
if(!verb_tabs.includes(cat)){
removeStatusTab(cat);
return;
}
for(var v = 0; v < verbs.length; v++){
var part = verbs[v];
verbcat = part[0];
if(verbcat != cat || verbcat.trim() == ""){
continue;
}
else{
verbs_in_cat = 1;
break; // we only need one
}
}
if(verbs_in_cat != 1) {
removeStatusTab(cat);
if(current_tab == cat)
tab_change("Status");
}
}
function wipe_verbs() {
verbs = [["", ""]];
verb_tabs = [];
checkStatusTab(); // remove all empty verb tabs
}
function add_verb_list(v) {
var to_add = JSON.parse(v); // list of a list with category and verb inside it
to_add.sort(); // sort what we're adding
for(var i = 0; i < to_add.length; i++) {
var part = to_add[i];
if(verb_tabs.includes(part[0])){
verbs.push(part);
if(current_tab == part[0]) {
draw_verbs(part[0]); // redraw if we added a verb to the tab we're currently in
}
} else if(part[0]) {
verb_tabs.push(part[0]);
verbs.push(part);
createStatusTab(part[0]);
}
}
}
function remove_verb_list(v) {
var to_remove = JSON.parse(v);
for(var i = 0; i < to_remove.length; i++) {
remove_verb(to_remove[i]);
}
check_verbs();
verbs.sort();
if(verb_tabs.includes(current_tab))
draw_verbs(current_tab);
}
// passes a 2D list of (verbcategory, verbname) creates tabs and adds verbs to respective list
// example (IC, Say)
function init_verbs(c, v) {
wipe_verbs(); // remove all verb categories so we can replace them
checkStatusTab(); // remove all status tabs
verb_tabs = JSON.parse(c);
verb_tabs.sort(); // sort it
var do_update = false;
var cat = "";
for(var i = 0; i < verb_tabs.length; i++){
cat = verb_tabs[i];
createStatusTab(cat); // create a category if the verb doesn't exist yet
}
if(verb_tabs.includes(current_tab)) {
do_update = true;
}
if(v) {
verbs = JSON.parse(v);
verbs.sort(); // sort them
if(do_update) {
draw_verbs(current_tab);
}
}
}
function update(global_data, ping_entry, other_entries) {
status_tab_parts = [ping_entry];
var parsed = JSON.parse(global_data);
for(var i = 0; i < parsed.length; i++) if(parsed[i] != null) status_tab_parts.push(parsed[i]);
parsed = JSON.parse(other_entries);
for(var i = 0; i < parsed.length; i++) if(parsed[i] != null) status_tab_parts.push(parsed[i]);
if(current_tab == "Status")
draw_status();
else if(current_tab == "Debug Stat Panel")
draw_debug();
}
function update_mc(global_mc_data, coords_entry, ht) {
mc_tab_parts = JSON.parse(global_mc_data);
mc_tab_parts.splice(0,0,["Location:",coords_entry]);
href_token = ht;
if(!verb_tabs.includes("MC"))
verb_tabs.push("MC");
createStatusTab("MC");
if(current_tab == "MC")
draw_mc();
}
function remove_mc() {
removeStatusTab("MC");
if(current_tab == "MC")
tab_change("Status");
}
function remove_spells() {
for(var s = 0; s < spell_tabs.length; s++){
removeStatusTab(spell_tabs[s]);
}
}
function init_spells() {
var cat = "";
for(var i = 0; i < spell_tabs.length; i++) {
cat = spell_tabs[i];
if(cat.length > 0) {
verb_tabs.push(cat);
createStatusTab(cat);
}
}
}
function check_spells() {
for(var v = 0; v < spell_tabs.length; v++)
spell_cat_check(spell_tabs[v]);
}
function spell_cat_check(cat) {
var spells_in_cat = 0;
var spellcat = "";
for(var s = 0; s < spells.length; s++){
var spell = spells[s];
spellcat = spell[0];
if(spellcat == cat){
spells_in_cat++;
}
}
if(spells_in_cat < 1) {
removeStatusTab(cat);
}
}
function update_spells(t, s) {
spell_tabs = JSON.parse(t);
var do_update = false;
if(spell_tabs.includes(current_tab)) {
do_update = true;
}
init_spells();
if(s) {
spells = JSON.parse(s);
if(do_update) {
draw_spells(current_tab);
}
} else {
remove_spells();
}
}
function tab_change(tab) {
if(tab == current_tab) return;
if(document.getElementById(current_tab))
document.getElementById(current_tab).className = "button"; // disable active on last button
current_tab = tab;
if(document.getElementById(tab))
document.getElementById(tab).className = "button active"; // make current button active
var spell_tabs_thingy = (spell_tabs.includes(tab));
var verb_tabs_thingy = (verb_tabs.includes(tab));
if(tab == "Status") {
draw_status();
} else if(tab == "MC") {
draw_mc();
} else if(spell_tabs_thingy) {
draw_spells(tab);
} else if(verb_tabs_thingy){
draw_verbs(tab);
} else if(tab == "Debug Stat Panel") {
draw_debug();
} else if(tab == "Tickets") {
draw_tickets();
} else if(tab == "SQDL2") {
draw_sqdl2();
}else if(tab == turfname) {
draw_listedturf();
} else {
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "loading...";
}
window.location.href = "byond://winset?statbrowser.is-visible=true";
}
function draw_debug() {
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var wipeverbstabs = document.createElement("div");
var link = document.createElement("a");
link.onclick = function() {wipe_verbs()};
link[textContentKey] = "Wipe All Verbs";
wipeverbstabs.appendChild(link);
document.getElementById("statcontent").appendChild(wipeverbstabs);
var text = document.createElement("div");
text[textContentKey] = "Verb Tabs:";
document.getElementById("statcontent").appendChild(text);
var table1 = document.createElement("table");
for(var i=0; i < verb_tabs.length ; i++) {
var part = verb_tabs[i];
var tr = document.createElement("tr");
var td1 = document.createElement("td");
td1[textContentKey] = part;
var a = document.createElement("a");
a.onclick = function (part) {
return function() {removeStatusTab(part)};
}(part);
a[textContentKey] = " Delete Tab " + part;
td1.appendChild(a);
tr.appendChild(td1);
table1.appendChild(tr);
}
document.getElementById("statcontent").appendChild(table1);
var header2 = document.createElement("div");
header2[textContentKey] = "Verbs:";
document.getElementById("statcontent").appendChild(header2);
var table2 = document.createElement("table");
for(var v = 0; v < verbs.length; v++) {
var part2 = verbs[v];
var trr = document.createElement("tr");
var tdd1 = document.createElement("td");
tdd1[textContentKey] = part2[0];
var tdd2 = document.createElement("td");
tdd2[textContentKey] = part2[1];
trr.appendChild(tdd1);
trr.appendChild(tdd2);
table2.appendChild(trr);
}
document.getElementById("statcontent").appendChild(table2);
var text3 = document.createElement("div");
text3[textContentKey] = "Permanent Tabs:";
document.getElementById("statcontent").appendChild(text3);
var table3 = document.createElement("table");
for(var i=0; i < permanent_tabs.length ; i++) {
var part3 = permanent_tabs[i];
var trrr = document.createElement("tr");
var tddd1 = document.createElement("td");
tddd1[textContentKey] = part3;
trrr.appendChild(tddd1);
table3.appendChild(trrr);
}
document.getElementById("statcontent").appendChild(table3);
}
function draw_status() {
var statcontentdiv = document.getElementById("statcontent");
if(!document.getElementById("Status")) {
createStatusTab("Status");
current_tab = "Status";
}
statcontentdiv[textContentKey] = inner;
for(var i = 0; i < status_tab_parts.length; i++) {
if(status_tab_parts[i].trim() == "") {
document.getElementById("statcontent").appendChild(document.createElement("br"));
} else {
var div = document.createElement("div");
div[textContentKey] = status_tab_parts[i];
document.getElementById("statcontent").appendChild(div);
}
}
if(verb_tabs.length == 0 || !verbs)
{
window.location.href = "byond://winset?command=Fix-Stat-Panel";
}
}
function draw_mc() {
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var table = document.createElement("table");
for(var i = 0; i < mc_tab_parts.length; i++) {
var part = mc_tab_parts[i];
var tr = document.createElement("tr");
var td1 = document.createElement("td");
td1[textContentKey] = part[0];
var td2 = document.createElement("td");
if(part[2]) {
var a = document.createElement("a");
a.href = "?_src_=vars;admin_token=" + href_token + ";Vars=" + part[2];
a[textContentKey] = part[1];
td2.appendChild(a);
} else {
td2[textContentKey] = part[1];
}
tr.appendChild(td1);
tr.appendChild(td2);
table.appendChild(tr);
}
document.getElementById("statcontent").appendChild(table);
}
function update_tickets(T){
tickets = JSON.parse(T);
if(!verb_tabs.includes("Tickets")) {
verb_tabs.push("Tickets");
addPermanentTab("Tickets");
}
if(current_tab == "Tickets")
draw_tickets();
}
function update_sqdl2(S) {
sqdl2 = JSON.parse(S);
if(sqdl2.length > 0 && !verb_tabs.includes("SQDL2")) {
verb_tabs.push("SQDL2");
addPermanentTab("SQDL2");
}
if(current_tab == "SQDL2")
draw_sqdl2();
}
function remove_sqdl2() {
if(sqdl2) {
sqdl2 = [];
removePermanentTab("SQDL2");
if(current_tab == "SQDL2")
tab_change("Status");
}
checkStatusTab();
}
function remove_tickets() {
if(tickets) {
tickets = [];
removePermanentTab("Tickets");
if(current_tab == "Tickets")
tab_change("Status");
}
checkStatusTab();
}
// removes MC, Tickets and MC tabs.
function remove_admin_tabs() {
remove_mc();
remove_tickets();
remove_sqdl2();
}
function create_listedturf(TN) {
remove_listedturf(); // remove the last one if we had one
turfname = JSON.parse(TN);
addPermanentTab(turfname);
tab_change(turfname);
}
function update_listedturf(TC) {
turfcontents = JSON.parse(TC);
if(current_tab == turfname)
draw_listedturf();
}
function draw_listedturf() {
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var table = document.createElement("table");
for(var i = 0; i < turfcontents.length; i++) {
var part = turfcontents[i];
if(part[2]) {
var img = document.createElement("img");
img.src = part[2];
table.appendChild(img);
}
var b = document.createElement("div");
var clickcatcher = "";
b.className = "link";
b.onmousedown = function (part) {
// The outer function is used to close over a fresh "part" variable,
// rather than every onmousedown getting the "part" of the last entry.
return function(e) {
e.preventDefault();
clickcatcher = "?src=" + part[1] + ";statpanel_item_click=1";
if(e.shiftKey){
clickcatcher += ";statpanel_item_shiftclick=1";
}
if(e.ctrlKey){
clickcatcher += ";statpanel_item_ctrlclick=1";
}
if(e.altKey) {
clickcatcher += ";statpanel_item_altclick=1";
}
window.location.href = clickcatcher;
}
}(part);
b[textContentKey] = part[0];
table.appendChild(b);
table.appendChild(document.createElement("br"));
}
document.getElementById("statcontent").appendChild(table);
}
function remove_listedturf() {
removePermanentTab(turfname);
checkStatusTab();
if(current_tab == turfname)
tab_change("Status");
}
function draw_sqdl2(){
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var table = document.createElement("table");
for(var i = 0; i < sqdl2.length; i++) {
var part = sqdl2[i];
var tr = document.createElement("tr");
var td1 = document.createElement("td");
td1[textContentKey] = part[0];
var td2 = document.createElement("td");
if(part[2]) {
var a = document.createElement("a");
a.href = "?src=" + part[2] + ";statpanel_item_click=1";
a[textContentKey] = part[1];
td2.appendChild(a);
} else {
td2[textContentKey] = part[1];
}
tr.appendChild(td1);
tr.appendChild(td2);
table.appendChild(tr);
}
document.getElementById("statcontent").appendChild(table);
}
function draw_tickets() {
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var table = document.createElement("table");
if(!tickets)
return;
for(var i = 0; i < tickets.length; i++) {
var part = tickets[i];
var tr = document.createElement("tr");
var td1 = document.createElement("td");
td1[textContentKey] = part[0];
var td2 = document.createElement("td");
if(part[2]) {
var a = document.createElement("a");
a.href = "?_src_=holder;admin_token=" + href_token + ";ahelp=" + part[2] + ";ahelp_action=ticket;statpanel_item_click=1;action=ticket" ;
a[textContentKey] = part[1];
td2.appendChild(a);
} else if(part[3]){
var a = document.createElement("a");
a.href = "?src=" + part[3] + ";statpanel_item_click=1";
a[textContentKey] = part[1];
td2.appendChild(a);
} else {
td2[textContentKey] = part[1];
}
tr.appendChild(td1);
tr.appendChild(td2);
table.appendChild(tr);
}
document.getElementById("statcontent").appendChild(table);
}
function draw_spells(cat) {
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var table = document.createElement("table");
for(var i = 0; i < spells.length; i++) {
var part = spells[i];
if(part[0] != cat) continue;
var tr = document.createElement("tr");
var td1 = document.createElement("td");
td1[textContentKey] = part[1];
var td2 = document.createElement("td");
if(part[3]) {
var a = document.createElement("a");
a.href = "?src=" + part[3] + ";statpanel_item_click=1";
a[textContentKey] = part[2];
td2.appendChild(a);
} else {
td2[textContentKey] = part[2];
}
tr.appendChild(td1);
tr.appendChild(td2);
table.appendChild(tr);
}
document.getElementById("statcontent").appendChild(table);
}
function draw_verbs(cat){
var statcontentdiv = document.getElementById("statcontent");
statcontentdiv[textContentKey] = "";
var table = document.createElement("newdiv");
table.className = "grid-container";
var command = ""; // typecast name to string
verbs.sort();
verbs.reverse(); // sort verbs backwards before we draw
for(var i = verbs.length - 1; i >= 0; i--) {
var part = verbs[i]; // should be a list containing category and command
if(!part[1]) continue;
if(part[0] != cat){
continue;
}
if(part[0].trim() == ""){
verbs.splice(i, 1);
continue;
}
command = part[1];
var a = document.createElement("a");
a.href = "byond://winset?command=" + command.replace(/\s/g, "-");
a[textContentKey] = command;
a.className = "grid-item";
table.appendChild(a);
}
document.getElementById("statcontent").appendChild(table);
}
function set_theme(which) {
if (which == "light") {
document.body.className = "";
set_style_sheet("browserOutput_white");
} else if (which == "dark") {
document.body.className = "dark";
set_style_sheet("browserOutput");
}
}
function set_light_theme() {
document.body.style.backgroundColor = "white";
document.body.style.color = "black";
document.body.className = "";
set_style_sheet("browserOutput_white")
}
function set_dark_theme() {
document.body.style.backgroundColor = "#171717";
document.body.style.color = "#a4bad6";
document.body.className = "dark";
set_style_sheet("browserOutput")
}
function set_style_sheet(sheet) {
if(document.getElementById("goonStyle")) {
var currentSheet = document.getElementById("goonStyle");
currentSheet.parentElement.removeChild(currentSheet);
}
var head = document.getElementsByTagName('head')[0];
var sheetElement = document.createElement("link");
sheetElement.id = "goonStyle";
sheetElement.rel = "stylesheet";
sheetElement.type = "text/css";
sheetElement.href = sheet + ".css";
sheetElement.media = 'all';
head.appendChild(sheetElement);
}
document[addEventListenerKey]("click", function(e) {
window.location.href = "byond://winset?map.focus=true";
});
if(!current_tab) {
addPermanentTab("Status");
tab_change("Status");
}
function create_debug(){
if(!document.getElementById("Debug Stat Panel")) {
addPermanentTab("Debug Stat Panel");
} else {
removePermanentTab("Debug Stat Panel");
}
}
function getCookie(cname) {
var name = cname + '=';
var ca = document.cookie.split(';');
for(var i=0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf(name) === 0) {
return decoder(c.substring(name.length,c.length));
}
}
return '';
}
</script>
</body>
</html>

View File

@@ -110,8 +110,9 @@ window "mapwindow"
font-size = 7
is-default = true
saved-params = "icon-size"
saved-params = "zoom;letterbox;zoom-mode"
zoom-mode = distort
style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; }"
window "infowindow"
elem "infowindow"
type = MAIN
@@ -263,15 +264,15 @@ window "outputwindow"
window "statwindow"
elem "statwindow"
type = MAIN
pos = 372,0
pos = 281,0
size = 640x480
anchor1 = none
anchor2 = none
background-color = #242424
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "statbrowser"
type = BROWSER
elem "stat"
type = INFO
pos = 0,0
size = 640x480
anchor1 = 0,0
@@ -284,18 +285,7 @@ window "statwindow"
tab-background-color = #242424
prefix-color = #e0e0e0
suffix-color = #e0e0e0
is-visible = false
on-tab = ".output statbrowser:tab_change [[*]]"
elem "statbrowser"
type = BROWSER
pos = 6,44
size = 628x430
anchor1 = 0,0
anchor2 = 100,100
background-color = none
saved-params = ""
is-visible = false
window "preferences_window"
elem "preferences_window"
type = MAIN

View File

@@ -79,7 +79,6 @@
#include "code\__DEFINES\pipe_construction.dm"
#include "code\__DEFINES\pool.dm"
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
#include "code\__DEFINES\qdel.dm"
#include "code\__DEFINES\radiation.dm"
@@ -152,7 +151,6 @@
#include "code\__HELPERS\type2type_vr.dm"
#include "code\__HELPERS\typelists.dm"
#include "code\__HELPERS\unsorted.dm"
#include "code\__HELPERS\verbs.dm"
#include "code\__HELPERS\view.dm"
#include "code\__HELPERS\sorts\__main.dm"
#include "code\__HELPERS\sorts\InsertSort.dm"
@@ -277,7 +275,6 @@
#include "code\controllers\subsystem\server_maint.dm"
#include "code\controllers\subsystem\shuttle.dm"
#include "code\controllers\subsystem\spacedrift.dm"
#include "code\controllers\subsystem\statpanel.dm"
#include "code\controllers\subsystem\stickyban.dm"
#include "code\controllers\subsystem\sun.dm"
#include "code\controllers\subsystem\tgui.dm"