From eb7d505beff5da2349f90480291d5438ba7eeda7 Mon Sep 17 00:00:00 2001 From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Date: Fri, 8 Aug 2025 10:32:46 -0700 Subject: [PATCH] Makes the MC stat panel tab usable, and also nicer (#92405) (cherry picked from commit 0909348cea9e479bf6eb1ed60ece579d69642203) --- code/__DEFINES/admin.dm | 2 +- code/controllers/subsystem.dm | 2 +- code/controllers/subsystem/admin_verbs.dm | 3 ++- code/controllers/subsystem/ai_controllers.dm | 2 +- code/controllers/subsystem/air.dm | 5 +++-- code/controllers/subsystem/area_contents.dm | 2 +- code/controllers/subsystem/dbcore.dm | 2 +- code/controllers/subsystem/explosions.dm | 6 ++--- code/controllers/subsystem/garbage.dm | 6 ++--- code/controllers/subsystem/input.dm | 5 ++--- code/controllers/subsystem/ipintel.dm | 3 ++- code/controllers/subsystem/lighting.dm | 2 +- code/controllers/subsystem/machines.dm | 2 +- code/controllers/subsystem/polling.dm | 2 +- code/controllers/subsystem/radiation.dm | 2 +- code/controllers/subsystem/statpanel.dm | 2 +- code/controllers/subsystem/timer.dm | 2 +- code/controllers/subsystem/tts.dm | 2 +- .../subsystem/unplanned_controllers.dm | 2 +- code/controllers/subsystem/wardrobe.dm | 7 +++--- html/statbrowser.css | 22 +++++++++++++------ html/statbrowser.html | 2 +- html/statbrowser.js | 2 ++ 23 files changed, 49 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 4e40343a743..a543e5055b9 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -85,7 +85,7 @@ /atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref) var/turf/turf_at_coords = Safe_COORD_Location() - return turf_at_coords ? "[area_name ? "[get_area_name(turf_at_coords, TRUE)] " : " "]([turf_at_coords.x],[turf_at_coords.y],[turf_at_coords.z])[admin_jump_ref ? " [ADMIN_JMP(turf_at_coords)]" : ""]" : "nonexistent location" + return turf_at_coords ? "[area_name ? "[get_area_name(turf_at_coords, TRUE)] " : ""]([turf_at_coords.x],[turf_at_coords.y],[turf_at_coords.z])[admin_jump_ref ? " [ADMIN_JMP(turf_at_coords)]" : ""]" : "nonexistent location" /atom/proc/Safe_COORD_Location() var/atom/drop_atom = drop_location() diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 02f45a54150..62dba374b79 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -291,7 +291,7 @@ /datum/controller/subsystem/stat_entry(msg) if(can_fire && !(SS_NO_FIRE & flags) && init_stage <= Master.init_stage_completed) - msg = "[round(cost,1)]ms|[round(tick_usage,1)]%([round(tick_overrun,1)]%)|[round(ticks,0.1)]\t[msg]" + msg = "[round(cost,1)]ms|[round(tick_usage,1)]%([round(tick_overrun,1)]%)|[round(ticks,0.1)] [msg]" else msg = "OFFLINE\t[msg]" return msg diff --git a/code/controllers/subsystem/admin_verbs.dm b/code/controllers/subsystem/admin_verbs.dm index 645a447c485..74b86a3c5cb 100644 --- a/code/controllers/subsystem/admin_verbs.dm +++ b/code/controllers/subsystem/admin_verbs.dm @@ -22,7 +22,8 @@ SUBSYSTEM_DEF(admin_verbs) admin_verbs_by_type = SSadmin_verbs.admin_verbs_by_type /datum/controller/subsystem/admin_verbs/stat_entry(msg) - return "[..()] | V: [length(admin_verbs_by_type)]" + msg = "V:[length(admin_verbs_by_type)]" + return ..() /datum/controller/subsystem/admin_verbs/proc/process_pending_admins() var/list/pending_admins = admins_pending_subsytem_init diff --git a/code/controllers/subsystem/ai_controllers.dm b/code/controllers/subsystem/ai_controllers.dm index 397062ddd80..355a06ff3a5 100644 --- a/code/controllers/subsystem/ai_controllers.dm +++ b/code/controllers/subsystem/ai_controllers.dm @@ -21,7 +21,7 @@ SUBSYSTEM_DEF(ai_controllers) /datum/controller/subsystem/ai_controllers/stat_entry(msg) var/list/planning_list = GLOB.ai_controllers_by_status[planning_status] - msg = "Planning AIs:[length(planning_list)]/[round(our_cost,1)]%" + msg = "\n Planning AIs:[length(planning_list)]/[round(our_cost,1)]%" return ..() /datum/controller/subsystem/ai_controllers/fire(resumed) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index b0e0846d5ee..df9a53e82e1 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -63,7 +63,7 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/stat_entry(msg) - msg += "C:{" + msg += "\n Cost:{" msg += "AT:[round(cost_turfs,1)]|" msg += "HS:[round(cost_hotspots,1)]|" msg += "EG:[round(cost_groups,1)]|" @@ -75,7 +75,7 @@ SUBSYSTEM_DEF(air) msg += "RB:[round(cost_rebuilds,1)]|" msg += "AJ:[round(cost_adjacent,1)]|" msg += "} " - msg += "AT:[active_turfs.len]|" + msg += "\n Count:{AT:[active_turfs.len]|" msg += "HS:[hotspots.len]|" msg += "EG:[excited_groups.len]|" msg += "HP:[high_pressure_delta.len]|" @@ -87,6 +87,7 @@ SUBSYSTEM_DEF(air) msg += "EP:[expansion_queue.len]|" msg += "AJ:[adjacent_rebuild.len]|" msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]" + msg += "}" return ..() diff --git a/code/controllers/subsystem/area_contents.dm b/code/controllers/subsystem/area_contents.dm index 054de9d8efc..11e07eac55b 100644 --- a/code/controllers/subsystem/area_contents.dm +++ b/code/controllers/subsystem/area_contents.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(area_contents) total_to_clear += length(to_clear.turfs_to_uncontain_by_zlevel[area_zlevel]) if (length(to_clear.turfs_by_zlevel) >= area_zlevel) //this should always be true, but stat_entry is no place for runtimes. fire() can handle that total_clearing_from += length(to_clear.turfs_by_zlevel[area_zlevel]) - msg = "A:[length(currentrun)] MR:[length(marked_for_clearing)] TC:[total_to_clear] CF:[total_clearing_from]" + msg = "\n A:[length(currentrun)] MR:[length(marked_for_clearing)] TC:[total_to_clear] CF:[total_clearing_from]" return ..() diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 6160d75d0c0..5b241615a8d 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -88,7 +88,7 @@ SUBSYSTEM_DEF(dbcore) log_config("ERROR: POOLING_MAX_SQL_CONNECTIONS ([max_sql_connections]) is set lower than POOLING_MIN_SQL_CONNECTIONS ([min_sql_connections]). Please check your config or the code defaults for sanity") /datum/controller/subsystem/dbcore/stat_entry(msg) - msg = "P:[length(all_queries)]|Active:[length(queries_active)]|Standby:[length(queries_standby)]" + msg = "\n P:[length(all_queries)]|Active:[length(queries_active)]|Standby:[length(queries_standby)]" return ..() /// Resets the tracking numbers on the subsystem. Used by SStime_track. diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 57af71f11c3..c885c882628 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -45,7 +45,7 @@ SUBSYSTEM_DEF(explosions) /datum/controller/subsystem/explosions/stat_entry(msg) - msg += "C:{" + msg += "\n Cost:{" msg += "LT:[round(cost_lowturf,1)]|" msg += "MT:[round(cost_medturf,1)]|" msg += "HT:[round(cost_highturf,1)]|" @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(explosions) msg += "} " - msg += "AMT:{" + msg += "\n Count:{" msg += "LT:[lowturf.len]|" msg += "MT:[medturf.len]|" msg += "HT:[highturf.len]|" @@ -72,7 +72,7 @@ SUBSYSTEM_DEF(explosions) msg += "TO:[throwturf.len]" msg += "HTO:[held_throwturf.len]" - msg += "} " + msg += "}" return ..() /datum/controller/subsystem/explosions/proc/is_exploding() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 844f52a860f..bb1475a4f50 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -63,19 +63,19 @@ SUBSYSTEM_DEF(garbage) var/list/counts = list() for (var/list/L in queues) counts += length(L) - msg += "Q:[counts.Join(",")]|D:[delslasttick]|G:[gcedlasttick]|" + msg += "\n Queue:[counts.Join(",")]|Dels:[delslasttick]|GCs:[gcedlasttick]|" msg += "GR:" if (!(delslasttick+gcedlasttick)) msg += "n/a|" else msg += "[round((gcedlasttick/(delslasttick+gcedlasttick))*100, 0.01)]%|" - msg += "TD:[totaldels]|TG:[totalgcs]|" + msg += "\n TD:[totaldels]|TG:[totalgcs]|" if (!(totaldels+totalgcs)) msg += "n/a|" else msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" - msg += " P:[pass_counts.Join(",")]" + msg += "\n P:[pass_counts.Join(",")]" msg += "|F:[fail_counts.Join(",")]" return ..() diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 66097a4077c..11b75be8af7 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -94,6 +94,5 @@ VERB_MANAGER_SUBSYSTEM_DEF(input) current_clicks = 0 /datum/controller/subsystem/verb_manager/input/stat_entry(msg) - . = ..() - . += "M/S:[round(movements_per_second,0.01)] | C/S:[round(clicks_per_second,0.01)] ([round(delayed_clicks_per_second,0.01)] | CD: [round(average_click_delay / (1 SECONDS),0.01)])" - + msg = "\n M/S:[round(movements_per_second,0.01)] | C/S:[round(clicks_per_second,0.01)] ([round(delayed_clicks_per_second,0.01)] | CD: [round(average_click_delay / (1 SECONDS),0.01)])" + return ..() diff --git a/code/controllers/subsystem/ipintel.dm b/code/controllers/subsystem/ipintel.dm index d61789deb69..6ba87c02780 100644 --- a/code/controllers/subsystem/ipintel.dm +++ b/code/controllers/subsystem/ipintel.dm @@ -41,7 +41,8 @@ SUBSYSTEM_DEF(ipintel) )) /datum/controller/subsystem/ipintel/stat_entry(msg) - return "[..()] | M: [CONFIG_GET(number/ipintel_rate_minute) - rate_limit_minute]" + msg = "M:[CONFIG_GET(number/ipintel_rate_minute) - rate_limit_minute]" + return ..() /datum/controller/subsystem/ipintel/proc/is_enabled() diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index f73eb7f1c03..2bff25b00a5 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -16,7 +16,7 @@ SUBSYSTEM_DEF(lighting) #endif /datum/controller/subsystem/lighting/stat_entry(msg) - msg = "L:[length(sources_queue)]|C:[length(corners_queue)]|O:[length(objects_queue)]" + msg = "\n Sources:[length(sources_queue)]|Corners:[length(corners_queue)]|Objects:[length(objects_queue)]" return ..() diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index 1038926bf7c..e3e0b0357a0 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -86,7 +86,7 @@ SUBSYSTEM_DEF(machines) propagate_network(power_cable, power_cable.powernet) /datum/controller/subsystem/machines/stat_entry(msg) - msg = "M:[length(all_machines)]|MT:[length(machines_by_type)]|PM:[length(processing)]|PN:[length(powernets)]" + msg = "\n M:[length(all_machines)]|MT:[length(machines_by_type)]|PM:[length(processing)]|PN:[length(powernets)]" return ..() /datum/controller/subsystem/machines/fire(resumed = FALSE) diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index 65b981e3fe7..6b15881b3db 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -334,7 +334,7 @@ SUBSYSTEM_DEF(polling) QDEL_IN(finishing_poll, 0.5 SECONDS) /datum/controller/subsystem/polling/stat_entry(msg) - msg += "Active: [length(currently_polling)] | Total: [total_polls]" + msg = "\n Active: [length(currently_polling)] | Total: [total_polls]" var/datum/candidate_poll/soonest_to_complete = get_next_poll_to_finish() if(soonest_to_complete) msg += " | Next: [DisplayTimeText(soonest_to_complete.time_left())] ([length(soonest_to_complete.signed_up)] candidates)" diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm index 6a9cc631cf5..a129c2a3464 100644 --- a/code/controllers/subsystem/radiation.dm +++ b/code/controllers/subsystem/radiation.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(radiation) processing.Cut(1, 2) /datum/controller/subsystem/radiation/stat_entry(msg) - msg = "[msg] | Pulses: [processing.len]" + msg = "Pulses:[processing.len]" return ..() /datum/controller/subsystem/radiation/proc/pulse(atom/source, datum/radiation_pulse_information/pulse_information) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 15e858489cf..d806504ad31 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -206,7 +206,7 @@ SUBSYSTEM_DEF(statpanels) list("World Time:", "[world.time]"), list("Globals:", GLOB.stat_entry(), text_ref(GLOB)), list("[config]:", config.stat_entry(), text_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)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)"), + 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)]%))\n (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)"), list("Master Controller:", Master.stat_entry(), text_ref(Master)), list("Failsafe Controller:", Failsafe.stat_entry(), text_ref(Failsafe)), list("","") diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 2b2d9393287..20fe4eb47b6 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -55,7 +55,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)] RST:[bucket_reset_count]" + msg = "\n B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)] RST:[bucket_reset_count]" return ..() /datum/controller/subsystem/timer/proc/dump_timer_buckets(full = TRUE) diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index 71e12ff18ce..09043ce9959 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -45,7 +45,7 @@ SUBSYSTEM_DEF(tts) return ..() /datum/controller/subsystem/tts/stat_entry(msg) - msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages?.L)]|Avg:[average_tts_messages_time]" + msg = "\n Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages?.L)]|Avg:[average_tts_messages_time]" return ..() /proc/cmp_word_length_asc(datum/tts_request/a, datum/tts_request/b) diff --git a/code/controllers/subsystem/unplanned_controllers.dm b/code/controllers/subsystem/unplanned_controllers.dm index a53061aa504..49fbcb2e83b 100644 --- a/code/controllers/subsystem/unplanned_controllers.dm +++ b/code/controllers/subsystem/unplanned_controllers.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(unplanned_controllers) return ..() /datum/controller/subsystem/unplanned_controllers/stat_entry(msg) - msg = "Planning AIs:[length(GLOB.unplanned_controllers[target_status])]" + msg = "\n Planning AIs:[length(GLOB.unplanned_controllers[target_status])]" return ..() /datum/controller/subsystem/unplanned_controllers/fire(resumed) diff --git a/code/controllers/subsystem/wardrobe.dm b/code/controllers/subsystem/wardrobe.dm index 55288bc025a..2593595bdf6 100644 --- a/code/controllers/subsystem/wardrobe.dm +++ b/code/controllers/subsystem/wardrobe.dm @@ -66,10 +66,9 @@ SUBSYSTEM_DEF(wardrobe) /datum/controller/subsystem/wardrobe/stat_entry(msg) var/total_provided = max(stock_hit + stock_miss, 1) var/current_max_store = (one_go_master * cache_intensity) + (overflow_lienency * length(canon_minimum)) - msg += " P:[length(canon_minimum)] Q:[length(order_list)] S:[length(preloaded_stock)] I:[cache_intensity] O:[overflow_lienency]" - msg += " H:[stock_hit] M:[stock_miss] T:[total_provided] H/T:[PERCENT(stock_hit / total_provided)]% M/T:[PERCENT(stock_miss / total_provided)]%" - msg += " MAX:[current_max_store]" - msg += " ID:[inspect_delay] NI:[last_inspect_time + inspect_delay]" + msg += "\n P:[length(canon_minimum)] Q:[length(order_list)] S:[length(preloaded_stock)] I:[cache_intensity] O:[overflow_lienency] MAX:[current_max_store]" + msg += "\n H:[stock_hit] M:[stock_miss] T:[total_provided] H/T:[PERCENT(stock_hit / total_provided)]% M/T:[PERCENT(stock_miss / total_provided)]%" + msg += "\n ID:[inspect_delay] NI:[last_inspect_time + inspect_delay]" return ..() /datum/controller/subsystem/wardrobe/fire(resumed=FALSE) diff --git a/html/statbrowser.css b/html/statbrowser.css index f7b09a2cde6..da470bc4ae1 100644 --- a/html/statbrowser.css +++ b/html/statbrowser.css @@ -99,6 +99,21 @@ img { border-bottom-color: #000000; } +.statcontent { + flex: 1; + padding: 0.75em 0.5em; + overflow-y: auto; + overflow-x: hidden; +} + +.mcstatcontent { + flex: 1; + padding: 0.75em 0.5em; + overflow-y: auto; + overflow-x: auto; + white-space: pre; +} + #under-menu { height: 0.5em; background-color: #eeeeee; @@ -109,13 +124,6 @@ img { background-color: #eeeeee; } -#statcontent { - flex: 1; - padding: 0.75em 0.5em; - overflow-y: auto; - overflow-x: hidden; -} - .grid-container { margin: -0.25em; } diff --git a/html/statbrowser.html b/html/statbrowser.html index 9b186291250..bbbd8fa53ab 100644 --- a/html/statbrowser.html +++ b/html/statbrowser.html @@ -1,6 +1,6 @@