diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 22ff1c2bef9..5e65dfd5251 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,6 +1,6 @@ //Returns the world time in english /proc/worldtime2text() - return gameTimestamp("hh:mm") + return gameTimestamp("hh:mm:ss") /proc/time_stamp(format = "hh:mm:ss") return time2text(world.timeofday, format) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 6ce56b78832..f17997074d2 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -493,6 +493,6 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING if(!statclick) statclick = new/obj/effect/statclick/debug("Initializing...", src) - - stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (TickDrift:[round(Master.tickdrift)]) (Iteration:[Master.iteration])")) + stat("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)]%))") + stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])")) diff --git a/code/controllers/subsystem/time_tracking.dm b/code/controllers/subsystem/time_tracking.dm new file mode 100644 index 00000000000..df87d9d125e --- /dev/null +++ b/code/controllers/subsystem/time_tracking.dm @@ -0,0 +1,43 @@ +var/datum/subsystem/time_track/SStime_track + +/datum/subsystem/time_track + name = "Time Tracking" + wait = 600 + flags = SS_NO_INIT|SS_FIRE_IN_LOBBY + + var/time_dilation_current = 0 + + var/time_dilation_avg_fast = 0 + var/time_dilation_avg = 0 + var/time_dilation_avg_slow = 0 + + var/first_run = TRUE + + var/last_tick_realtime = 0 + var/last_tick_byond_time = 0 + var/last_tick_tickcount = 0 + +/datum/subsystem/time_track/New() + NEW_SS_GLOBAL(SStime_track) + +/datum/subsystem/time_track/fire() + + var/current_realtime = REALTIMEOFDAY + var/current_byondtime = world.time + var/current_tickcount = world.time/world.tick_lag + + if (!first_run) + var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag)) + + time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100 + + time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current) + time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast) + time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg) + else + first_run = FALSE + last_tick_realtime = current_realtime + last_tick_byond_time = current_byondtime + last_tick_tickcount = current_tickcount + + diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4f6b3e49005..093310c2c4e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -299,7 +299,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/Stat() ..() if(statpanel("Status")) - stat(null, "Station Time: [worldtime2text()]") if(ticker && ticker.mode) for(var/datum/gang/G in ticker.mode.gangs) if(G.is_dominating) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 768ba239ccf..18037acd68f 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -242,7 +242,6 @@ var/list/ai_list = list() if(statpanel("Status")) if(!stat) stat(null, text("System integrity: [(health+100)/2]%")) - stat(null, "Station Time: [worldtime2text()]") stat(null, text("Connected cyborgs: [connected_robots.len]")) var/area/borg_area for(var/mob/living/silicon/robot/R in connected_robots) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index cddc2f3db97..8deeaa4378a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -302,7 +302,6 @@ else stat(null, text("No Cell Inserted!")) - stat("Station Time:", worldtime2text()) if(module) for(var/datum/robot_energy_storage/st in module.storages) stat("[st.name]:", "[st.energy]/[st.max_energy]") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 74c77055f4e..789e2dc4e40 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -542,7 +542,9 @@ var/next_mob_id = 0 stat(null, "Map: [MAP_NAME]") if(nextmap && istype(nextmap)) stat(null, "Next Map: [nextmap.friendlyname]") - stat(null, "Server Time: [time2text(world.realtime, "YYYY-MM-DD hh:mm")]") + stat(null, "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]") + stat(null, "Station Time: [worldtime2text()]") + stat(null, "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) diff --git a/tgstation.dme b/tgstation.dme index a803153156f..435b936845b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -179,6 +179,7 @@ #include "code\controllers\subsystem\tgui.dm" #include "code\controllers\subsystem\throwing.dm" #include "code\controllers\subsystem\ticker.dm" +#include "code\controllers\subsystem\time_tracking.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\voting.dm" #include "code\controllers\subsystem\weather.dm"