From aa4dc568350909c0bacccd5f7181ef452cc25018 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Sat, 25 Apr 2026 16:13:31 -0400 Subject: [PATCH] Removes Station-time (more time changes) (#95744) ## About The Pull Request Removes Station-Time entirely Server Time is now NST (Nanotrasen Standard Time). SS13 takes place exactly 540 years in the future of the current day, so every second is 1 second in-game. Round Time is now PT (Pay-Time), how Nanotrasen keeps track of how long the current rotation of Employees has been working for. Telecomms uses NST due to its importance of being the communication to the blackbox. Autopsy report, clocks, scientific reports and requisitions use both timestamps due to them being more official documents that NT may need to know beyond just the current round (just for flavortext). Pretty much everything else (Det scanner, PDA, IC logs, Time-of-Death, AI law changes, Cyborg file downloading) uses PT PT image image image https://github.com/user-attachments/assets/29445051-c98b-4af3-a657-812083aab91a Clock (Literate) image Clock (Illiterate) image New paperwork time working properly image NST image image # Other changes 1. Circuit time checker will now get the value of the given input (Hour, Minute, Second) rather than the full dedisecond time converted into hour/minutes/seconds image 2. Turns nightshift into a round event that'll last approximately 22 minutes 3. 12-hour pref (doesn't apply to the stat panel because it's global info) & removal of "TCT" time image 4. The chocolate pudding negative moodlet is now based on the server's IRL time. 5. Admins can now use ``class``, ``style`` and ``background`` (they were already given perms to use ``img`` so hiding background, which was removed to prevent image embedding, is pointless) 6. Also fixes ``year`` being off on localhost. ## Why It's Good For The Game Server Time is approximately 1s = 12s converted, not including it desyncing from lag (I believe?). This makes it pretty much impossible for people to actually use this as a unit of measurement for in-game actions. Different things also uses different timestamps which is a bit more confusing. The main change here is for accessibility and, hopefully, using time as a source of immersion. "20 minutes ago" is no longer OOC, they're just speaking in PT. There's no timezones in space, Nanotrasen Standard Time is the closest there is, but Pay Time is how NT considers when you get your paychecks, so it's what is more commonly used. It also fixes major inconsistencies between "IC time" and "Station time", things like breakfast moodlet was the first 15mins of the round despite the round starting like 7 hours in? Nukies with an L6 SAW firing down the halls was shooting like 1 bullet every 3 seconds (assuming 4 bullets per second), overall there was just a disconnect between how long time actually is in the universe. The secondary reason for this change (though it is what pushed me to actually get around to making this change) is the greater stat-panel removal. This hopes to lessen the dependence on the stat panel for station-time by making it easier to understand, and the end-goal I have is for this information to be limited to Admins & the AI (AI will get the IC version with the accurate year), so until that happens I would like to improve the use of station-time by making it consistent (for example, you should only care for PT for IC, which is also what your PDA displays), so that when it gets removed it won't leave players timeless. If you haven't already, and is interested in helping remove the stat panel, every entry that needs to be removed can be found here - https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view Closes https://github.com/tgstation/tgstation/issues/94988 ## Changelog :cl: del: Removed Station Time, now we use NST (Nanotrasen Standard Time), which is IRL server time +540 years, and PT (Pay Time), the amount of time since the round has started. del: Station nightshift is now a Station event rather than being based on Server time. balance: Time circuit's Unit of Measure now tells the amount of time in hour/minute/seconds rather than giving the whole time translated to hours/minutes/seconds. qol: Added a 12-hour clock pref for people who prefer it. qol: Hovering over NST timestamps on official documents will now translate how much it is in PT/Shift Time. admin: Admins can now use style/class/background in their papercode. /:cl: --------- Co-authored-by: Isratosh --- code/__DEFINES/paper.dm | 4 + code/__DEFINES/time.dm | 10 +-- code/__HELPERS/logging/mob.dm | 2 +- code/__HELPERS/logging/research.dm | 2 +- code/__HELPERS/time.dm | 35 +++------ code/_globalvars/time_vars.dm | 5 +- .../_onclick/hud/screen_objects/new_player.dm | 2 +- .../configuration/entries/game_options.dm | 9 --- code/controllers/subsystem/economy.dm | 2 +- code/controllers/subsystem/explosions.dm | 2 +- .../subsystem/networks/modular_computers.dm | 2 +- code/controllers/subsystem/nightshift.dm | 66 ---------------- code/controllers/subsystem/security_level.dm | 3 - code/controllers/subsystem/statpanel.dm | 5 +- code/controllers/subsystem/tgui.dm | 2 +- code/controllers/subsystem/ticker.dm | 20 ++--- code/datums/records/crime.dm | 2 +- code/datums/request_message.dm | 2 +- code/datums/status_effects/debuffs/debuffs.dm | 2 +- code/game/machinery/computer/accounting.dm | 2 +- code/game/machinery/computer/apc_control.dm | 2 +- .../machinery/computer/records/medical.dm | 2 +- code/game/machinery/digital_clock.dm | 4 +- code/game/machinery/doors/airlock.dm | 6 +- .../machinery/newscaster/newscaster_data.dm | 4 +- .../telecomms/machines/message_server.dm | 2 +- .../objects/items/AI_modules/_AI_modules.dm | 2 +- .../items/devices/scanners/autopsy_scanner.dm | 7 +- .../items/devices/scanners/health_analyzer.dm | 11 +-- .../game/objects/items/devices/table_clock.dm | 5 +- code/game/objects/items/toys.dm | 4 +- .../structures/signs/signs_interactive.dm | 7 +- code/game/world.dm | 15 ++-- code/modules/admin/admin_investigate.dm | 2 +- code/modules/admin/verbs/admin_newscaster.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 14 ++-- code/modules/admin/verbs/secrets.dm | 15 ---- code/modules/admin/verbs/sprite_auditor.dm | 2 +- .../antagonists/heretic/heretic_knowledge.dm | 6 +- code/modules/cargo/order.dm | 4 +- code/modules/cargo/orderconsole.dm | 6 +- code/modules/client/preferences/time.dm | 5 ++ code/modules/detectivework/scanner.dm | 2 +- code/modules/error_handler/error_handler.dm | 4 +- code/modules/error_handler/error_viewer.dm | 10 +-- code/modules/escape_menu/details.dm | 36 ++------- code/modules/escape_menu/escape_menu.dm | 12 ++- code/modules/events/nightshift.dm | 78 +++++++++++++++++++ .../food_and_drinks/recipes/food_mixtures.dm | 3 +- code/modules/forensics/_forensics.dm | 2 +- code/modules/mining/machine_silo.dm | 2 +- code/modules/mob/living/death.dm | 2 +- code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/mob/living/status_procs.dm | 2 +- code/modules/mod/modules/modules_general.dm | 2 +- .../computers/item/computer.dm | 2 +- .../programs/chatroom/conversation.dm | 4 +- .../file_system/programs/crewmanifest.dm | 2 +- .../programs/messenger/messenger_program.dm | 4 +- code/modules/paperwork/fax.dm | 2 +- code/modules/paperwork/paper.dm | 4 +- code/modules/power/apc/apc_main.dm | 6 +- code/modules/requests/request_manager.dm | 2 +- code/modules/research/ordnance/_scipaper.dm | 2 +- .../research/ordnance/doppler_array.dm | 2 +- .../research/ordnance/tank_compressor.dm | 2 +- code/modules/reta/reta_system.dm | 2 +- .../wiremod/components/utility/timepiece.dm | 10 +-- config/game_options.txt | 9 --- tgstation.dme | 3 +- .../AccountingConsole/AuditScreen.tsx | 2 +- .../interfaces/AccountingConsole/index.tsx | 2 +- .../game_preferences/accessibility.tsx | 10 +++ tgui/packages/tgui/interfaces/Secrets.jsx | 12 +-- tgui/packages/tgui/sanitize.ts | 3 +- 75 files changed, 248 insertions(+), 300 deletions(-) delete mode 100644 code/controllers/subsystem/nightshift.dm create mode 100644 code/modules/client/preferences/time.dm create mode 100644 code/modules/events/nightshift.dm diff --git a/code/__DEFINES/paper.dm b/code/__DEFINES/paper.dm index e77086a40e5..ff4c4a50856 100644 --- a/code/__DEFINES/paper.dm +++ b/code/__DEFINES/paper.dm @@ -43,3 +43,7 @@ #define LIST_PAPER_STAMP_X "x" #define LIST_PAPER_STAMP_Y "y" #define LIST_PAPER_ROTATION "rotation" + +///Use in conjunction with `advanced_html` to have underlined text that, when hovered over, will let you see additional text. +///Would be appreciated if you avoided dotted underlined (and underlined in general) text elsewhere so players don't get confused. +#define UNDERLINED_HTML_TEXT(text_displayed, revealed_text) "[text_displayed]" diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index d445b4ec461..0ac278a4f86 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -1,8 +1,8 @@ ///number of deciseconds in a day #define MIDNIGHT_ROLLOVER 864000 -///displays the current time into the round, with a lot of extra code just there for ensuring it looks okay after an entire day passes -#define ROUND_TIME(...) ( "[STATION_TIME_PASSED() > MIDNIGHT_ROLLOVER ? "[round(STATION_TIME_PASSED()/MIDNIGHT_ROLLOVER)]:[gameTimestamp(wtime = STATION_TIME_PASSED())]" : gameTimestamp(wtime = STATION_TIME_PASSED())]" ) +/// In-universe, SS13 is set 540 years in the future from the real-world day, hence this number for determining the year-offset for the in-game year. +#define STATION_YEAR_OFFSET 540 ///Returns the time that has passed since the game started #define STATION_TIME_PASSED(...) (world.time - SSticker.round_start_time) @@ -10,12 +10,6 @@ /// Define that just has the current in-universe year for use in whatever context you might want to display that in. (For example, 2022 -> 2562 given a 540 year offset) #define CURRENT_STATION_YEAR (GLOB.year_integer + STATION_YEAR_OFFSET) -/// Used in the GLOB year and tgui PreInit -#define UTC_YEAR time2text(world.realtime,"YYYY",NO_TIMEZONE) - -/// In-universe, SS13 is set 540 years in the future from the real-world day, hence this number for determining the year-offset for the in-game year. -#define STATION_YEAR_OFFSET 540 - #define JANUARY 1 #define FEBRUARY 2 #define MARCH 3 diff --git a/code/__HELPERS/logging/mob.dm b/code/__HELPERS/logging/mob.dm index f5f51256f32..d4ab156bcd9 100644 --- a/code/__HELPERS/logging/mob.dm +++ b/code/__HELPERS/logging/mob.dm @@ -46,7 +46,7 @@ if(LOG_RADIO_EMOTE) colored_message = "(RADIOEMOTE) [colored_message]" - var/list/timestamped_message = list("\[[time_stamp(format = "YYYY-MM-DD hh:mm:ss")]\] [key_name_and_tag(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message) + var/list/timestamped_message = list("\[[server_timestamp(format = "YYYY-MM-DD hh:mm:ss")]\] [key_name_and_tag(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message) logging[smessage_type] += timestamped_message diff --git a/code/__HELPERS/logging/research.dm b/code/__HELPERS/logging/research.dm index f352123f9a2..704e8cb6c45 100644 --- a/code/__HELPERS/logging/research.dm +++ b/code/__HELPERS/logging/research.dm @@ -3,4 +3,4 @@ if(!text) return var/html_file = file("[GLOB.log_directory]/[INVESTIGATE_RESEARCH].html") - WRITE_FILE(html_file, "[time_stamp(format = "YYYY-MM-DD hh:mm:ss")] [text]
") + WRITE_FILE(html_file, "[server_timestamp(format = "YYYY-MM-DD hh:mm:ss")] [text]
") diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 59e95ad8e85..eab1103fc81 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,30 +1,14 @@ -/// Returns UTC timestamp with the specifified format and optionally deciseconds -/proc/time_stamp(format = "hh:mm:ss", show_ds) - var/time_string = time2text(world.timeofday, format, TIMEZONE_UTC) +/// Returns UTC timestamp with the specifified format, with optionally deciseconds or optional IC time (year offset), AKA Nanotrasen Standard Time (NST) +/proc/server_timestamp(format = "hh:mm:ss", show_ds, ic_time, twelve_hour_clock) + var/time_string = twelve_hour_clock ? time_to_twelve_hour(format, world.timeofday, world.timezone) : time2text(world.timeofday, format, world.timezone) + if(ic_time && findtext(format, "YYYY")) //if we have a year, replace the year + time_string = replacetext_char(time_string, "[GLOB.year_integer]", CURRENT_STATION_YEAR) return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string -/// Returns timestamp since the server started, for use with world.time -/proc/gameTimestamp(format = "hh:mm:ss", wtime=world.time) +/// Returns timestamp since the round started, AKA Pay Time (PT) +/proc/round_timestamp(format = "hh:mm:ss", wtime = STATION_TIME_PASSED()) return time2text(wtime, format, NO_TIMEZONE) -///returns the current IC station time in a world.time format -/proc/station_time(wtime = world.time) - return (((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % (24 HOURS) - -///returns the current IC station time in a human readable format -/proc/station_time_timestamp(format = "hh:mm:ss", wtime) - return time2text(station_time(wtime), format, NO_TIMEZONE) - -/proc/station_time_debug(force_set) - if(isnum(force_set)) - SSticker.gametime_offset = force_set - return - SSticker.gametime_offset = rand(0, 24 HOURS) //hours in day * minutes in hour * seconds in minute * deciseconds in second - if(prob(50)) - SSticker.gametime_offset = FLOOR(SSticker.gametime_offset, 1 HOURS) - else - SSticker.gametime_offset = CEILING(SSticker.gametime_offset, 1 HOURS) - ///returns timestamp in a sql and a not-quite-compliant ISO 8601 friendly format. Do not use for SQL, use NOW() instead /proc/ISOtime(timevar) return time2text(timevar || world.timeofday, "YYYY-MM-DD hh:mm:ss", world.timezone) @@ -128,7 +112,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) * the format arg is the format passed down to time2text() (e.g. "hh:mm" is hours and minutes but not seconds). * the timezone is the time value offset from the local time. It's to be applied outside time2text() to get the AM/PM right. */ -/proc/time_to_twelve_hour(time, format = "hh:mm:ss", timezone = TIMEZONE_UTC) +/proc/time_to_twelve_hour(format = "hh:mm:ss", time = STATION_TIME_PASSED(), timezone = NO_TIMEZONE) time = MODULUS(time + (timezone * (1 HOURS)), 24 HOURS) var/am_pm = "AM" if(time > 12 HOURS) @@ -137,4 +121,5 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) time -= 12 HOURS // e.g. 4:16 PM but not 00:42 PM else if (time < 1 HOURS) time += 12 HOURS // e.g. 12.23 AM - return "[time2text(time, format)] [am_pm]" + //set NO_TIMEZONE because we've already applied the timezone above. + return "[time2text(time, format, NO_TIMEZONE)] [am_pm]" diff --git a/code/_globalvars/time_vars.dm b/code/_globalvars/time_vars.dm index fd9b925e0d4..a006a4bc699 100644 --- a/code/_globalvars/time_vars.dm +++ b/code/_globalvars/time_vars.dm @@ -1,6 +1,3 @@ -/// The difference betwen midnight (of the host computer) and 0 world.ticks. -GLOBAL_VAR_INIT(timezoneOffset, 0) - -GLOBAL_VAR_INIT(year, UTC_YEAR) +GLOBAL_VAR_INIT(year, time2text(world.timeofday, "YYYY", TIMEZONE_UTC)) GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? diff --git a/code/_onclick/hud/screen_objects/new_player.dm b/code/_onclick/hud/screen_objects/new_player.dm index 5a17abfc5d9..47977aab8eb 100644 --- a/code/_onclick/hud/screen_objects/new_player.dm +++ b/code/_onclick/hud/screen_objects/new_player.dm @@ -695,7 +695,7 @@ if(round_started) new_maptext = "[SSmapping.current_map.map_name]
\ [LAZYLEN(GLOB.clients)] player\s online
\ - [ROUND_TIME()] in
" + [round_timestamp()] in
" new_maptext += "
" else if(hud.mymob.client?.holder) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 0ccde360e3b..4191f5c6fcd 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -396,15 +396,6 @@ /datum/config_entry/flag/enable_night_shifts -/datum/config_entry/flag/randomize_shift_time - -/datum/config_entry/flag/shift_time_realtime - -/datum/config_entry/number/shift_time_start_hour - default = 12 - min_val = 0 - max_val = 23 - /datum/config_entry/number/monkeycap default = 64 min_val = 0 diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 750cdfc7d7c..02cea10cdc8 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -217,7 +217,7 @@ SUBSYSTEM_DEF(economy) "account" = "[account.account_holder]", "cost" = price_to_use, "vendor" = "[astype(vendor, /atom)?.name || vendor]", - "stationtime" = station_time_timestamp("hh:mm"), + "stationtime" = round_timestamp("hh:mm"), )) /** diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index f5c733c0fd6..4e7d0d5fb8a 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -367,7 +367,7 @@ ADMIN_VERB(check_bomb_impacts, R_DEBUG, "Check Bomb Impact", "See what the effec var/y0 = epicenter.y var/z0 = epicenter.z var/area/areatype = get_area(epicenter) - SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flame" = flame_range, "flash" = flash_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = time_stamp("YYYY-MM-DD hh:mm:ss", 1), "possible_cause" = explosion_cause, "possible_suspect" = who_did_it_game_log)) + SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flame" = flame_range, "flash" = flash_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = server_timestamp("YYYY-MM-DD hh:mm:ss", 1), "possible_cause" = explosion_cause, "possible_suspect" = who_did_it_game_log)) // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. // Stereo users will also hear the direction of the explosion! diff --git a/code/controllers/subsystem/networks/modular_computers.dm b/code/controllers/subsystem/networks/modular_computers.dm index eb25e0c97ae..40ce21c51cd 100644 --- a/code/controllers/subsystem/networks/modular_computers.dm +++ b/code/controllers/subsystem/networks/modular_computers.dm @@ -146,7 +146,7 @@ SUBSYSTEM_DEF(modular_computers) */ /datum/controller/subsystem/modular_computers/proc/add_log(log_string) var/list/log_text = list() - log_text += "\[[station_time_timestamp()]\]" + log_text += "\[[round_timestamp()]\]" log_text += "*SYSTEM* - " log_text += log_string log_string = log_text.Join() diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm deleted file mode 100644 index 170f1269614..00000000000 --- a/code/controllers/subsystem/nightshift.dm +++ /dev/null @@ -1,66 +0,0 @@ -SUBSYSTEM_DEF(nightshift) - name = "Night Shift" - wait = 10 MINUTES - - var/nightshift_active = FALSE - var/nightshift_start_time = 702000 //7:30 PM, station time - var/nightshift_end_time = 270000 //7:30 AM, station time - var/nightshift_first_check = 30 SECONDS - - var/high_security_mode = FALSE - var/list/currentrun - -/datum/controller/subsystem/nightshift/Initialize() - if(!CONFIG_GET(flag/enable_night_shifts)) - can_fire = FALSE - return SS_INIT_SUCCESS - -/datum/controller/subsystem/nightshift/fire(resumed = FALSE) - if(resumed) - update_nightshift(resumed = TRUE) - return - if(world.time - SSticker.round_start_time < nightshift_first_check) - return - check_nightshift() - -/datum/controller/subsystem/nightshift/proc/announce(message) - priority_announce( - text = message, - sound = 'sound/announcer/notice/notice2.ogg', - sender_override = "Automated Lighting System Announcement", - color_override = "grey", - ) - -/datum/controller/subsystem/nightshift/proc/check_nightshift() - var/emergency = SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED - var/announcing = TRUE - var/time = station_time() - var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) - if(high_security_mode != emergency) - high_security_mode = emergency - if(night_time) - announcing = FALSE - if(!emergency) - announce("Restoring night lighting configuration to normal operation.") - else - announce("Disabling night lighting: Station is in a state of emergency.") - if(emergency) - night_time = FALSE - if(nightshift_active != night_time) - update_nightshift(night_time, announcing) - -/datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE, resumed = FALSE, forced = FALSE) - if(!resumed) - currentrun = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc) - nightshift_active = active - if(announce) - if (active) - announce("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.") - else - announce("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.") - for(var/obj/machinery/power/apc/APC as anything in currentrun) - currentrun -= APC - if (APC.area && (APC.area.type in GLOB.the_station_areas)) - APC.set_nightshift(nightshift_active) - if(MC_TICK_CHECK && !forced) // subsystem will be in state SS_IDLE if forced by an admin - return diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm index 2e48d593fae..c88237ec7ea 100644 --- a/code/controllers/subsystem/security_level.dm +++ b/code/controllers/subsystem/security_level.dm @@ -42,9 +42,6 @@ SUBSYSTEM_DEF(security_level) if(!selected_level) CRASH("set_level was called with an invalid security level([new_level])") - if(SSnightshift.can_fire && (selected_level.number_level >= SEC_LEVEL_RED || current_security_level.number_level >= SEC_LEVEL_RED)) - SSnightshift.next_fire = world.time + 7 SECONDS // Fire nightshift after the security level announcement is complete - if(announce) level_announce(selected_level, current_security_level.number_level) // We want to announce BEFORE updating to the new level diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 27c0b2d597d..191d270dbbd 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -37,9 +37,8 @@ SUBSYSTEM_DEF(statpanels) global_data += list( "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", - "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss", world.timezone)]", - "Round Time: [ROUND_TIME()]", - "Station Time: [station_time_timestamp()]", + "Server Time/NST: [server_timestamp(format = "YYYY-MM-DD hh:mm:ss")]", + "Shift Time/PT: [(SSticker.round_start_time == 0) ? "Pre-Game" : round_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)]%)", ) diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 9f5d518b6c2..df33cf68c8c 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(tgui) ntos_error = "" basehtml = replacetextEx(basehtml, "", ntos_error) - basehtml = replacetextEx(basehtml, "", "Nanotrasen (c) 2525-[text2num(UTC_YEAR) + STATION_YEAR_OFFSET]") // This can't use the GLOB as it runs before those are populated + basehtml = replacetextEx(basehtml, "", "Nanotrasen (c) 2525-[CURRENT_STATION_YEAR]") /datum/controller/subsystem/tgui/OnConfigLoad() var/storage_iframe = CONFIG_GET(string/storage_cdn_iframe) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 6bd850c3d08..9c5f67ec601 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -38,9 +38,6 @@ SUBSYSTEM_DEF(ticker) var/timeLeft //pregame timer var/start_at - var/gametime_offset = 432000 //Deciseconds to add to world.time for station time. - var/station_time_rate_multiplier = 12 //factor of station time progressal vs real time. - /// Num of players, used for pregame stats on statpanel var/totalPlayers = 0 /// Num of ready players, used for pregame stats on statpanel (only viewable by admins) @@ -131,21 +128,14 @@ SUBSYSTEM_DEF(ticker) GLOB.syndicate_code_response_regex = codeword_match start_at = world.time + (CONFIG_GET(number/lobby_countdown) * (1 SECONDS)) - round_start_time = start_at // May be changed later, but prevents the time from jumping back when the round actually starts - if(CONFIG_GET(flag/randomize_shift_time)) - gametime_offset = rand(0, 23) * (1 HOURS) - else if(CONFIG_GET(flag/shift_time_realtime)) - gametime_offset = world.timeofday + GLOB.timezoneOffset - station_time_rate_multiplier = 1 - else - gametime_offset = (CONFIG_GET(number/shift_time_start_hour) * (1 HOURS)) + return SS_INIT_SUCCESS /datum/controller/subsystem/ticker/fire() switch(current_state) if(GAME_STATE_STARTUP) if(Master.initializations_finished_with_no_players_logged_in) - start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) + start_at = world.time + (CONFIG_GET(number/lobby_countdown) * (1 SECONDS)) for(var/client/C in GLOB.clients) window_flash(C, ignorepref = TRUE) //let them know lobby has opened up. to_chat(world, span_notice("Welcome to [station_name()]!")) @@ -156,9 +146,9 @@ SUBSYSTEM_DEF(ticker) fire() if(GAME_STATE_PREGAME) - //lobby stats for statpanels + //lobby stats for statpanels if(isnull(timeLeft)) - timeLeft = max(0,start_at - world.time) + timeLeft = max(0, start_at - world.time) totalPlayers = LAZYLEN(GLOB.new_player_list) totalPlayersReady = 0 total_admins_ready = 0 @@ -191,7 +181,7 @@ SUBSYSTEM_DEF(ticker) if(!setup()) //setup failed current_state = GAME_STATE_STARTUP - start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) + start_at = world.time + (CONFIG_GET(number/lobby_countdown) * (1 SECONDS)) timeLeft = null Master.SetRunLevel(RUNLEVEL_LOBBY) SEND_SIGNAL(src, COMSIG_TICKER_ERROR_SETTING_UP) diff --git a/code/datums/records/crime.dm b/code/datums/records/crime.dm index 729b85c56b8..a403923ab80 100644 --- a/code/datums/records/crime.dm +++ b/code/datums/records/crime.dm @@ -19,7 +19,7 @@ src.author = author src.details = details src.name = name - src.time = station_time_timestamp() + src.time = round_timestamp() /datum/crime/citation /// Fine for the crime diff --git a/code/datums/request_message.dm b/code/datums/request_message.dm index 18feada06cb..c88433e5ca9 100644 --- a/code/datums/request_message.dm +++ b/code/datums/request_message.dm @@ -21,7 +21,7 @@ /datum/request_message/New(data) sender_department = data["sender_department"] - received_time = station_time_timestamp() + received_time = round_timestamp() content = data["message"] message_verified_by = data["verified"] message_stamped_by = data["stamped"] diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index b55a385e237..08f36ff7036 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -289,7 +289,7 @@ var/delta = world.time - last_dead_time var/new_timeofdeath = owner.timeofdeath + delta owner.timeofdeath = new_timeofdeath - owner.station_timestamp_timeofdeath = station_time_timestamp(wtime=new_timeofdeath) + owner.station_timestamp_timeofdeath = round_timestamp(wtime=new_timeofdeath) last_dead_time = null if(owner.stat == DEAD) last_dead_time = world.time diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm index 05a1d12ed40..6ccc1d2c7b3 100644 --- a/code/game/machinery/computer/accounting.dm +++ b/code/game/machinery/computer/accounting.dm @@ -37,7 +37,7 @@ data["accounts"] = player_accounts data["audit_log"] = SSeconomy.audit_log data["crashing"] = HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING) - data["station_time"] = station_time_timestamp("hh:mm") + data["station_time"] = round_timestamp("hh:mm") return data /obj/machinery/computer/accounting/ui_static_data(mob/user) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 6c56f6e2aa6..a7add4639c3 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -48,7 +48,7 @@ /obj/machinery/computer/apc_control/proc/log_activity(log_text) if(!should_log) return - LAZYADD(logs, "([station_time_timestamp()]): [auth_id] [log_text]") + LAZYADD(logs, "([round_timestamp()]): [auth_id] [log_text]") ///Resets the console's emagged state and re-enables logging of activity /obj/machinery/computer/apc_control/proc/restore_comp(mob/user) diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm index d148b5bd262..108abd8fbf9 100644 --- a/code/game/machinery/computer/records/medical.dm +++ b/code/game/machinery/computer/records/medical.dm @@ -100,7 +100,7 @@ if(!content) return FALSE - var/datum/medical_note/new_note = new(usr.name, content, station_time_timestamp()) + var/datum/medical_note/new_note = new(usr.name, content, round_timestamp()) while(length(target.medical_notes) > 2) target.medical_notes.Cut(1, 2) diff --git a/code/game/machinery/digital_clock.dm b/code/game/machinery/digital_clock.dm index 57c58083aae..e43ed60c32f 100644 --- a/code/game/machinery/digital_clock.dm +++ b/code/game/machinery/digital_clock.dm @@ -110,7 +110,7 @@ if(obj_flags & EMAGGED) station_minutes = rand(0, 99) else - station_minutes = text2num(station_time_timestamp(format = "mm")) + station_minutes = text2num(round_timestamp(format = "mm")) // tenth / the '3' in '31' / 31 -> 3.1 -> 3 var/station_minute_tenth = station_minutes >= 10 ? round(station_minutes * 0.1) : 0 @@ -122,7 +122,7 @@ if(obj_flags & EMAGGED) station_hours = rand(0, 99) else - station_hours = text2num(station_time_timestamp(format = "hh")) + station_hours = text2num(round_timestamp(format = "hh")) // one / the '1' in '12' / 12 -> 1.2 -> 1 var/station_hours_tenth = station_minutes >= 10 ? round(station_hours * 0.1) : 0 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index edce48f662d..3ff1662d99b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1575,7 +1575,7 @@ bolt() //Bolt it! set_electrified(MACHINE_ELECTRIFIED_PERMANENT) //Shock it! if(origin) - LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(origin)]") + LAZYADD(shockedby, "\[[server_timestamp()]\] [key_name(origin)]") /obj/machinery/door/airlock/disable_lockdown() @@ -1599,7 +1599,7 @@ return if(prob(severity*10 - 20) && (secondsElectrified < 30) && (secondsElectrified != MACHINE_ELECTRIFIED_PERMANENT)) set_electrified(30) - LAZYADD(shockedby, "\[[time_stamp()]\]EM Pulse") + LAZYADD(shockedby, "\[[server_timestamp()]\]EM Pulse") /obj/machinery/door/airlock/proc/set_electrified(seconds, mob/user) secondsElectrified = seconds @@ -1616,7 +1616,7 @@ message = "unshocked" else message = "temp shocked for [secondsElectrified] seconds" - LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(user)] - ([uppertext(message)])") + LAZYADD(shockedby, "\[[server_timestamp()]\] [key_name(user)] - ([uppertext(message)])") log_combat(user, src, message) add_hiddenprint(user) diff --git a/code/game/machinery/newscaster/newscaster_data.dm b/code/game/machinery/newscaster/newscaster_data.dm index 59b8f09db47..6c91c94d6af 100644 --- a/code/game/machinery/newscaster/newscaster_data.dm +++ b/code/game/machinery/newscaster/newscaster_data.dm @@ -207,7 +207,7 @@ GLOBAL_LIST_EMPTY(request_list) var/datum/feed_message/new_article = new /datum/feed_message new_article.author = author new_article.body = msg - new_article.time_stamp = "[station_time_timestamp()]" + new_article.time_stamp = "[round_timestamp()]" new_article.is_admin_message = adminMessage new_article.locked = !allow_comments @@ -243,7 +243,7 @@ GLOBAL_LIST_EMPTY(request_list) var/datum/feed_comment/new_feed_comment = new/datum/feed_comment new_feed_comment.author = newscaster_username new_feed_comment.body = comment_text - new_feed_comment.time_stamp = station_time_timestamp() + new_feed_comment.time_stamp = round_timestamp() GLOB.news_network.last_action ++ current_message.comments += new_feed_comment if(user) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index f9fb183e53e..cb34bf1e813 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -105,7 +105,7 @@ if (calibrating) calibrating += world.time say("Calibrating... Estimated wait time: [rand(3, 9)] minutes.") - pda_msgs += new /datum/data_tablet_msg("System Administrator", "system", "This is an automated message. System calibration started at [station_time_timestamp()].") + pda_msgs += new /datum/data_tablet_msg("System Administrator", "system", "This is an automated message. System calibration started at [server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()]).") else pda_msgs += new /datum/data_tablet_msg("System Administrator", "system", MESSAGE_SERVER_FUNCTIONING_MESSAGE) diff --git a/code/game/objects/items/AI_modules/_AI_modules.dm b/code/game/objects/items/AI_modules/_AI_modules.dm index 3422f57ac3b..69c809c903e 100644 --- a/code/game/objects/items/AI_modules/_AI_modules.dm +++ b/code/game/objects/items/AI_modules/_AI_modules.dm @@ -89,7 +89,7 @@ else to_chat(user, span_notice("Upload complete.")) - var/time = time2text(world.realtime,"hh:mm:ss", TIMEZONE_UTC) + var/time = round_timestamp() var/ainame = law_datum.owner ? law_datum.owner.name : "empty AI core" var/aikey = law_datum.owner ? law_datum.owner.ckey : "null" diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm index c541e513a0d..5e0376879e7 100644 --- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm +++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm @@ -54,8 +54,9 @@ var/obj/item/paper/autopsy_report = new(get_turf(src)) autopsy_report.color = "#99ccff" - autopsy_report.name = "autopsy report of [scanned] - [station_time_timestamp()])" - var/final_report_text = "
Autopsy report. Time of Autopsy: [station_time_timestamp()]
" + autopsy_report.name = "autopsy report of [scanned] - [server_timestamp(format = "hh:mm", ic_time = TRUE)]" + var/final_report_text = "
Autopsy report
\ + Time of Autopsy: [UNDERLINED_HTML_TEXT("[server_timestamp(format = "hh:mm", ic_time = TRUE)]", "Shift Time: [round_timestamp(format = "hh:mm")]")]
" //A lot of this is extremely similar to /proc/healthscan() - but with different formatting, no color, and some added/removed info //Does not list quirks/exhaustion/how to repair wounds @@ -240,7 +241,7 @@ autopsy_information += "Coroner's Notes:" //Bottom of the page, anything past here is player-written final_report_text += jointext(autopsy_information, "") - autopsy_report.add_raw_text(final_report_text) + autopsy_report.add_raw_text(final_report_text, advanced_html = TRUE) autopsy_report.update_appearance() user.put_in_hands(autopsy_report) user.balloon_alert(user, "report printed") diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index a3684806967..c3ae145b51e 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -80,7 +80,7 @@ span_notice("You stupidly try to analyze [scan_turf]'s vitals!"), ) - var/floor_text = "Analyzing results for [scan_turf] ([station_time_timestamp()]):
" + var/floor_text = "Analyzing results for [scan_turf] ([round_timestamp()]):
" floor_text += "Overall status: Unknown
" floor_text += "Subject lacks a brain.
" floor_text += "Body temperature: [scan_turf?.return_air()?.return_temperature() || "???"]
" @@ -168,7 +168,7 @@ oxy_loss += 200 - (oxy_loss + tox_loss + fire_loss + brute_loss) oxy_loss = clamp(oxy_loss, 0, 200) - render_list += "[span_info("Analyzing results for [target] ([station_time_timestamp()]):")]
Overall status: [mob_status]
" + render_list += "[span_info("Analyzing results for [target] ([round_timestamp()]):")]
Overall status: [mob_status]
" if(!advanced && target.has_reagent(/datum/reagent/inverse/technetium)) advanced = TRUE @@ -474,11 +474,12 @@ var/obj/item/paper/medical_report/report_paper = new(get_turf(src)) report_paper.color = "#99ccff" - report_paper.name = "health scan report - [station_time_timestamp()]" - var/report_text = "
Health scan report. Time of retrieval: [station_time_timestamp()]

" + report_paper.name = "health scan report - [server_timestamp(format = "hh:mm", ic_time = TRUE)]" + var/report_text = "
Health scan report
\ + Time of retrieval: [UNDERLINED_HTML_TEXT("[server_timestamp(format = "hh:mm", ic_time = TRUE)]", "Shift Time: [round_timestamp(format = "hh:mm")]")]

" report_text += last_scan_text - report_paper.add_raw_text(report_text) + report_paper.add_raw_text(report_text, advanced_html = TRUE) report_paper.update_appearance() user.put_in_hands(report_paper) diff --git a/code/game/objects/items/devices/table_clock.dm b/code/game/objects/items/devices/table_clock.dm index 0d819536366..c4420a81383 100644 --- a/code/game/objects/items/devices/table_clock.dm +++ b/code/game/objects/items/devices/table_clock.dm @@ -31,8 +31,9 @@ if(broken) . += span_info("It appears to be currently broken. You can use it in-hand to repair it.") else - . += span_info("The current CST (local) time is: [station_time_timestamp()].") - . += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", NO_TIMEZONE)].") + . += span_info("The current NST (local) time is: [server_timestamp(ic_time = TRUE, twelve_hour_clock = user.client?.prefs.read_preference(/datum/preference/toggle/twelve_hour))].") + if(user.is_literate()) + . += span_info("That means it is currently [round_timestamp()] into the shift.") /obj/item/table_clock/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ce765778cb6..a4f64946c0e 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1139,7 +1139,9 @@ /obj/item/toy/clockwork_watch/examine(mob/user) . = ..() - . += span_info("Station Time: [station_time_timestamp()]") + . += span_info("Station Time: [server_timestamp(ic_time = TRUE, twelve_hour_clock = user.client?.prefs.read_preference(/datum/preference/toggle/twelve_hour))]") + if(user.is_literate()) + . += span_info("That means it is currently [round_timestamp()] into the shift.") /* * Toy Dagger diff --git a/code/game/objects/structures/signs/signs_interactive.dm b/code/game/objects/structures/signs/signs_interactive.dm index 5ef9031fef9..49ae5ba6c29 100644 --- a/code/game/objects/structures/signs/signs_interactive.dm +++ b/code/game/objects/structures/signs/signs_interactive.dm @@ -1,14 +1,15 @@ /obj/structure/sign/clock name = "wall clock" - desc = "It's your run-of-the-mill wall clock showing both the local Coalition Standard Time and the galactic Treaty Coordinated Time. Perfect for staring at instead of working." + desc = "It's your run-of-the-mill wall clock showing both the local Nanotrasen Standard Time and the galactic Treaty Coordinated Time. Perfect for staring at instead of working." icon_state = "clock" MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/clock, 32) /obj/structure/sign/clock/examine(mob/user) . = ..() - . += span_info("The current CST (local) time is: [station_time_timestamp()].") - . += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", 0)].") + . += span_info("The current NST (local) time is: [server_timestamp(ic_time = TRUE, twelve_hour_clock = user.client?.prefs.read_preference(/datum/preference/toggle/twelve_hour))].") + if(user.is_literate()) + . += span_info("That means it is currently [round_timestamp()] into the shift.") /obj/structure/sign/calendar name = "wall calendar" diff --git a/code/game/world.dm b/code/game/world.dm index a243dd09e38..7561bfbd4bb 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -126,12 +126,7 @@ GLOBAL_VAR(restart_counter) * All atoms in both compiled and uncompiled maps are initialized() */ /world/New() - log_world("World loaded at [time_stamp()]!") - - // From a really fucking old commit (91d7150) - // I wanted to move it but I think this needs to be after /world/New is called but before any sleeps? - // - Dominion/Cyberboss - GLOB.timezoneOffset = world.timezone * 36000 + log_world("World loaded at [server_timestamp()]!") // First possible sleep() InitTgs() @@ -244,7 +239,7 @@ GLOBAL_VAR(restart_counter) GLOB.picture_logging_prefix += "R_[GLOB.round_id]_" GLOB.picture_log_directory += "[GLOB.round_id]" else - var/timestamp = replacetext(time_stamp(), ":", ".") + var/timestamp = replacetext(server_timestamp(), ":", ".") GLOB.log_directory += "[timestamp]" GLOB.picture_log_directory += "[timestamp]" GLOB.picture_logging_prefix += "T_[timestamp]_" @@ -373,14 +368,14 @@ GLOBAL_VAR_INIT(last_maptick_time, 0) return #else if(check_hard_reboot()) - log_world("World hard rebooted at [time_stamp()]") + log_world("World hard rebooted at [server_timestamp()]") shutdown_logging() // See comment below. QDEL_NULL(Tracy) QDEL_NULL(Debugger) TgsEndProcess() return ..() - log_world("World rebooted at [time_stamp()]") + log_world("World rebooted at [server_timestamp()]") shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. QDEL_NULL(Tracy) @@ -436,7 +431,7 @@ GLOBAL_VAR_INIT(last_maptick_time, 0) else if(SSticker.current_state == GAME_STATE_SETTING_UP) new_status += "
Starting: Now" else if(SSticker.IsRoundInProgress()) - new_status += "
Time: [time2text(STATION_TIME_PASSED(), "hh:mm", NO_TIMEZONE)]" + new_status += "
Time: [round_timestamp("hh:mm")]" if(SSshuttle?.emergency && SSshuttle?.emergency?.mode != (SHUTTLE_IDLE || SHUTTLE_ENDGAME)) new_status += " | Shuttle: [SSshuttle.emergency.getModeStr()] [SSshuttle.emergency.getTimerStr()]" else if(SSticker.current_state == GAME_STATE_FINISHED) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index e3840198665..642675dfc37 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -10,7 +10,7 @@ var/mob/living/source_mob = src source += " ([source_mob.ckey ? source_mob.ckey : "*no key*"])" - WRITE_FILE(F, "[time_stamp(format = "YYYY-MM-DD hh:mm:ss")] [REF(src)] ([x],[y],[z]) || [source] [message]
") + WRITE_FILE(F, "[server_timestamp(format = "YYYY-MM-DD hh:mm:ss")] [REF(src)] ([x],[y],[z]) || [source] [message]
") ADMIN_VERB(investigate_show, R_NONE, "Investigate", "Browse various detailed logs.", ADMIN_CATEGORY_GAME) var/static/list/investigates = list( diff --git a/code/modules/admin/verbs/admin_newscaster.dm b/code/modules/admin/verbs/admin_newscaster.dm index e300150659b..ec96d8babce 100644 --- a/code/modules/admin/verbs/admin_newscaster.dm +++ b/code/modules/admin/verbs/admin_newscaster.dm @@ -311,7 +311,7 @@ ADMIN_VERB(access_news_network, R_ADMIN, "Access Newscaster Network", "Allows yo var/datum/feed_comment/new_feed_comment = new /datum/feed_comment new_feed_comment.author = "Centcom Official" new_feed_comment.body = comment_text - new_feed_comment.time_stamp = station_time_timestamp() + new_feed_comment.time_stamp = round_timestamp() current_message.comments += new_feed_comment GLOB.news_network.last_action ++ usr.log_message("(as an admin) commented on message [current_message.return_body(-1)] -- [current_message.body]", LOG_COMMENT) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 4c235a48ca3..94f9eae85fb 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -278,7 +278,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) "PLAYERS" = player_count, "ROUND STATE" = round_state, "ROUND ID" = GLOB.round_id, - "ROUND TIME" = ROUND_TIME(), + "ROUND TIME" = round_timestamp(), "MESSAGE" = message, "ADMINS" = admin_text, ) @@ -356,9 +356,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) heard_by_no_admins = FALSE send2adminchat(initiator_ckey, "Ticket #[id]: Answered by [key_name(usr)]") - ticket_interactions += "[time_stamp()]: [formatted_message]" + ticket_interactions += "[server_timestamp()]: [formatted_message]" if (!isnull(player_message)) - player_interactions += "[time_stamp()]: [player_message]" + player_interactions += "[server_timestamp()]: [player_message]" //Removes the ahelp verb and returns it after 2 minutes /datum/admin_help/proc/TimeoutVerb() @@ -566,9 +566,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]" - dat += "

Opened at: [gameTimestamp(wtime = opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" + dat += "

Opened at: [round_timestamp(wtime = opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) - dat += "
Closed at: [gameTimestamp(wtime = closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" + dat += "
Closed at: [round_timestamp(wtime = closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" dat += "

" if(initiator) dat += "Actions: [FullMonty(ref_src)]
" @@ -666,9 +666,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) else dat += "UNKNOWN" dat += "\n[FOURSPACES]Refresh" - dat += "

Opened at: [gameTimestamp("hh:mm:ss", opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" + dat += "

Opened at: [round_timestamp("hh:mm:ss", opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) - dat += "
Closed at: [gameTimestamp("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" + dat += "
Closed at: [round_timestamp("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" dat += "

" dat += "
Log:

" for (var/interaction in player_interactions) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 33c9afe6d5e..84ccaf2935b 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -163,21 +163,6 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w log_admin("[key_name(holder)] reset the station name.") message_admins(span_adminnotice("[key_name_admin(holder)] reset the station name.")) priority_announce("[command_name()] has renamed the station to \"[new_name]\".") - if("night_shift_set") - var/val = tgui_alert(holder, "What do you want to set night shift to? This will override the automatic system until set to automatic again.", "Night Shift", list("On", "Off", "Automatic")) - switch(val) - if("Automatic") - if(CONFIG_GET(flag/enable_night_shifts)) - SSnightshift.can_fire = TRUE - SSnightshift.fire() - else - SSnightshift.update_nightshift(active = FALSE, announce = TRUE, forced = TRUE) - if("On") - SSnightshift.can_fire = FALSE - SSnightshift.update_nightshift(active = TRUE, announce = TRUE, forced = TRUE) - if("Off") - SSnightshift.can_fire = FALSE - SSnightshift.update_nightshift(active = FALSE, announce = TRUE, forced = TRUE) if("moveferry") SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send CentCom Ferry")) if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away")) diff --git a/code/modules/admin/verbs/sprite_auditor.dm b/code/modules/admin/verbs/sprite_auditor.dm index 64022618c28..e1ffc660706 100644 --- a/code/modules/admin/verbs/sprite_auditor.dm +++ b/code/modules/admin/verbs/sprite_auditor.dm @@ -11,7 +11,7 @@ GLOBAL_DATUM_INIT(sprite_auditor, /datum/sprite_auditor, new) "name" = author.real_name, "ckey" = author.ckey, "appearance" = icon_appearance, - "timestamp" = gameTimestamp(), + "timestamp" = round_timestamp(), ))) SStgui.update_uis(src) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 48aeb721c1a..0c5efc1a959 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -555,7 +555,7 @@ to_chat(user, span_boldnotice("[name] completed!")) to_chat(user, span_hypnophrase(span_big("[pick_list(HERETIC_INFLUENCE_FILE, "drain_message")]"))) desc += " (Completed!)" - log_heretic_knowledge("[key_name(user)] completed a [name] at [gameTimestamp()].") + log_heretic_knowledge("[key_name(user)] completed a [name] at [round_timestamp()].") user.add_mob_memory(/datum/memory/heretic_knowledge_ritual) SEND_SIGNAL(our_heretic, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL) return TRUE @@ -586,7 +586,7 @@ var/list/cost = our_heretic.researched_knowledge[knowledge][HKT_COST] total_points += cost - log_heretic_knowledge("[key_name(user)] gained knowledge of their final ritual at [gameTimestamp()]. \ + log_heretic_knowledge("[key_name(user)] gained knowledge of their final ritual at [round_timestamp()]. \ They have [length(our_heretic.researched_knowledge)] knowledge nodes researched, totalling [total_points] points \ and have sacrificed [our_heretic.total_sacrifices] people ([our_heretic.high_value_sacrifices] of which were high value)") @@ -636,7 +636,7 @@ human_user.physiology.burn_mod *= 0.5 SSblackbox.record_feedback("tally", "heretic_ascended", 1, heretic_datum.heretic_path.route) - log_heretic_knowledge("[key_name(user)] completed their final ritual at [gameTimestamp()].") + log_heretic_knowledge("[key_name(user)] completed their final ritual at [round_timestamp()].") notify_ghosts( "[user.real_name] has completed an ascension ritual!", source = user, diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index af2f2f655eb..0f62be3dbab 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -109,7 +109,7 @@ var/requisition_text = "

[station_name()] Supply Requisition

" requisition_text += "
" requisition_text += "Order #[id]
" - requisition_text+= "Time of Order: [station_time_timestamp()]
" + requisition_text += "Time of Order: [UNDERLINED_HTML_TEXT("[server_timestamp(ic_time = TRUE)]", "Shift Time: [round_timestamp()]")]
" requisition_text += "Item: [pack.name]
" requisition_text += "Access Restrictions: [SSid_access.get_access_desc(pack.access)]
" requisition_text += "Requested by: [orderer]
" @@ -118,7 +118,7 @@ requisition_text += "Rank: [orderer_rank]
" requisition_text += "Comment: [reason]
" - requisition_paper.add_raw_text(requisition_text) + requisition_paper.add_raw_text(requisition_text, advanced_html = TRUE) requisition_paper.update_appearance() return requisition_paper diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index b3964610671..cda0c1a37e7 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -394,10 +394,10 @@ //create the paper from the SSshuttle.shopping_list if(length(SSshuttle.shopping_list)) var/obj/item/paper/requisition/requisition_paper = new(get_turf(src)) - requisition_paper.name = "requisition form - [station_time_timestamp()]" + requisition_paper.name = "requisition form - [server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()])" var/requisition_text = "

[station_name()] Supply Requisition

" requisition_text += "
" - requisition_text += "Time of Order: [station_time_timestamp()]

" + requisition_text += "Time of Order: [UNDERLINED_HTML_TEXT("[server_timestamp(ic_time = TRUE)]", "Shift Time: [round_timestamp()]")]

" for(var/datum/supply_order/order as anything in SSshuttle.shopping_list) requisition_text += "[order.pack.name]
" requisition_text += "- Order ID: [order.id]
" @@ -412,7 +412,7 @@ if(reason) requisition_text += "- Reason Given: [reason]
" requisition_text += "

" - requisition_paper.add_raw_text(requisition_text) + requisition_paper.add_raw_text(requisition_text, advanced_html = TRUE) requisition_paper.color = "#9ef5ff" requisition_paper.update_appearance() diff --git a/code/modules/client/preferences/time.dm b/code/modules/client/preferences/time.dm new file mode 100644 index 00000000000..698618571ec --- /dev/null +++ b/code/modules/client/preferences/time.dm @@ -0,0 +1,5 @@ +/datum/preference/toggle/twelve_hour + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "twelve_hour" + savefile_identifier = PREFERENCE_PLAYER + default_value = FALSE diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index a7cebef7bf2..bb1285c11a5 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -117,7 +117,7 @@ // Start gathering log_entry.scan_target = scanned_atom.name - log_entry.scan_time = station_time_timestamp() + log_entry.scan_time = round_timestamp() var/list/atom_fibers = GET_ATOM_FIBRES(scanned_atom) if(length(atom_fibers)) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index f8355f53064..57eab84a1f9 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -110,7 +110,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) var/skipcount = abs(error_cooldown[erroruid]) - 1 error_cooldown[erroruid] = 0 if(skipcount > 0) - SEND_TEXT(world.log, "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line].") + SEND_TEXT(world.log, "\[[server_timestamp()]] Skipped [skipcount] runtimes in [E.file],[E.line].") GLOB.error_cache.log_error(E, skip_count = skipcount) error_last_seen[erroruid] = world.time @@ -158,7 +158,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(GLOB.error_cache) GLOB.error_cache.log_error(E, desclines) - var/main_line = "\[[time_stamp()]] Runtime in [E.file],[E.line]: [E]" + var/main_line = "\[[server_timestamp()]] Runtime in [E.file],[E.line]: [E]" SEND_TEXT(world.log, main_line) for(var/line in desclines) SEND_TEXT(world.log, line) diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index fa0d1dcc981..7ffba15b40f 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -131,10 +131,10 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) /datum/error_viewer/error_source/New(exception/e) if (!istype(e)) - name = "\[[time_stamp()]] Uncaught exceptions" + name = "\[[server_timestamp()]] Uncaught exceptions" return - name = "\[[time_stamp()]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" + name = "\[[server_timestamp()]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" /datum/error_viewer/error_source/show_to(user, datum/error_viewer/back_to, linear) if (!istype(back_to)) @@ -156,15 +156,15 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) /datum/error_viewer/error_entry/New(exception/e, list/desclines, skip_count) if (!istype(e)) - name = "\[[time_stamp()]] Uncaught exception: [html_encode(e.name)]" + name = "\[[server_timestamp()]] Uncaught exception: [html_encode(e.name)]" return if(skip_count) - name = "\[[time_stamp()]] Skipped [skip_count] runtimes in [e.file],[e.line]." + name = "\[[server_timestamp()]] Skipped [skip_count] runtimes in [e.file],[e.line]." is_skip_count = TRUE return - name = "\[[time_stamp()]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" + name = "\[[server_timestamp()]] Runtime in [e.file], line [e.line]: [html_encode(e.name)]" exc = e if (istype(desclines)) for (var/line in desclines) diff --git a/code/modules/escape_menu/details.dm b/code/modules/escape_menu/details.dm index 00267ecba5d..69a6cc8f4d8 100644 --- a/code/modules/escape_menu/details.dm +++ b/code/modules/escape_menu/details.dm @@ -1,42 +1,16 @@ -// This doesn't instantiate right away, since we rely on other GLOBs -GLOBAL_DATUM(escape_menu_details, /atom/movable/screen/escape_menu/details) - -/// Provides a singleton for the escape menu details screen. -/proc/give_escape_menu_details() - if (isnull(GLOB.escape_menu_details)) - GLOB.escape_menu_details = new - - return GLOB.escape_menu_details - /atom/movable/screen/escape_menu/details - screen_loc = "EAST:-180,NORTH:-34" + screen_loc = "EAST:-175,NORTH:-40" maptext_height = 100 maptext_width = 200 -/atom/movable/screen/escape_menu/details/Initialize(mapload, datum/hud/hud_owner) - . = ..() - - update_text() - START_PROCESSING(SSescape_menu, src) - -/atom/movable/screen/escape_menu/details/Destroy() - if (GLOB.escape_menu_details == src) - stack_trace("Something tried to delete the escape menu details screen") - return QDEL_HINT_LETMELIVE - - STOP_PROCESSING(SSescape_menu, src) - return ..() - -/atom/movable/screen/escape_menu/details/process(seconds_per_tick) - update_text() - -/atom/movable/screen/escape_menu/details/proc/update_text() +/atom/movable/screen/escape_menu/details/proc/update_text(client/client_owner) var/new_maptext = {" Round ID: [GLOB.round_id || "Unset"]
- Round Time: [ROUND_TIME()]
+ Server Time (NST): [server_timestamp(format = "hh:mm:ss", ic_time = TRUE, twelve_hour_clock = client_owner.prefs.read_preference(/datum/preference/toggle/twelve_hour))]
+ Shift Time (PT): [(SSticker.round_start_time == 0) ? "Pre-Game" : round_timestamp()]
Map: [SSmapping.current_map.return_map_name(webmap_included = TRUE) || "Loading..."]
- Time Dilation: [round(SStime_track.time_dilation_current,1)]%
+ Time Dilation: [round(SStime_track.time_dilation_current, 1)]%
"} diff --git a/code/modules/escape_menu/escape_menu.dm b/code/modules/escape_menu/escape_menu.dm index 0042a6f7332..53940e0ae07 100644 --- a/code/modules/escape_menu/escape_menu.dm +++ b/code/modules/escape_menu/escape_menu.dm @@ -24,6 +24,8 @@ GLOBAL_LIST_EMPTY(escape_menus) var/client/client /// A weakref to the hud this escape menu currently applies to var/datum/weakref/our_hud_ref + /// The details at the top right that persists through all screens, showing round info. + var/atom/movable/screen/escape_menu/details/detail_screen VAR_PRIVATE ckey @@ -49,6 +51,8 @@ GLOBAL_LIST_EMPTY(escape_menus) base_holder = new(client) if(isnull(dim_screen)) dim_screen = new() + detail_screen = new() + detail_screen.update_text(client) populate_base_ui() page_holder = new(client) @@ -64,7 +68,10 @@ GLOBAL_LIST_EMPTY(escape_menus) if (!isnull(ckey)) GLOB.escape_menus[ckey] = src + START_PROCESSING(SSescape_menu, src) + /datum/escape_menu/Destroy(force) + STOP_PROCESSING(SSescape_menu, src) QDEL_NULL(base_holder) QDEL_NULL(page_holder) resource_panels = null // list contents were already qdeled in QDEL_NULL(page_holder), so we can safely null this @@ -82,6 +89,9 @@ GLOBAL_LIST_EMPTY(escape_menus) return ..() +/datum/escape_menu/process(seconds_per_tick) + detail_screen.update_text(client) + /datum/escape_menu/proc/on_client_qdel() SIGNAL_HANDLER PRIVATE_PROC(TRUE) @@ -127,7 +137,7 @@ GLOBAL_LIST_EMPTY(escape_menus) PRIVATE_PROC(TRUE) base_holder.give_protected_screen_object(dim_screen) - base_holder.give_protected_screen_object(give_escape_menu_details()) + base_holder.give_screen_object(detail_screen) /datum/escape_menu/proc/open_home_page() PRIVATE_PROC(TRUE) diff --git a/code/modules/events/nightshift.dm b/code/modules/events/nightshift.dm new file mode 100644 index 00000000000..785ad8e04ac --- /dev/null +++ b/code/modules/events/nightshift.dm @@ -0,0 +1,78 @@ +/datum/round_event_control/nightshift + name = "Night Shift" + typepath = /datum/round_event/nightshift + weight = 2 + max_occurrences = 1 + earliest_start = 30 SECONDS + category = EVENT_CATEGORY_FRIENDLY + description = "Sets the station's lights to Night Shift mode for the next 20 minutes." + +/datum/round_event_control/nightshift/New() + . = ..() + if(!CONFIG_GET(flag/enable_night_shifts)) + max_occurrences = 0 + +/datum/round_event/nightshift + announce_when = 1 + start_when = 1 + end_when = 700 //~22 Minutes + fakeable = FALSE + + ///Whether the nightshift is on or not, synced to the alert level (which decides whether we're active) + ///TRUE means they are disabled by red alert. + var/nightshift_disabled = FALSE + ///APCs to update through ticks to account for lag. + var/list/currentrun + +/datum/round_event/nightshift/announce(fake) + update_nightshift(active = TRUE, announce = TRUE) + +/datum/round_event/nightshift/tick() + var/emergency = (SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) + if(nightshift_disabled != emergency) + nightshift_disabled = emergency + if(emergency) + update_nightshift(active = FALSE, resume = TRUE) + else + update_nightshift(active = TRUE, resume = TRUE) + + update_machines() + +/datum/round_event/nightshift/end() + update_nightshift(active = FALSE, announce = TRUE) + +///Called several times, to start & stop nightlights including during red alert/de-red alerting. +/datum/round_event/nightshift/proc/update_nightshift(active, resume = FALSE, announce = FALSE) + currentrun = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/apc) + + if(announce) + if(active) + send_announcement("Good evening, crew. To reduce power consumption and stimulate the circadian rhythms of some species, all of the lights aboard the station have been dimmed for the night.") + else + send_announcement("Good morning, crew. As it is now day time, all of the lights aboard the station have been restored to their former brightness.") + + if(resume) + if(active) + send_announcement("Restoring night lighting configuration to normal operation.") + else + send_announcement("Disabling night lighting: Station is in a state of emergency.") + + update_machines() + +///Called on process that will slowly update all APCs to be nightlight +/datum/round_event/nightshift/proc/update_machines() + for(var/obj/machinery/power/apc/APC as anything in currentrun) + currentrun -= APC + if (APC.area && (APC.area.type in GLOB.the_station_areas)) + APC.set_nightshift(!nightshift_disabled) + if(TICK_CHECK) + return + +///Custom messages sent throughout the event that we'll do here, instead of using the `announce` proc that's only at the start. +/datum/round_event/nightshift/proc/send_announcement(message) + priority_announce( + text = message, + sound = 'sound/announcer/notice/notice2.ogg', + sender_override = "Automated Lighting System Announcement", + color_override = "grey", + ) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 15368d2c543..31458a4a129 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -121,8 +121,7 @@ /datum/chemical_reaction/food/chocolatepudding/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) . = ..() - var/station_time = station_time() - if(!ISINRANGE(station_time, 3 HOURS + 45 MINUTES, 4 HOURS + 15 MINUTES)) + if(!ISINRANGE(world.timeofday, 3 HOURS + 45 MINUTES, 4 HOURS + 15 MINUTES)) return var/lastkey = holder.my_atom?.fingerprintslast if(!lastkey) diff --git a/code/modules/forensics/_forensics.dm b/code/modules/forensics/_forensics.dm index e03790e27b0..af37a9b5958 100644 --- a/code/modules/forensics/_forensics.dm +++ b/code/modules/forensics/_forensics.dm @@ -214,7 +214,7 @@ var/mob/living/carbon/human/human_suspect = suspect if(human_suspect.gloves) has_gloves = "(gloves)" - var/current_time = time_stamp() + var/current_time = round_timestamp() if(!LAZYACCESS(hiddenprints, suspect.key)) LAZYSET(hiddenprints, suspect.key, "First: \[[current_time]\] \"[suspect.real_name]\"[has_gloves]. Ckey: [suspect.ckey]") else diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index d35002d32f5..deb61dca16b 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -564,7 +564,7 @@ var/alist/user_data /datum/ore_silo_log/New(obj/machinery/M, _action, _amount, _noun, list/mats=list(), alist/user_data) - timestamp = station_time_timestamp() + timestamp = round_timestamp() machine_name = M.name area_name = get_area_name(M, TRUE) action = _action diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 32421516713..a7de4804b76 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -232,7 +232,7 @@ set_stat(DEAD) timeofdeath = world.time - station_timestamp_timeofdeath = station_time_timestamp() + station_timestamp_timeofdeath = round_timestamp() var/turf/death_turf = get_turf(src) var/area/death_area = get_area(src) // Display a death message if the mob is a player mob (has an active mind) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 240ddabf39d..1ae21953f23 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -487,7 +487,7 @@ create_modularInterface() var/mob/living/silicon/robot/robo = modularInterface.silicon_owner if(istype(robo)) - modularInterface.borglog += "[station_time_timestamp()] - [string]" + modularInterface.borglog += "[round_timestamp()] - [string]" var/datum/computer_file/program/robotact/program = modularInterface.get_robotact() if(program) var/datum/tgui/active_ui = SStgui.get_open_ui(src, program.computer) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 14bb9471a7c..765bfe5b89f 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -542,7 +542,7 @@ if(stat != DEAD) if(!silent) emote("deathgasp") - station_timestamp_timeofdeath = station_time_timestamp() + station_timestamp_timeofdeath = round_timestamp() if(!HAS_TRAIT(src, TRAIT_FAKEDEATH) && !silent) send_death_moodlets() diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index cf88eeffb1f..9cc733599ba 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -244,7 +244,7 @@ /obj/item/mod/module/status_readout/add_ui_data() . = ..() .["display_time"] = display_time - .["shift_time"] = station_time_timestamp() + .["shift_time"] = round_timestamp() .["shift_id"] = GLOB.round_id .["health"] = mod.wearer?.health || 0 .["health_max"] = mod.wearer?.getMaxHealth() || 0 diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index cced073163e..1225479d73b 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -687,7 +687,7 @@ data["PC_programheaders"] = program_headers - data["PC_stationtime"] = station_time_timestamp() + data["PC_stationtime"] = round_timestamp() data["PC_stationdate"] = "[time2text(world.realtime, "DDD, Month DD", NO_TIMEZONE)], [CURRENT_STATION_YEAR]" data["PC_showexitprogram"] = !!active_program // Hides "Exit Program" button on mainscreen return data diff --git a/code/modules/modular_computers/file_system/programs/chatroom/conversation.dm b/code/modules/modular_computers/file_system/programs/chatroom/conversation.dm index 969e56195ed..0e65dfedd2a 100644 --- a/code/modules/modular_computers/file_system/programs/chatroom/conversation.dm +++ b/code/modules/modular_computers/file_system/programs/chatroom/conversation.dm @@ -46,13 +46,13 @@ return ..() /datum/ntnet_conversation/proc/add_message(message, username) - message = "[station_time_timestamp(format = "hh:mm")] [username]: [message]" + message = "[round_timestamp(format = "hh:mm")] [username]: [message]" messages["[next_message_id]"] = message next_message_id++ trim_message_list() /datum/ntnet_conversation/proc/add_status_message(message) - message = "[station_time_timestamp(format = "hh:mm")] -!- [message]" + message = "[round_timestamp(format = "hh:mm")] -!- [message]" messages["[next_message_id]"] = message next_message_id++ trim_message_list() diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index d0dcf0ae873..eccb78a58ff 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -23,7 +23,7 @@
[GLOB.manifest ? GLOB.manifest.get_html(0) : ""] "} - if(!computer.print_text(contents, "crew manifest ([station_time_timestamp()])")) + if(!computer.print_text(contents, "crew manifest ([round_timestamp()])")) to_chat(usr, span_notice("Printer is out of paper.")) return else diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index dc83a7a76ae..e393ff2a60f 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -544,7 +544,7 @@ return FALSE // Log it in our logs - var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone) + var/datum/pda_message/message_datum = new(message, TRUE, round_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone) for(var/datum/pda_chat/target_chat as anything in target_chats) target_chat.add_message(message_datum, show_in_recents = !everyone) target_chat.unread_messages = 0 @@ -675,7 +675,7 @@ // don't create a new chat for rigged messages, make it a one off notif if(!is_rigged) - var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"]) + var/datum/pda_message/message = new(signal.data["message"], FALSE, round_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"]) chat = find_chat_by_recipient(is_fake_user ? fake_name : sender_ref, is_fake_user) if(!istype(chat)) diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index b82d9549764..1761a7fe69f 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -477,7 +477,7 @@ GLOBAL_VAR_INIT(fax_autoprinting, FALSE) var/list/history_data = list() history_data["history_type"] = history_type history_data["history_fax_name"] = history_fax_name - history_data["history_time"] = station_time_timestamp() + history_data["history_time"] = round_timestamp() fax_history += list(history_data) /// Clears the history of fax operations. diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 78f591b3ec3..5b2459d3caf 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -233,9 +233,9 @@ if(is_signature) field_text = signature_name else if(is_date) - field_text = "[time2text(world.timeofday, "DD/MM", NO_TIMEZONE)]/[CURRENT_STATION_YEAR]" + field_text = "[server_timestamp("DD/MM/YYYY", ic_time = TRUE)]" else if(is_time) - field_text = time2text(world.timeofday, "hh:mm", NO_TIMEZONE) + field_text = round_timestamp() var/field_font = is_signature ? SIGNATURE_FONT : font diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 2f53861f406..4af0bb0496b 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -660,9 +660,11 @@ equipment = autoset(equipment, AUTOSET_ON) lighting = autoset(lighting, AUTOSET_ON) environ = autoset(environ, AUTOSET_ON) - if(nightshift_lights && low_power_nightshift_lights) + //If nightlights are on, and we're recovering from low power/nightlight event, we'll remove it. + var/nightshift_disabled = !(locate(/datum/round_event/nightshift) in SSevents.running) + if(nightshift_lights && (nightshift_disabled || low_power_nightshift_lights)) low_power_nightshift_lights = FALSE - if(!SSnightshift.nightshift_active) + if(nightshift_disabled) INVOKE_ASYNC(src, PROC_REF(set_nightshift), FALSE) if(cell_percent > APC_CHANNEL_ALARM_TRESHOLD) alarm_manager.clear_alarm(ALARM_POWER) diff --git a/code/modules/requests/request_manager.dm b/code/modules/requests/request_manager.dm index d2257515f8f..77051641e50 100644 --- a/code/modules/requests/request_manager.dm +++ b/code/modules/requests/request_manager.dm @@ -270,7 +270,7 @@ GLOBAL_DATUM_INIT(requests, /datum/request_manager, new) "message" = request.message, "additional_info" = request.additional_information, "timestamp" = request.timestamp, - "timestamp_str" = gameTimestamp(wtime = request.timestamp) + "timestamp_str" = round_timestamp(wtime = request.timestamp) )) data["fax_autoprinting"] = GLOB.fax_autoprinting return data diff --git a/code/modules/research/ordnance/_scipaper.dm b/code/modules/research/ordnance/_scipaper.dm index 0b5efc03e10..e5fa3c3c8f0 100644 --- a/code/modules/research/ordnance/_scipaper.dm +++ b/code/modules/research/ordnance/_scipaper.dm @@ -185,7 +185,7 @@ author = "Unknown" et_alia = FALSE if(!abstract) - abstract = "Published on [station_time_timestamp()]" + abstract = "Published on [server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()])" /datum/scientific_paper/explosive /** diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index b39758918ea..e22bb36b8e6 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -169,7 +169,7 @@ var/datum/data/tachyon_record/new_record = new /datum/data/tachyon_record() new_record.name = "Log Recording #[record_number]" - new_record.timestamp = station_time_timestamp() + new_record.timestamp = "[server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()])" new_record.coordinates = "[epicenter.x], [epicenter.y]" new_record.displacement = took new_record.factual_radius["epicenter_radius"] = devastation_range diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 4887b41849b..0631a7ed0aa 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -169,7 +169,7 @@ var/datum/data/compressor_record/new_record = new() new_record.name = "Log Recording #[record_number]" new_record.experiment_source = inserted_tank.name - new_record.timestamp = station_time_timestamp() + new_record.timestamp = "[server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()])" for(var/gas_path in leaked_gas_buffer.gases) new_record.gas_data[gas_path] = leaked_gas_buffer.gases[gas_path][MOLES] diff --git a/code/modules/reta/reta_system.dm b/code/modules/reta/reta_system.dm index ebcfe06d896..51591a20590 100644 --- a/code/modules/reta/reta_system.dm +++ b/code/modules/reta/reta_system.dm @@ -5,7 +5,7 @@ /// Helper function for RETA-specific logging /proc/log_reta(text) - WRITE_LOG(GLOB.reta_log, "[time_stamp()] RETA: [text]") + WRITE_LOG(GLOB.reta_log, "[server_timestamp()] RETA: [text]") log_game("RETA: [text]") /proc/initialize_reta_system() diff --git a/code/modules/wiremod/components/utility/timepiece.dm b/code/modules/wiremod/components/utility/timepiece.dm index fa675bfa1b9..e40e4d1f09c 100644 --- a/code/modules/wiremod/components/utility/timepiece.dm +++ b/code/modules/wiremod/components/utility/timepiece.dm @@ -46,19 +46,19 @@ switch(format.value) if(COMP_TIMEPIECE_TWENTYFOUR_HOUR) - time = station_time_timestamp() + time = round_timestamp() if(COMP_TIMEPIECE_TWELVE_HOUR) - time = time_to_twelve_hour(station_time()) + time = time_to_twelve_hour() text_output.set_output(time) switch(time_unit.value) if(COMP_TIMEPIECE_HOURS) - time = round(station_time() / (1 HOURS)) + time = round_timestamp(format = "hh") if(COMP_TIMEPIECE_MINUTES) - time = round(station_time() / (1 MINUTES)) + time = round_timestamp(format = "mm") if(COMP_TIMEPIECE_SECONDS) - time = round(station_time() / (1 SECONDS)) + time = round_timestamp(format = "ss") num_output.set_output(time) diff --git a/config/game_options.txt b/config/game_options.txt index 3a8319cca9a..5588c20557c 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -493,15 +493,6 @@ ROUNDSTART_TRAITS ## Enable night shifts #ENABLE_NIGHT_SHIFTS -## The shift start hour in 24-hour (0-23) notation -SHIFT_TIME_START_HOUR 7 - -## Sets shift time to server time at roundstart. Overrides SHIFT_TIME_START_HOUR -#SHIFT_TIME_REALTIME - -## Enable randomized shift start times. Overrides SHIFT_TIME_REALTIME and SHIFT_TIME_START_HOUR -#RANDOMIZE_SHIFT_TIME - ## A cap on how many monkeys may be created via monkey cubes MONKEYCAP 64 diff --git a/tgstation.dme b/tgstation.dme index df33513e07e..7b10ea3d1e3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -731,7 +731,6 @@ #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\moods.dm" #include "code\controllers\subsystem\mouse_entered.dm" -#include "code\controllers\subsystem\nightshift.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\ore_generation.dm" #include "code\controllers\subsystem\overlays.dm" @@ -4122,6 +4121,7 @@ #include "code\modules\client\preferences\statpanel.dm" #include "code\modules\client\preferences\status_bar.dm" #include "code\modules\client\preferences\tgui.dm" +#include "code\modules\client\preferences\time.dm" #include "code\modules\client\preferences\tooltips.dm" #include "code\modules\client\preferences\trans_prosthetic.dm" #include "code\modules\client\preferences\ui_style.dm" @@ -4384,6 +4384,7 @@ #include "code\modules\events\market_crash.dm" #include "code\modules\events\mass_hallucination.dm" #include "code\modules\events\mice_migration.dm" +#include "code\modules\events\nightshift.dm" #include "code\modules\events\portal_storm.dm" #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_leak.dm" diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx index 98a19e308b1..2885340059f 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/AuditScreen.tsx @@ -41,7 +41,7 @@ export const AuditScreen = () => { {purchase.vendor} - {purchase.stationtime || '00:00'} ST + {purchase.stationtime || '00:00'} PT ))} diff --git a/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx b/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx index 3e45671520f..622abff07aa 100644 --- a/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx +++ b/tgui/packages/tgui/interfaces/AccountingConsole/index.tsx @@ -150,7 +150,7 @@ export const AccountingConsole = () => { diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/accessibility.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/accessibility.tsx index 1beda34b292..1e943cf1b01 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/accessibility.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/accessibility.tsx @@ -48,3 +48,13 @@ export const stair_indicator: FeatureToggle = { `, component: CheckboxInput, }; + +export const twelve_hour: FeatureToggle = { + name: 'Twelve-Hour Clock', + category: 'ACCESSIBILITY', + description: ` + When toggled, will replace many instances of real-world time with AM/PM instead. + `, + component: CheckboxInput, +}; + diff --git a/tgui/packages/tgui/interfaces/Secrets.jsx b/tgui/packages/tgui/interfaces/Secrets.jsx index fc65fd05990..37033185738 100644 --- a/tgui/packages/tgui/interfaces/Secrets.jsx +++ b/tgui/packages/tgui/interfaces/Secrets.jsx @@ -231,13 +231,13 @@ const HelpfulTab = (props) => { /> -