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