Files
Bubberstation/code/_onclick/hud/new_player.dm
T
John WillardandShadow-Quill 8a5a490aea 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

🆑
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.
/🆑
2025-04-29 18:19:24 -06:00

787 lines
28 KiB
Plaintext

/* SKYRAT EDIT REMOVAL - Custom HTML Lobby Screen
#define SHUTTER_MOVEMENT_DURATION 0.4 SECONDS
#define SHUTTER_WAIT_DURATION 0.2 SECONDS
/// Maximum number of station trait buttons we will display, please think hard before creating scenarios where there are more than this
#define MAX_STATION_TRAIT_BUTTONS_VERTICAL 3
/datum/hud/new_player
///Whether the menu is currently on the client's screen or not
var/menu_hud_status = TRUE
var/list/shown_station_trait_buttons
/datum/hud/new_player/New(mob/owner)
. = ..()
if (!owner || !owner.client)
return
if (owner.client.interviewee)
return
var/list/buttons = subtypesof(/atom/movable/screen/lobby)
for (var/atom/movable/screen/lobby/lobbyscreen as anything in buttons)
if (!initial(lobbyscreen.always_available))
continue
lobbyscreen = new lobbyscreen(our_hud = src)
lobbyscreen.SlowInit()
static_inventory += lobbyscreen
if (!lobbyscreen.always_shown)
lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button))
lobbyscreen.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button))
if (!owner.client.is_localhost())
return
var/atom/movable/screen/lobby/button/start_now/start_button = new(our_hud = src)
start_button.SlowInit()
static_inventory += start_button
start_button.RegisterSignal(src, COMSIG_HUD_LOBBY_COLLAPSED, TYPE_PROC_REF(/atom/movable/screen/lobby, collapse_button))
start_button.RegisterSignal(src, COMSIG_HUD_LOBBY_EXPANDED, TYPE_PROC_REF(/atom/movable/screen/lobby, expand_button))
/// Load and then display the buttons for relevant station traits
/datum/hud/new_player/proc/show_station_trait_buttons()
if (!mymob?.client || mymob.client.interviewee || !length(GLOB.lobby_station_traits))
return
for (var/datum/station_trait/trait as anything in GLOB.lobby_station_traits)
if (QDELETED(trait) || !trait.can_display_lobby_button(mymob.client))
remove_station_trait_button(trait)
continue
if(LAZYACCESS(shown_station_trait_buttons, trait))
continue
var/atom/movable/screen/lobby/button/sign_up/sign_up_button = new(our_hud = src)
trait.setup_lobby_button(sign_up_button)
static_inventory |= sign_up_button
LAZYSET(shown_station_trait_buttons, trait, sign_up_button)
RegisterSignal(trait, COMSIG_QDELETING, PROC_REF(remove_station_trait_button))
place_station_trait_buttons()
/// Display the buttosn for relevant station traits.
/datum/hud/new_player/proc/place_station_trait_buttons()
if(hud_version != HUD_STYLE_STANDARD || !mymob?.client)
return
var/y_offset = 397
var/x_offset = 233
var/y_button_offset = 27
var/x_button_offset = -27
var/iteration = 0
for(var/trait in shown_station_trait_buttons)
var/atom/movable/screen/lobby/button/sign_up/sign_up_button = shown_station_trait_buttons[trait]
iteration++
sign_up_button.screen_loc = offset_to_screen_loc(x_offset, y_offset, mymob.client.view)
mymob.client.screen |= sign_up_button
if (iteration >= MAX_STATION_TRAIT_BUTTONS_VERTICAL)
iteration = 0
y_offset = 397
x_offset += x_button_offset
else
y_offset += y_button_offset
/// Remove a station trait button, then re-order the rest.
/datum/hud/new_player/proc/remove_station_trait_button(datum/station_trait/trait)
SIGNAL_HANDLER
var/atom/movable/screen/lobby/button/sign_up/button = LAZYACCESS(shown_station_trait_buttons, trait)
if(!button)
return
LAZYREMOVE(shown_station_trait_buttons, trait)
UnregisterSignal(trait, COMSIG_QDELETING)
static_inventory -= button
qdel(button)
place_station_trait_buttons()
/atom/movable/screen/lobby
plane = SPLASHSCREEN_PLANE
layer = LOBBY_MENU_LAYER
screen_loc = "TOP,CENTER"
/// Whether this HUD element can be hidden from the client's "screen" (moved off-screen) or not
var/always_shown = FALSE
/// If true we will create this button every time the HUD is generated
var/always_available = TRUE
///Set the HUD in New, as lobby screens are made before Atoms are Initialized.
/atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...)
set_new_hud(our_hud)
return ..()
///Run sleeping actions after initialize
/atom/movable/screen/lobby/proc/SlowInit()
return
///Animates moving the button off-screen
/atom/movable/screen/lobby/proc/collapse_button()
SIGNAL_HANDLER
//wait for the shutter to come down
animate(src, transform = transform, time = SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION)
//then pull the buttons up with the shutter
animate(transform = transform.Translate(x = 0, y = 146), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN)
///Animates moving the button back into place
/atom/movable/screen/lobby/proc/expand_button()
SIGNAL_HANDLER
//the buttons are off-screen, so we sync them up to come down with the shutter
animate(src, transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT)
/atom/movable/screen/lobby/background
icon = 'icons/hud/lobby/background.dmi'
icon_state = "background"
screen_loc = "TOP,CENTER:-61"
/atom/movable/screen/lobby/button
mouse_over_pointer = MOUSE_HAND_POINTER
///Is the button currently enabled?
VAR_PROTECTED/enabled = TRUE
///Is the button currently being hovered over with the mouse?
var/highlighted = FALSE
///Should this button play the select sound?
var/select_sound_play = TRUE
/atom/movable/screen/lobby/button/Click(location, control, params)
if(usr != get_mob())
return
if(!usr.client || usr.client.interviewee)
return
. = ..()
if(!enabled)
return
flick("[base_icon_state]_pressed", src)
if(select_sound_play)
var/sound/ui_select_sound = sound('sound/misc/menu/ui_select1.ogg')
ui_select_sound.frequency = get_rand_frequency_low_range()
SEND_SOUND(hud.mymob, ui_select_sound)
update_appearance(UPDATE_ICON)
return TRUE
/atom/movable/screen/lobby/button/MouseEntered(location,control,params)
if(usr != get_mob())
return
if(!usr.client || usr.client.interviewee)
return
. = ..()
highlighted = TRUE
update_appearance(UPDATE_ICON)
/atom/movable/screen/lobby/button/MouseExited()
if(usr != get_mob())
return
if(!usr.client || usr.client.interviewee)
return
. = ..()
highlighted = FALSE
update_appearance(UPDATE_ICON)
/atom/movable/screen/lobby/button/update_icon(updates)
. = ..()
if(!enabled)
icon_state = "[base_icon_state]_disabled"
return
else if(highlighted)
icon_state = "[base_icon_state]_highlighted"
return
icon_state = base_icon_state
///Updates the button's status: TRUE to enable interaction with the button, FALSE to disable
/atom/movable/screen/lobby/button/proc/set_button_status(status)
if(status == enabled)
return FALSE
enabled = status
update_appearance(UPDATE_ICON)
mouse_over_pointer = enabled ? MOUSE_HAND_POINTER : MOUSE_INACTIVE_POINTER
return TRUE
///Prefs menu
/atom/movable/screen/lobby/button/character_setup
name = "View Character Setup"
screen_loc = "TOP:-70,CENTER:-54"
icon = 'icons/hud/lobby/character_setup.dmi'
icon_state = "character_setup_disabled"
base_icon_state = "character_setup"
enabled = FALSE
/atom/movable/screen/lobby/button/character_setup/Initialize(mapload, datum/hud/hud_owner)
. = ..()
// We need IconForge and the assets to be ready before allowing the menu to open
if(SSearly_assets.initialized == INITIALIZATION_INNEW_REGULAR || SSatoms.initialized == INITIALIZATION_INNEW_REGULAR)
flick("[base_icon_state]_enabled", src)
set_button_status(TRUE)
else
set_button_status(FALSE)
RegisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(enable_character_setup))
RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(enable_character_setup))
/atom/movable/screen/lobby/button/character_setup/Click(location, control, params)
. = ..()
if(!.)
return
var/datum/preferences/preferences = hud.mymob.canon_client.prefs
preferences.current_window = PREFERENCE_TAB_CHARACTER_PREFERENCES
preferences.update_static_data(usr)
preferences.ui_interact(usr)
/atom/movable/screen/lobby/button/character_setup/proc/enable_character_setup()
SIGNAL_HANDLER
flick("[base_icon_state]_enabled", src)
set_button_status(TRUE)
UnregisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE)
UnregisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE)
///Button that appears before the game has started
/atom/movable/screen/lobby/button/ready
name = "Toggle Readiness"
screen_loc = "TOP:-8,CENTER:-65"
icon = 'icons/hud/lobby/ready.dmi'
icon_state = "not_ready"
base_icon_state = "not_ready"
///Whether we are readied up for the round or not
var/ready = FALSE
/atom/movable/screen/lobby/button/ready/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_ready_button))
if(GAME_STATE_SETTING_UP)
set_button_status(FALSE)
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(show_ready_button))
else
set_button_status(FALSE)
/atom/movable/screen/lobby/button/ready/proc/hide_ready_button()
SIGNAL_HANDLER
set_button_status(FALSE)
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(show_ready_button))
/atom/movable/screen/lobby/button/ready/proc/show_ready_button()
SIGNAL_HANDLER
set_button_status(TRUE)
UnregisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(hide_ready_button))
/atom/movable/screen/lobby/button/ready/Click(location, control, params)
. = ..()
if(!.)
return
var/mob/dead/new_player/new_player = hud.mymob
ready = !ready
if(ready)
new_player.auto_deadmin_on_ready_or_latejoin()
new_player.ready = PLAYER_READY_TO_PLAY
base_icon_state = "ready"
else
new_player.ready = PLAYER_NOT_READY
base_icon_state = "not_ready"
update_appearance(UPDATE_ICON)
SEND_SIGNAL(hud, COMSIG_HUD_PLAYER_READY_TOGGLE)
///Shown when the game has started
/atom/movable/screen/lobby/button/join
name = "Join Game"
screen_loc = "TOP:-13,CENTER:-58"
icon = 'icons/hud/lobby/join.dmi'
icon_state = "" //Default to not visible
base_icon_state = "join_game"
enabled = null // set in init
/atom/movable/screen/lobby/button/join/Initialize(mapload, datum/hud/hud_owner)
. = ..()
switch(SSticker.current_state)
if(GAME_STATE_PREGAME, GAME_STATE_STARTUP)
set_button_status(FALSE)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(show_join_button))
if(GAME_STATE_SETTING_UP)
set_button_status(TRUE)
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(hide_join_button))
else
set_button_status(TRUE)
/atom/movable/screen/lobby/button/join/Click(location, control, params)
. = ..()
if(!.)
return
if(!SSticker?.IsRoundInProgress())
to_chat(hud.mymob, span_boldwarning("The round is either not ready, or has already finished..."))
return
//Determines Relevent Population Cap
var/relevant_cap
var/hard_popcap = CONFIG_GET(number/hard_popcap)
var/extreme_popcap = CONFIG_GET(number/extreme_popcap)
if(hard_popcap && extreme_popcap)
relevant_cap = min(hard_popcap, extreme_popcap)
else
relevant_cap = max(hard_popcap, extreme_popcap)
var/mob/dead/new_player/new_player = hud.mymob
if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(new_player.key) in GLOB.admin_datums)))
to_chat(new_player, span_danger("[CONFIG_GET(string/hard_popcap_message)]"))
var/queue_position = SSticker.queued_players.Find(new_player)
if(queue_position == 1)
to_chat(new_player, span_notice("You are next in line to join the game. You will be notified when a slot opens up."))
else if(queue_position)
to_chat(new_player, span_notice("There are [queue_position-1] players in front of you in the queue to join the game."))
else
SSticker.queued_players += new_player
to_chat(new_player, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len]."))
return
new_player.auto_deadmin_on_ready_or_latejoin()
if(!LAZYACCESS(params2list(params), CTRL_CLICK))
GLOB.latejoin_menu.ui_interact(new_player)
else
to_chat(new_player, span_warning("Opening emergency fallback late join menu! If THIS doesn't show, ahelp immediately!"))
GLOB.latejoin_menu.fallback_ui(new_player)
/atom/movable/screen/lobby/button/join/proc/show_join_button()
SIGNAL_HANDLER
set_button_status(TRUE)
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(hide_join_button))
/atom/movable/screen/lobby/button/join/proc/hide_join_button()
SIGNAL_HANDLER
set_button_status(FALSE)
UnregisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(show_join_button))
/atom/movable/screen/lobby/button/observe
name = "Observe"
screen_loc = "TOP:-40,CENTER:-54"
icon = 'icons/hud/lobby/observe.dmi'
icon_state = "observe_disabled"
base_icon_state = "observe"
enabled = null // set in init
/atom/movable/screen/lobby/button/observe/Initialize(mapload, datum/hud/hud_owner)
. = ..()
if(SSticker.current_state > GAME_STATE_STARTUP)
set_button_status(TRUE)
else
set_button_status(FALSE)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, PROC_REF(enable_observing))
/atom/movable/screen/lobby/button/observe/Click(location, control, params)
. = ..()
if(!.)
return
var/mob/dead/new_player/new_player = hud.mymob
new_player.make_me_an_observer()
/atom/movable/screen/lobby/button/observe/proc/enable_observing()
SIGNAL_HANDLER
flick("[base_icon_state]_enabled", src)
set_button_status(TRUE)
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME)
//Subtype the bottom buttons away so the collapse/expand shutter goes behind them
/atom/movable/screen/lobby/button/bottom
layer = LOBBY_BOTTOM_BUTTON_LAYER
icon = 'icons/hud/lobby/bottom_buttons.dmi'
/atom/movable/screen/lobby/button/bottom/settings
name = "View Game Preferences"
icon_state = "settings_disabled"
base_icon_state = "settings"
screen_loc = "TOP:-122,CENTER:+29"
enabled = FALSE
/atom/movable/screen/lobby/button/bottom/settings/Initialize(mapload, datum/hud/hud_owner)
. = ..()
// We need IconForge and the assets to be ready before allowing the menu to open
if(SSearly_assets.initialized == INITIALIZATION_INNEW_REGULAR || SSatoms.initialized == INITIALIZATION_INNEW_REGULAR)
set_button_status(TRUE)
else
set_button_status(FALSE)
RegisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(enable_settings))
RegisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(enable_settings))
/atom/movable/screen/lobby/button/bottom/settings/Click(location, control, params)
. = ..()
if(!.)
return
var/datum/preferences/preferences = hud.mymob.canon_client.prefs
preferences.current_window = PREFERENCE_TAB_GAME_PREFERENCES
preferences.update_static_data(usr)
preferences.ui_interact(usr)
/atom/movable/screen/lobby/button/bottom/settings/proc/enable_settings()
SIGNAL_HANDLER
set_button_status(TRUE)
UnregisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE)
UnregisterSignal(SSatoms, COMSIG_SUBSYSTEM_POST_INITIALIZE)
/atom/movable/screen/lobby/button/bottom/changelog_button
name = "View Changelog"
icon_state = "changelog"
base_icon_state = "changelog"
screen_loc ="TOP:-122,CENTER:+57"
/atom/movable/screen/lobby/button/bottom/changelog_button/Click(location, control, params)
. = ..()
usr.client?.changelog()
/atom/movable/screen/lobby/button/bottom/crew_manifest
name = "View Crew Manifest"
icon_state = "crew_manifest"
base_icon_state = "crew_manifest"
screen_loc = "TOP:-122,CENTER:+2"
/atom/movable/screen/lobby/button/bottom/crew_manifest/Click(location, control, params)
. = ..()
if(!.)
return
var/mob/dead/new_player/new_player = hud.mymob
new_player.ViewManifest()
/atom/movable/screen/lobby/button/bottom/poll
name = "View Available Polls"
icon_state = "poll"
base_icon_state = "poll"
screen_loc = "TOP:-122,CENTER:-26"
///Whether the button should have a New Poll notification overlay
var/new_poll = FALSE
/atom/movable/screen/lobby/button/bottom/poll/SlowInit(mapload)
. = ..()
if(!usr)
return
var/mob/dead/new_player/new_player = usr
if(is_guest_key(new_player.key))
set_button_status(FALSE)
return
if(!SSdbcore.Connect())
set_button_status(FALSE)
return
var/isadmin = FALSE
if(new_player.client?.holder)
isadmin = TRUE
var/datum/db_query/query_get_new_polls = SSdbcore.NewQuery({"
SELECT id FROM [format_table_name("poll_question")]
WHERE (adminonly = 0 OR :isadmin = 1)
AND Now() BETWEEN starttime AND endtime
AND deleted = 0
AND id NOT IN (
SELECT pollid FROM [format_table_name("poll_vote")]
WHERE ckey = :ckey
AND deleted = 0
)
AND id NOT IN (
SELECT pollid FROM [format_table_name("poll_textreply")]
WHERE ckey = :ckey
AND deleted = 0
)
"}, list("isadmin" = isadmin, "ckey" = new_player.ckey))
if(!query_get_new_polls.Execute())
qdel(query_get_new_polls)
set_button_status(FALSE)
return
if(query_get_new_polls.NextRow())
new_poll = TRUE
else
new_poll = FALSE
update_appearance(UPDATE_OVERLAYS)
qdel(query_get_new_polls)
if(QDELETED(new_player))
set_button_status(FALSE)
return
/atom/movable/screen/lobby/button/bottom/poll/update_overlays()
. = ..()
if(new_poll)
. += mutable_appearance('icons/hud/lobby/poll_overlay.dmi', "new_poll")
/atom/movable/screen/lobby/button/bottom/poll/Click(location, control, params)
. = ..()
if(!.)
return
var/mob/dead/new_player/new_player = hud.mymob
new_player.handle_player_polling()
/// A generic "sign up" button used by station traits
/atom/movable/screen/lobby/button/sign_up
icon = 'icons/hud/lobby/signup_button.dmi'
icon_state = "signup"
base_icon_state = "signup"
always_available = FALSE
/atom/movable/screen/lobby/button/sign_up/MouseEntered(location, control, params)
. = ..()
if(QDELETED(src) || !desc)
return
openToolTip(usr, tip_src = src, params = params, title = name, content = desc,)
/atom/movable/screen/lobby/button/sign_up/MouseExited()
. = ..()
closeToolTip(usr)
/atom/movable/screen/lobby/button/collapse
name = "Collapse Lobby Menu"
icon = 'icons/hud/lobby/collapse_expand.dmi'
icon_state = "collapse"
base_icon_state = "collapse"
layer = LOBBY_BELOW_MENU_LAYER
screen_loc = "TOP:-82,CENTER:-54"
always_shown = TRUE
var/blip_enabled = TRUE
/atom/movable/screen/lobby/button/collapse/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(disable_blip))
RegisterSignal(hud, COMSIG_HUD_PLAYER_READY_TOGGLE, PROC_REF(on_player_ready_toggle))
if(GAME_STATE_SETTING_UP)
blip_enabled = FALSE
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(enable_blip))
else
blip_enabled = FALSE
add_overlay(get_blip_overlay())
update_icon(UPDATE_OVERLAYS)
/atom/movable/screen/lobby/button/collapse/update_overlays()
. = ..()
. += get_blip_overlay()
/atom/movable/screen/lobby/button/collapse/Click(location, control, params)
. = ..()
if(!.)
return
if(!istype(hud, /datum/hud/new_player))
return
var/datum/hud/new_player/our_hud = hud
base_icon_state = our_hud.menu_hud_status ? "expand" : "collapse"
name = "[our_hud.menu_hud_status ? "Expand" : "Collapse"] Lobby Menu"
set_button_status(FALSE)
//get the shutter object used by our hud
var/atom/movable/screen/lobby/shutter/menu_shutter = locate(/atom/movable/screen/lobby/shutter) in hud.static_inventory
//animate the shutter
menu_shutter.setup_shutter_animation()
//animate bottom buttons' movement
if(our_hud.menu_hud_status)
collapse_menu()
else
expand_menu()
our_hud.menu_hud_status = !our_hud.menu_hud_status
//re-enable clicking the button when the shutter animation finishes
//we use sleep here so it can work during game setup, as addtimer would not work until the game would finish setting up
sleep(2 * SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION)
set_button_status(TRUE)
///Proc to update the ready blip state upon new player's ready status change
/atom/movable/screen/lobby/button/collapse/proc/on_player_ready_toggle()
SIGNAL_HANDLER
update_appearance(UPDATE_ICON)
///Returns a ready blip overlay depending on the player's ready state
/atom/movable/screen/lobby/button/collapse/proc/get_blip_overlay()
var/blip_icon_state = "ready_blip"
if(blip_enabled && hud)
var/mob/dead/new_player/new_player = hud.mymob
blip_icon_state += "_[new_player.ready ? "" : "not_"]ready"
else
blip_icon_state += "_disabled"
var/mutable_appearance/ready_blip = mutable_appearance(icon, blip_icon_state)
return ready_blip
///Disables the ready blip; makes us listen for the setup error to re-enable the blip
/atom/movable/screen/lobby/button/collapse/proc/disable_blip()
SIGNAL_HANDLER
blip_enabled = FALSE
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, PROC_REF(enable_blip))
update_appearance(UPDATE_ICON)
///Enables the ready blip; makes us listen for the setup completion and game start to disable the blip
/atom/movable/screen/lobby/button/collapse/proc/enable_blip()
SIGNAL_HANDLER
blip_enabled = TRUE
UnregisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(disable_blip))
update_appearance(UPDATE_ICON)
///Moves the button to the top of the screen, leaving only the screen part in view
///Sends a signal on the hud for the menu hud elements to listen to
/atom/movable/screen/lobby/button/collapse/proc/collapse_menu()
SEND_SIGNAL(hud, COMSIG_HUD_LOBBY_COLLAPSED)
//wait for the shutter to come down
animate(src, transform = transform, time = SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION)
//then pull the button up with the shutter and leave it on the edge of the screen
animate(transform = transform.Translate(x = 0, y = 134), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN)
SEND_SOUND(hud.mymob, sound('sound/misc/menu/menu_rollup1.ogg'))
///Extends the button back to its usual spot
///Sends a signal on the hud for the menu hud elements to listen to
/atom/movable/screen/lobby/button/collapse/proc/expand_menu()
SEND_SIGNAL(hud, COMSIG_HUD_LOBBY_EXPANDED)
animate(src, transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT)
SEND_SOUND(hud.mymob, sound('sound/misc/menu/menu_rolldown1.ogg'))
/atom/movable/screen/lobby/shutter
icon = 'icons/hud/lobby/shutter.dmi'
icon_state = "shutter"
base_icon_state = "shutter"
screen_loc = "TOP:+143,CENTER:-73" //"home" position is off-screen
layer = LOBBY_SHUTTER_LAYER
always_shown = TRUE
///Sets up the shutter pulling down and up. It's the same animation for both collapsing and expanding the menu.
/atom/movable/screen/lobby/shutter/proc/setup_shutter_animation()
//bring down the shutter
animate(src, transform = transform.Translate(x = 0, y = -143), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_OUT)
//wait a little bit before bringing the shutter up
animate(transform = transform, time = SHUTTER_WAIT_DURATION)
//pull the shutter back off-screen
animate(transform = matrix(), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN)
/// LOCALHOST ONLY - Start Now button
/atom/movable/screen/lobby/button/start_now
name = "Start Now (LOCALHOST ONLY)"
screen_loc = "TOP:-146,CENTER:-54"
icon = 'icons/hud/lobby/start_now.dmi'
icon_state = "start_now"
base_icon_state = "start_now"
always_available = FALSE
select_sound_play = FALSE
/atom/movable/screen/lobby/button/start_now/Click(location, control, params)
. = ..()
if(!. || !usr.client.is_localhost() || !check_rights_for(usr.client, R_SERVER))
return
SEND_SOUND(hud.mymob, sound('sound/effects/splat.ogg', volume = 50))
SSticker.start_immediately = TRUE
if(SSticker.current_state == GAME_STATE_STARTUP)
to_chat(usr, span_admin("The server is still setting up, but the round will be started as soon as possible."))
#define OVERLAY_X_DIFF 12
#define OVERLAY_Y_DIFF 5
///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 = "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 = 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)
. = ..()
START_PROCESSING(SSnewplayer_info, src)
update_text()
update_appearance(UPDATE_ICON)
/atom/movable/screen/lobby/new_player_info/Destroy()
STOP_PROCESSING(SSnewplayer_info, src)
return ..()
/atom/movable/screen/lobby/new_player_info/update_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()
/atom/movable/screen/lobby/new_player_info/collapse_button()
show_static = FALSE
update_text()
//to be in sync with parent, we'll turn the TV off in this time instead.
animate(src, appearance = update_appearance(UPDATE_ICON), time = SHUTTER_MOVEMENT_DURATION + SHUTTER_WAIT_DURATION)
//we go to the right, not up
animate(transform = transform.Translate(x = 146, y = 0), time = SHUTTER_MOVEMENT_DURATION, easing = CUBIC_EASING|EASE_IN)
/atom/movable/screen/lobby/new_player_info/expand_button()
. = ..()
show_static = TRUE
update_appearance(UPDATE_ICON)
update_text()
/atom/movable/screen/lobby/new_player_info/proc/update_text()
if(!hud || !show_static)
maptext = null
return
if(!MC_RUNNING())
maptext = MAPTEXT("<span style='text-align: center; vertical-align: middle'>Loading...</span>")
return
if(SSticker.IsPostgame())
maptext = MAPTEXT("<span style='text-align: center; vertical-align: middle'>Game ended, <br /> \
restart soon</span>")
return
var/new_maptext
var/round_started = SSticker.HasRoundStarted()
if(round_started)
new_maptext = "<span style='text-align: center; vertical-align: middle'>[SSmapping.current_map.map_name]<br /> \
[LAZYLEN(GLOB.clients)] player\s online<br /> \
[ROUND_TIME()] in<br />"
var/datum/station_trait/overflow_job_bureaucracy/overflow = locate() in SSstation.station_traits
if(overflow)
new_maptext += "[overflow.chosen_job_name] overflow"
new_maptext += "</span>"
else
var/time_remaining = SSticker.GetTimeLeft()
if(time_remaining > 0)
time_remaining = "[round(time_remaining/10)]s"
else if(time_remaining == -10)
time_remaining = "DELAYED"
else
time_remaining = "SOON"
if(hud.mymob.client.holder)
new_maptext = "<span style='text-align: center; vertical-align: middle'>Starting in [time_remaining]<br /> \
[LAZYLEN(GLOB.clients)] player\s<br /> \
[SSticker.totalPlayersReady] players ready<br /> \
[SSticker.total_admins_ready] / [length(GLOB.admins)] admins ready</span>"
else
new_maptext = "<span style='text-align: center; vertical-align: middle; font-size: 18px'>[time_remaining]</span><br /> \
<span style='text-align: center; vertical-align: middle'>[LAZYLEN(GLOB.clients)] player\s</span>"
maptext = MAPTEXT(new_maptext)
#undef OVERLAY_X_DIFF
#undef OVERLAY_Y_DIFF
#undef SHUTTER_MOVEMENT_DURATION
#undef SHUTTER_WAIT_DURATION
#undef MAX_STATION_TRAIT_BUTTONS_VERTICAL
*/ // SKYRAT EDIT END