From 8a5a490aea7abbd8975f7564ebd440ee858d5cb4 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Sun, 20 Apr 2025 21:02:04 -0400 Subject: [PATCH] player hud stays post roundstart, has more info (#90632) ## About The Pull Request Once the round starts, the TV's text shows the current map, how much time it is in-game, how many players are connected, and what the overflow job is (if the station trait is on). video as demonstration but the overflow text has changed to "[job] overflow" instead of "Overflow job: [job]" https://github.com/user-attachments/assets/fe74b28b-06de-4827-9c4d-ca2e51f1e0b9 Closes https://github.com/tgstation/tgstation/issues/90651 ## Why It's Good For The Game Gives useful info on the TV instead of having it just magically disappear (which currently doesn't work cause I forgot to deactivate it on initialize for latejoiners) which will become more useful if the stat panel is removed. Also makes overflow job more obvious, the TV is just a good place to put info useful for new players though round time personally was just put there to make the TV feel more full. Wanted to put this in the original PR but wanted to try to match parity to the stat panel in case this wasn't wanted. ## Changelog :cl: qol: The TV on the title screen has round info once the round has started or ended. fix: The TV now fits on non-widescreen screens. /:cl: --- code/_onclick/hud/new_player.dm | 84 ++++++++----------- .../subsystem/processing/newplayer.dm | 2 +- code/controllers/subsystem/ticker.dm | 6 ++ 3 files changed, 42 insertions(+), 50 deletions(-) diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 438a71619ca..2e167093325 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -679,25 +679,20 @@ ///Lobby screen that appears before the game has started showing how many players there are and who is ready. /atom/movable/screen/lobby/new_player_info name = "New Player Info" - screen_loc = "TOP:-20,CENTER:192" + screen_loc = "EAST-3,CENTER:140" icon = 'icons/hud/lobby/newplayer.dmi' icon_state = null //we only show up when we get update appearance called, cause we need our overlay to not look bad. base_icon_state = "newplayer" - maptext_height = 70 + maptext_height = 75 maptext_width = 80 maptext_x = OVERLAY_X_DIFF maptext_y = OVERLAY_Y_DIFF + ///Boolean on whether or not we should have our static overlay, so we 'turn' the TV off when collapsing. var/show_static = TRUE /atom/movable/screen/lobby/new_player_info/Initialize(mapload, datum/hud/hud_owner) . = ..() - switch(SSticker.current_state) - if(GAME_STATE_PREGAME, GAME_STATE_STARTUP) - RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(hide_info)) - if(GAME_STATE_SETTING_UP) - RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(show_info)) - START_PROCESSING(SSnewplayer_info, src) update_text() update_appearance(UPDATE_ICON) @@ -706,26 +701,22 @@ STOP_PROCESSING(SSnewplayer_info, src) return ..() -/atom/movable/screen/lobby/new_player_info/update_overlays() - . = ..() - if(!always_available) - return . - . += mutable_appearance(icon, "[base_icon_state]_overlay", layer = src.layer+0.03) - if(show_static) - . += mutable_appearance(icon, "static_base", alpha = 20, layer = src.layer+0.01) - //we have this in a separate file because `generate_icon_alpha_mask` puts lighting even on non-existent pixels, - //giving the icon a weird background color. - var/mutable_appearance/scanline = mutable_appearance(generate_icon_alpha_mask('icons/hud/lobby/newplayer_scanline.dmi', "scanline"), alpha = 20, layer = src.layer+0.02) - scanline.pixel_y = OVERLAY_X_DIFF - scanline.pixel_x = OVERLAY_Y_DIFF - . += scanline - /atom/movable/screen/lobby/new_player_info/update_icon_state() . = ..() - if(!always_available) - icon_state = "[base_icon_state]_disabled" - else - icon_state = base_icon_state + icon_state = base_icon_state + +/atom/movable/screen/lobby/new_player_info/update_overlays() + . = ..() + . += mutable_appearance(icon, "[base_icon_state]_overlay", layer = src.layer+0.03) + if(!show_static) + return . + . += mutable_appearance(icon, "static_base", alpha = 20, layer = src.layer+0.01) + //we have this in a separate file because `generate_icon_alpha_mask` puts lighting even on non-existent pixels, + //giving the icon a weird background color. + var/mutable_appearance/scanline = mutable_appearance(generate_icon_alpha_mask('icons/hud/lobby/newplayer_scanline.dmi', "scanline"), alpha = 20, layer = src.layer+0.02) + scanline.pixel_y = OVERLAY_X_DIFF + scanline.pixel_x = OVERLAY_Y_DIFF + . += scanline /atom/movable/screen/lobby/new_player_info/process(seconds_per_tick) update_text() @@ -744,33 +735,28 @@ update_appearance(UPDATE_ICON) update_text() -/atom/movable/screen/lobby/new_player_info/proc/hide_info() - SIGNAL_HANDLER - - STOP_PROCESSING(SSnewplayer_info, src) - UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) - RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(show_info)) - always_available = FALSE - update_appearance(UPDATE_ICON) - update_text() - -/atom/movable/screen/lobby/new_player_info/proc/show_info() - SIGNAL_HANDLER - - always_available = TRUE - update_appearance(UPDATE_ICON) - update_text() - START_PROCESSING(SSnewplayer_info, src) - UnregisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP) - RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(hide_info)) - /atom/movable/screen/lobby/new_player_info/proc/update_text() - if(!always_available || !hud || !show_static) + if(!hud || !show_static) maptext = null return - var/new_maptext if(!MC_RUNNING()) - new_maptext = "Loading..." + maptext = MAPTEXT("Loading...") + return + if(SSticker.IsPostgame()) + maptext = MAPTEXT("Game ended,
\ + restart soon
") + return + + var/new_maptext + var/round_started = SSticker.HasRoundStarted() + if(round_started) + new_maptext = "[SSmapping.current_map.map_name]
\ + [LAZYLEN(GLOB.clients)] player\s online
\ + [ROUND_TIME()] in
" + var/datum/station_trait/overflow_job_bureaucracy/overflow = locate() in SSstation.station_traits + if(overflow) + new_maptext += "[overflow.chosen_job_name] overflow" + new_maptext += "
" else var/time_remaining = SSticker.GetTimeLeft() if(time_remaining > 0) diff --git a/code/controllers/subsystem/processing/newplayer.dm b/code/controllers/subsystem/processing/newplayer.dm index 796f7405ef8..e7537da5ead 100644 --- a/code/controllers/subsystem/processing/newplayer.dm +++ b/code/controllers/subsystem/processing/newplayer.dm @@ -2,4 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(newplayer_info) name = "New Player Info" flags = SS_NO_INIT | SS_BACKGROUND wait = 1 SECONDS - runlevels = RUNLEVEL_LOBBY|RUNLEVEL_SETUP + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 2af1a2d57c2..40c7769a31c 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -546,12 +546,18 @@ SUBSYSTEM_DEF(ticker) queued_players -= next_in_line queue_delay = 0 +///Whether the game has started, including roundend. /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING +///Whether the game is currently in progress, excluding roundend /datum/controller/subsystem/ticker/proc/IsRoundInProgress() return current_state == GAME_STATE_PLAYING +///Whether the game is currently in progress, excluding roundend +/datum/controller/subsystem/ticker/proc/IsPostgame() + return current_state == GAME_STATE_FINISHED + /datum/controller/subsystem/ticker/Recover() current_state = SSticker.current_state force_ending = SSticker.force_ending