diff --git a/code/__DEFINES/dcs/signals/signals_hud.dm b/code/__DEFINES/dcs/signals/signals_hud.dm
index b4d73459db6..bd7743ca863 100644
--- a/code/__DEFINES/dcs/signals/signals_hud.dm
+++ b/code/__DEFINES/dcs/signals/signals_hud.dm
@@ -2,4 +2,7 @@
#define COMSIG_HUD_EYE_CHANGED "hud_eye_changed"
/// Sent from /datum/hud/proc/eye_z_changed() : (old_offset, new_offset)
#define COMSIG_HUD_OFFSET_CHANGED "hud_offset_changed"
-
+/// Sent from /atom/movable/screen/lobby/button/collapse/proc/collapse_buttons() : ()
+#define COMSIG_HUD_LOBBY_COLLAPSED "hud_lobby_collapsed"
+/// Sent from /atom/movable/screen/lobby/button/collapse/proc/expand_buttons() : ()
+#define COMSIG_HUD_LOBBY_EXPANDED "hud_lobby_expanded"
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 7438c78f4d2..43e57233a4b 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -269,9 +269,14 @@
/// Layer for tutorial instructions
#define TUTORIAL_INSTRUCTIONS_LAYER 5
-
-#define LOBBY_BACKGROUND_LAYER 3
-#define LOBBY_BUTTON_LAYER 4
+///Layer for lobby menu collapse button
+#define LOBBY_BELOW_MENU_LAYER 2
+///Layer for lobby menu background image and main buttons (Join/Ready, Observe, Charater Prefs)
+#define LOBBY_MENU_LAYER 3
+///Layer for lobby menu shutter, which covers up the menu to collapse/expand it
+#define LOBBY_SHUTTER_LAYER 4
+///Layer for lobby menu buttons that are hanging away from and lower than the main panel
+#define LOBBY_BOTTOM_BUTTON_LAYER 5
///cinematics are "below" the splash screen
#define CINEMATIC_LAYER -1
diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm
index 6b0779f4be6..7a006043668 100644
--- a/code/_onclick/hud/new_player.dm
+++ b/code/_onclick/hud/new_player.dm
@@ -1,5 +1,11 @@
/* SKYRAT EDIT REMOVAL - Custom HTML Lobby Screen
+#define SHUTTER_MOVEMENT_DURATION 0.4 SECONDS
+#define SHUTTER_WAIT_DURATION 0.2 SECONDS
+
+>>>>>>> d12cab7a498 (Collapsible lobby buttons (#76443))
/datum/hud/new_player
+ ///Whether the menu is currently on the client's screen or not
+ var/menu_hud_status = TRUE
/datum/hud/new_player/New(mob/owner)
..()
@@ -7,30 +13,52 @@
if(!owner || !owner.client)
return
- if (owner.client.interviewee)
+ if(owner.client.interviewee)
return
var/list/buttons = subtypesof(/atom/movable/screen/lobby)
for(var/button_type in buttons)
- var/atom/movable/screen/lobby/lobbyscreen = new button_type()
+ var/atom/movable/screen/lobby/lobbyscreen = new button_type(our_hud = src)
lobbyscreen.SlowInit()
- lobbyscreen.hud = src
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(istype(lobbyscreen, /atom/movable/screen/lobby/button))
var/atom/movable/screen/lobby/button/lobby_button = lobbyscreen
lobby_button.owner = REF(owner)
/atom/movable/screen/lobby
plane = SPLASHSCREEN_PLANE
- layer = LOBBY_BUTTON_LAYER
+ 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
-/// Run sleeping actions after initialize
+/atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...)
+ if(our_hud)
+ 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
- layer = LOBBY_BACKGROUND_LAYER
icon = 'icons/hud/lobby/background.dmi'
icon_state = "background"
screen_loc = "TOP,CENTER:-61"
@@ -91,6 +119,7 @@
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
@@ -100,6 +129,7 @@
///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"
@@ -117,10 +147,12 @@
///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)
@@ -169,6 +201,7 @@
///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
@@ -244,6 +277,7 @@
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"
@@ -270,13 +304,18 @@
set_button_status(TRUE)
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME)
-/atom/movable/screen/lobby/button/settings
+//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"
base_icon_state = "settings"
- screen_loc = "TOP:-122,CENTER:+30"
+ screen_loc = "TOP:-122,CENTER:+29"
-/atom/movable/screen/lobby/button/settings/Click(location, control, params)
+/atom/movable/screen/lobby/button/bottom/settings/Click(location, control, params)
. = ..()
if(!.)
return
@@ -286,39 +325,38 @@
preferences.update_static_data(usr)
preferences.ui_interact(usr)
-/atom/movable/screen/lobby/button/changelog_button
- icon = 'icons/hud/lobby/bottom_buttons.dmi'
+/atom/movable/screen/lobby/button/bottom/changelog_button
+ name = "View Changelog"
icon_state = "changelog"
base_icon_state = "changelog"
- screen_loc ="TOP:-122,CENTER:+58"
+ 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/crew_manifest
- icon = 'icons/hud/lobby/bottom_buttons.dmi'
+/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/crew_manifest/Click(location, control, params)
+/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/changelog_button/Click(location, control, params)
- . = ..()
- usr.client?.changelog()
-
-/atom/movable/screen/lobby/button/poll
- icon = 'icons/hud/lobby/bottom_buttons.dmi'
+/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/poll/SlowInit(mapload)
+/atom/movable/screen/lobby/button/bottom/poll/SlowInit(mapload)
. = ..()
if(!usr)
return
@@ -362,15 +400,91 @@
set_button_status(FALSE)
return
-/atom/movable/screen/lobby/button/poll/update_overlays()
+/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/poll/Click(location, control, params)
+/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()
+
+/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
+
+/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)
+
+///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)
+
+///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)
+
+/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)
+
+#undef SHUTTER_MOVEMENT_DURATION
+#undef SHUTTER_WAIT_DURATION
+
*/ // SKYRAT EDIT END
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 16e22f8795f..cca53172848 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -1,3 +1,5 @@
+///Cooldown for the Reset Lobby Menu HUD verb
+#define RESET_HUD_INTERVAL 15 SECONDS
/mob/dead/new_player
flags_1 = NONE
invisibility = INVISIBILITY_ABSTRACT
@@ -15,7 +17,8 @@
var/ineligible_for_roles = FALSE
/// Used to track if the player's jobs menu sent a message saying it successfully mounted.
var/jobs_menu_mounted = FALSE
-
+ ///Cooldown for the Reset Lobby Menu HUD verb
+ COOLDOWN_DECLARE(reset_hud_cooldown)
/mob/dead/new_player/Initialize(mapload)
if(client && SSticker.state == GAME_STATE_STARTUP)
@@ -30,6 +33,7 @@
. = ..()
GLOB.new_player_list += src
+ add_verb(src, /mob/dead/new_player/proc/reset_menu_hud)
/mob/dead/new_player/Destroy()
GLOB.new_player_list -= src
@@ -60,6 +64,11 @@
var/datum/poll_question/poll = locate(href_list["votepollref"]) in GLOB.polls
vote_on_poll_handler(poll, href_list)
+/mob/dead/new_player/get_status_tab_items()
+ . = ..()
+ if(!SSticker.HasRoundStarted()) //only show this when the round hasn't started yet
+ . += "Readiness status: [ready ? "" : "Not "]Readied Up!"
+
//When you cop out of the round (NB: this HAS A SLEEP FOR PLAYER INPUT IN IT)
/mob/dead/new_player/proc/make_me_an_observer()
if(QDELETED(src) || !src.client)
@@ -381,3 +390,21 @@
// Add verb for re-opening the interview panel, fixing chat and re-init the verbs for the stat panel
add_verb(src, /mob/dead/new_player/proc/open_interview)
add_verb(client, /client/verb/fix_tgui_panel)
+
+///Resets the Lobby Menu HUD, recreating and reassigning it to the new player
+/mob/dead/new_player/proc/reset_menu_hud()
+ set name = "Reset Lobby Menu HUD"
+ set category = "OOC"
+ var/mob/dead/new_player/new_player = usr
+ if(!COOLDOWN_FINISHED(new_player, reset_hud_cooldown))
+ to_chat(new_player, span_warning("You must wait [DisplayTimeText(COOLDOWN_TIMELEFT(new_player, reset_hud_cooldown))] before resetting the Lobby Menu HUD again!"))
+ return
+ if(!new_player?.client)
+ return
+ COOLDOWN_START(new_player, reset_hud_cooldown, RESET_HUD_INTERVAL)
+ qdel(new_player.hud_used)
+ create_mob_hud()
+ to_chat(new_player, span_info("Lobby Menu HUD reset. You may reset the HUD again in [DisplayTimeText(RESET_HUD_INTERVAL)]."))
+ hud_used.show_hud(hud_used.hud_version)
+
+#undef RESET_HUD_INTERVAL
diff --git a/icons/hud/lobby/background.dmi b/icons/hud/lobby/background.dmi
index baae06fc1bd..554543ecf3f 100644
Binary files a/icons/hud/lobby/background.dmi and b/icons/hud/lobby/background.dmi differ
diff --git a/icons/hud/lobby/bottom_buttons.dmi b/icons/hud/lobby/bottom_buttons.dmi
index d0aa1228c7d..6cbebb6e68c 100644
Binary files a/icons/hud/lobby/bottom_buttons.dmi and b/icons/hud/lobby/bottom_buttons.dmi differ
diff --git a/icons/hud/lobby/collapse_expand.dmi b/icons/hud/lobby/collapse_expand.dmi
new file mode 100644
index 00000000000..03f9f02f3d3
Binary files /dev/null and b/icons/hud/lobby/collapse_expand.dmi differ
diff --git a/icons/hud/lobby/shutter.dmi b/icons/hud/lobby/shutter.dmi
new file mode 100644
index 00000000000..baecaca4217
Binary files /dev/null and b/icons/hud/lobby/shutter.dmi differ