From 27d7e6872210f254ccd464f8e581af11c5817bde Mon Sep 17 00:00:00 2001 From: AMonkeyThatCodes <20987591+AMonkeyThatCodes@users.noreply.github.com> Date: Wed, 25 Aug 2021 00:16:01 +0200 Subject: [PATCH 1/6] Replaced the lobby menu (with actual art) (#60953) --- code/__DEFINES/components.dm | 6 + code/__DEFINES/layers.dm | 3 + code/__DEFINES/mobs.dm | 1 - code/_onclick/hud/new_player.dm | 306 ++++++++++++++++++ code/controllers/subsystem/ticker.dm | 14 +- code/game/atoms.dm | 3 + .../machinery/porta_turret/portable_turret.dm | 4 +- code/game/objects/effects/glowshroom.dm | 2 +- code/game/objects/items/shields.dm | 2 +- code/modules/mob/dead/new_player/login.dm | 5 +- .../modules/mob/dead/new_player/new_player.dm | 162 ++-------- code/modules/spells/spell_types/aimed.dm | 2 +- config/private_default.txt | 2 +- icons/hud/lobby/background.dmi | Bin 0 -> 527 bytes icons/hud/lobby/bottom_buttons.dmi | Bin 0 -> 871 bytes icons/hud/lobby/character_setup.dmi | Bin 0 -> 1543 bytes icons/hud/lobby/join.dmi | Bin 0 -> 1311 bytes icons/hud/lobby/observe.dmi | Bin 0 -> 2094 bytes icons/hud/lobby/poll_overlay.dmi | Bin 0 -> 257 bytes icons/hud/lobby/ready.dmi | Bin 0 -> 4098 bytes yogstation.dme | 1 + yogstation/code/modules/xenoarch/loot/guns.dm | 3 +- 22 files changed, 357 insertions(+), 159 deletions(-) create mode 100644 code/_onclick/hud/new_player.dm create mode 100644 icons/hud/lobby/background.dmi create mode 100644 icons/hud/lobby/bottom_buttons.dmi create mode 100644 icons/hud/lobby/character_setup.dmi create mode 100644 icons/hud/lobby/join.dmi create mode 100644 icons/hud/lobby/observe.dmi create mode 100644 icons/hud/lobby/poll_overlay.dmi create mode 100644 icons/hud/lobby/ready.dmi diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 93ada4e1f53d..fcad78c21d7a 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -395,3 +395,9 @@ ///Subsystem signals ///From base of datum/controller/subsystem/Initialize: (start_timeofday) #define COMSIG_SUBSYSTEM_POST_INITIALIZE "subsystem_post_initialize" + +///Called when the ticker enters the pre-game phase +#define COMSIG_TICKER_ENTER_PREGAME "comsig_ticker_enter_pregame" + +///Called when the ticker sets up the game for start +#define COMSIG_TICKER_ENTER_SETTING_UP "comsig_ticker_enter_setting_up" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 4e09a65c4c91..30a7c66d8b73 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -143,3 +143,6 @@ #define SPLASHSCREEN_LAYER 23 #define SPLASHSCREEN_PLANE 23 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" + +#define LOBBY_BACKGROUND_LAYER 3 +#define LOBBY_BUTTON_LAYER 4 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index f395097ab12c..bc754d79f427 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -5,7 +5,6 @@ //Ready states at roundstart for mob/dead/new_player #define PLAYER_NOT_READY 0 #define PLAYER_READY_TO_PLAY 1 -#define PLAYER_READY_TO_OBSERVE 2 //Game mode list indexes #define CURRENT_LIVING_PLAYERS "living_players_list" diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm new file mode 100644 index 000000000000..6e8a36c751e3 --- /dev/null +++ b/code/_onclick/hud/new_player.dm @@ -0,0 +1,306 @@ +/datum/hud/new_player + +/datum/hud/new_player/New(mob/owner) + ..() + var/list/buttons = subtypesof(/atom/movable/screen/lobby) + for(var/button in buttons) + var/atom/movable/screen/lobbyscreen = new button() + lobbyscreen.hud = src + static_inventory += lobbyscreen + +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/atom/movable/screen + name = "" + plane = HUD_PLANE + animate_movement = SLIDE_STEPS + speech_span = SPAN_ROBOT + vis_flags = VIS_INHERIT_PLANE + appearance_flags = APPEARANCE_UI + /// A reference to the object in the slot. Grabs or items, generally. + var/obj/master = null + /// A reference to the owner HUD, if any. + var/datum/hud/hud = null + /** + * Map name assigned to this object. + * Automatically set by /client/proc/add_obj_to_map. + */ + var/assigned_map + /** + * Mark this object as garbage-collectible after you clean the map + * it was registered on. + * + * This could probably be changed to be a proc, for conditional removal. + * But for now, this works. + */ + var/del_on_map_removal = TRUE + +/atom/movable/screen/Destroy() + master = null + hud = null + return ..() + +/atom/movable/screen/lobby + plane = SPLASHSCREEN_PLANE + layer = LOBBY_BUTTON_LAYER + screen_loc = "TOP,CENTER" + +/atom/movable/screen/lobby/background + layer = LOBBY_BACKGROUND_LAYER + icon = 'icons/hud/lobby/background.dmi' + icon_state = "background" + screen_loc = "TOP,CENTER:-61" + +/atom/movable/screen/lobby/button + ///Is the button currently enabled? + var/enabled = TRUE + ///Is the button currently being hovered over with the mouse? + var/highlighted = FALSE + +/atom/movable/screen/lobby/button/Click(location, control, params) + . = ..() + if(!enabled) + return + flick("[base_icon_state]_pressed", src) + update_icon() + return TRUE + +/atom/movable/screen/lobby/button/MouseEntered(location,control,params) + . = ..() + highlighted = TRUE + update_icon() + +/atom/movable/screen/lobby/button/MouseExited() + . = ..() + highlighted = FALSE + update_icon() + +/atom/movable/screen/lobby/button/proc/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 + +/atom/movable/screen/lobby/button/proc/set_button_status(status) + if(status == enabled) + return FALSE + enabled = status + update_icon() + return TRUE + +///Prefs menu +/atom/movable/screen/lobby/button/character_setup + screen_loc = "TOP:-70,CENTER:-54" + icon = 'icons/hud/lobby/character_setup.dmi' + icon_state = "character_setup" + base_icon_state = "character_setup" + +/atom/movable/screen/lobby/button/character_setup/Click(location, control, params) + . = ..() + if(!.) + return + hud.mymob.client.prefs.ShowChoices(hud.mymob) + +///Button that appears before the game has started +/atom/movable/screen/lobby/button/ready + screen_loc = "TOP:-8,CENTER:-65" + icon = 'icons/hud/lobby/ready.dmi' + icon_state = "not_ready" + base_icon_state = "not_ready" + var/ready = FALSE + +/atom/movable/screen/lobby/button/ready/Initialize(mapload) + . = ..() + if(SSticker.current_state > GAME_STATE_PREGAME) + set_button_status(FALSE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/hide_ready_button) + +/atom/movable/screen/lobby/button/ready/proc/hide_ready_button() + set_button_status(FALSE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + +/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.ready = PLAYER_READY_TO_PLAY + base_icon_state = "ready" + else + new_player.ready = PLAYER_NOT_READY + base_icon_state = "not_ready" + update_icon() + +///Shown when the game has started +/atom/movable/screen/lobby/button/join + screen_loc = "TOP:-13,CENTER:-58" + icon = 'icons/hud/lobby/join.dmi' + icon_state = "" //Default to not visible + base_icon_state = "join_game" + enabled = FALSE + +/atom/movable/screen/lobby/button/join/Initialize(mapload) + . = ..() + if(SSticker.current_state > GAME_STATE_PREGAME) + set_button_status(TRUE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/show_join_button) + +/atom/movable/screen/lobby/button/join/Click(location, control, params) + . = ..() + if(!.) + return + if(!SSticker?.IsRoundInProgress()) + to_chat(hud.mymob, "The round is either not ready, or has already finished...") + return + + //Determines Relevent Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + 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, "[CONFIG_GET(string/hard_popcap_message)]") + + var/queue_position = SSticker.queued_players.Find(new_player) + if(queue_position == 1) + to_chat(new_player, "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, "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, "You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].") + return + new_player.LateChoices() + +/atom/movable/screen/lobby/button/join/proc/show_join_button(status) + set_button_status(TRUE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + +/atom/movable/screen/lobby/button/observe + screen_loc = "TOP:-40,CENTER:-54" + icon = 'icons/hud/lobby/observe.dmi' + icon_state = "observe_disabled" + base_icon_state = "observe" + enabled = FALSE + +/atom/movable/screen/lobby/button/observe/Initialize(mapload) + . = ..() + if(SSticker.current_state > GAME_STATE_STARTUP) + set_button_status(TRUE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/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() + flick("[base_icon_state]_enabled", src) + set_button_status(TRUE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/enable_observing) + + +/atom/movable/screen/lobby/button/changelog_button + icon = 'icons/hud/lobby/bottom_buttons.dmi' + icon_state = "changelog" + base_icon_state = "changelog" + screen_loc ="TOP:-122,CENTER:+58" + + +/atom/movable/screen/lobby/button/crew_manifest + icon = 'icons/hud/lobby/bottom_buttons.dmi' + icon_state = "crew_manifest" + base_icon_state = "crew_manifest" + screen_loc = "TOP:-122,CENTER:+30" + +/atom/movable/screen/lobby/button/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' + icon_state = "poll" + base_icon_state = "poll" + screen_loc = "TOP:-122,CENTER:+2" + + var/new_poll = FALSE + +///Need to use New due to init +/atom/movable/screen/lobby/button/poll/New(loc, ...) + . = ..() + if(!usr) // + return + var/mob/dead/new_player/new_player = usr + if(IsGuestKey(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/DBQuery/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 id NOT IN ( + SELECT pollid FROM [format_table_name("poll_vote")] + WHERE ckey = :ckey + ) + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_textreply")] + WHERE ckey = :ckey + ) + "}, list("isadmin" = isadmin, "ckey" = new_player.ckey)) + if(query_get_new_polls.Execute()) + if(query_get_new_polls.NextRow()) + new_poll = TRUE + else + new_poll = FALSE + update_overlays() + qdel(query_get_new_polls) + if(QDELETED(new_player)) + set_button_status(FALSE) + return + +/atom/movable/screen/lobby/button/poll/proc/update_overlays() + cut_overlays() + if(new_poll) + add_overlay(mutable_appearance('icons/hud/lobby/poll_overlay.dmi', "new_poll")) + +/atom/movable/screen/lobby/button/poll/Click(location, control, params) + . = ..() + if(!.) + return + var/mob/dead/new_player/new_player = hud.mymob + new_player.handle_player_polling() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index b534e44da916..238076c30354 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -157,8 +157,8 @@ SUBSYSTEM_DEF(ticker) to_chat(world, "Welcome to [station_name()]!") send2chat("New round starting on [SSmapping.config.map_name]!", CONFIG_GET(string/chat_announce_new_game)) current_state = GAME_STATE_PREGAME - //Everyone who wants to be an observer is now spawned - create_observers() + SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME) + fire() if(GAME_STATE_PREGAME) //lobby stats for statpanels @@ -184,6 +184,7 @@ SUBSYSTEM_DEF(ticker) tipped = TRUE if(timeLeft <= 0) + SEND_SIGNAL(src, COMSIG_TICKER_ENTER_SETTING_UP) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) if(start_immediately) @@ -361,8 +362,6 @@ SUBSYSTEM_DEF(ticker) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) GLOB.joined_player_list += player.ckey player.create_character(FALSE) - else - player.new_player_panel() CHECK_TICK /datum/controller/subsystem/ticker/proc/collect_minds() @@ -610,13 +609,6 @@ SUBSYSTEM_DEF(ticker) else timeLeft = newtime -//Everyone who wanted to be an observer gets made one now -/datum/controller/subsystem/ticker/proc/create_observers() - for(var/mob/dead/new_player/player in GLOB.player_list) - if(player.ready == PLAYER_READY_TO_OBSERVE && player.mind) - //Break chain since this has a sleep input in it - addtimer(CALLBACK(player, /mob/dead/new_player.proc/make_me_an_observer), 1) - /datum/controller/subsystem/ticker/proc/load_mode() var/mode = trim(file2text("data/mode.txt")) if(mode) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 138b2fb400fb..d53b8e7b1e93 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -82,6 +82,9 @@ var/list/targeted_by var/atom/orbit_target //Reference to atom being orbited + + /// Used for changing icon state for different base sprites + var/base_icon_state /** * Called when an atom is created in byond (built in engine proc) * diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 3b4d731c4d98..cd989a58dafb 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -18,7 +18,7 @@ req_access = list(ACCESS_SEC_DOORS) power_channel = EQUIP //drains power from the EQUIPMENT channel - var/base_icon_state = "standard" + base_icon_state = "standard" var/scan_range = 7 var/atom/base = null //for turrets inside other objects @@ -1080,4 +1080,4 @@ if(istype(P, /obj/item/projectile/beam/lasertag/bluetag)) on = FALSE spawn(100) - on = TRUE \ No newline at end of file + on = TRUE diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 28cc952767c2..cc57b6b1c19e 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -65,7 +65,7 @@ myseed.genes += G set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color) setDir(CalcDir()) - var/base_icon_state = initial(icon_state) + base_icon_state = initial(icon_state) if(!floor) switch(dir) //offset to make it be on the wall rather than on the floor if(NORTH) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index b95e8ba5c556..7878ee3d09e9 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -212,7 +212,7 @@ force = 3 throwforce = 3 throw_speed = 3 - var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted + base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted var/on_force = 10 var/on_throwforce = 8 var/on_throw_speed = 2 diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 887556500cba..af840fafc376 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -22,8 +22,11 @@ sight |= SEE_TURFS - new_player_panel() client.playtitlemusic() + + var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/lobby) + asset_datum.send(client) + if(SSticker.current_state < GAME_STATE_SETTING_UP) var/tl = SSticker.GetTimeLeft() var/postfix diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 3c0b565f60fc..b800ae6936fc 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -1,19 +1,19 @@ -#define LINKIFY_READY(string, value) "[string]" - /mob/dead/new_player - var/ready = 0 - var/spawning = 0//Referenced when you want to delete the new_player later on in the code. - flags_1 = NONE invisibility = INVISIBILITY_ABSTRACT density = FALSE stat = DEAD - - var/mob/living/new_character //for instant transfer once the round is set up - - //Used to make sure someone doesn't get spammed with messages if they're ineligible for roles + hud_type = /datum/hud/new_player + hud_possible = list() + + var/ready = FALSE + /// Referenced when you want to delete the new_player later on in the code. + var/spawning = FALSE + /// For instant transfer once the round is set up + var/mob/living/new_character + ///Used to make sure someone doesn't get spammed with messages if they're ineligible for roles. var/ineligible_for_roles = FALSE /mob/dead/new_player/Initialize() @@ -39,64 +39,6 @@ /mob/dead/new_player/prepare_huds() return -/mob/dead/new_player/proc/new_player_panel() - var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/lobby) - asset_datum.send(client) - var/output = "

Setup Character

" - - if(SSticker.current_state <= GAME_STATE_PREGAME) - switch(ready) - if(PLAYER_NOT_READY) - output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" - if(PLAYER_READY_TO_PLAY) - output += "

\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" - if(PLAYER_READY_TO_OBSERVE) - output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]

" - else - output += "

View the Crew Manifest

" - output += "

Join Game!

" - output += "

[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]

" - - if(!IsGuestKey(src.key)) - if (SSdbcore.Connect()) - var/isadmin = 0 - if(src.client && src.client.holder) - isadmin = 1 - var/datum/DBQuery/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 id NOT IN ( - SELECT pollid FROM [format_table_name("poll_vote")] - WHERE ckey = :ckey - ) - AND id NOT IN ( - SELECT pollid FROM [format_table_name("poll_textreply")] - WHERE ckey = :ckey - ) - "}, list("isadmin" = isadmin, "ckey" = ckey)) - var/rs = REF(src) - if(query_get_new_polls.Execute()) - var/newpoll = 0 - if(query_get_new_polls.NextRow()) - newpoll = 1 - - if(newpoll) - output += "

Show Player Polls (NEW!)

" - else - output += "

Show Player Polls

" - qdel(query_get_new_polls) - if(QDELETED(src)) - return - - output += "
" - - var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 250, 265) - popup.set_window_options("can_close=0") - popup.set_content(output) - popup.open(FALSE) - -// List of possible actions user has chosen on the New Players menus /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) return 0 @@ -104,67 +46,12 @@ if(!client) return 0 - //Determines Relevent Population Cap - var/relevant_cap - var/hpc = CONFIG_GET(number/hard_popcap) - var/epc = CONFIG_GET(number/extreme_popcap) - if(hpc && epc) - relevant_cap = min(hpc, epc) - else - relevant_cap = max(hpc, epc) - - if(href_list["show_preferences"]) - client.prefs.ShowChoices(src) - return 1 - - if(href_list["ready"]) - var/tready = text2num(href_list["ready"]) - //Avoid updating ready if we're after PREGAME (they should use latejoin instead) - //This is likely not an actual issue but I don't have time to prove that this - //no longer is required - if(SSticker.current_state <= GAME_STATE_PREGAME) - ready = tready - //if it's post initialisation and they're trying to observe we do the needful - if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) - ready = tready - make_me_an_observer() - return - - if(href_list["refresh"]) - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - - if(href_list["late_join"]) - if(!SSticker || !SSticker.IsRoundInProgress()) - to_chat(usr, "The round is either not ready, or has already finished...") - return - - if(href_list["late_join"] == "override") - LateChoices() - return - - if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) - //yogs start -- donors bypassing the queue - if(ckey(key) in get_donators()) - to_chat(usr, "Because you are a donator, you have bypassed the queue! Thank you for donating!") - LateChoices() - return - //yogs end - to_chat(usr, "[CONFIG_GET(string/hard_popcap_message)]") - - var/queue_position = SSticker.queued_players.Find(usr) - if(queue_position == 1) - to_chat(usr, "You are next in line to join the game. You will be notified when a slot opens up.") - else if(queue_position) - to_chat(usr, "There are [queue_position-1] players in front of you in the queue to join the game.") - else - SSticker.queued_players += usr - to_chat(usr, "You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].") + if(href_list["late_join"]) //This still exists for queue messages in chat + if(!SSticker?.IsRoundInProgress()) + to_chat(usr, "The round is either not ready, or has already finished...") return LateChoices() - - if(href_list["manifest"]) - ViewManifest() + return if(href_list["SelectedJob"]) @@ -176,6 +63,17 @@ to_chat(usr, "There is an administrative lock on entering the game!") return + //Determines Relevent Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + + if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) to_chat(usr, "Server is full.") @@ -192,21 +90,10 @@ AttemptLateSpawn(href_list["SelectedJob"]) return - else if(!href_list["late_join"]) - new_player_panel() - if(href_list["showpoll"]) handle_player_polling() return - if(href_list["pollid"]) - var/pollid = href_list["pollid"] - if(istext(pollid)) - pollid = text2num(pollid) - if(isnum(pollid) && ISINTEGER(pollid)) - src.poll_player(pollid) - return - if(href_list["votepollid"] && href_list["votetype"]) var/pollid = text2num(href_list["votepollid"]) var/votetype = href_list["votetype"] @@ -290,7 +177,6 @@ if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") ready = PLAYER_NOT_READY src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() return FALSE var/mob/dead/observer/observer = new() diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 7a6a45c58f7e..5a3855950a30 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -4,7 +4,7 @@ var/projectile_type = /obj/item/projectile/magic/teleport var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" - var/base_icon_state = "projectile" + base_icon_state = "projectile" var/active_icon_state = "projectile" var/list/projectile_var_overrides = list() var/projectile_amount = 1 //Projectiles per cast. diff --git a/config/private_default.txt b/config/private_default.txt index a1865be51b18..36ed37846ea6 100644 --- a/config/private_default.txt +++ b/config/private_default.txt @@ -70,7 +70,7 @@ ENABLE_LOCALHOST_RANK TICK_LIMIT_MC_INIT 500 ## Should SQL be enabled? Uncomment to enable -#SQL_ENABLED +SQL_ENABLED ## Prefix to be added to the name of every table, older databases will require this be set to erro_ ## Note, this does not change the table names in the database, you will have to do that yourself. diff --git a/icons/hud/lobby/background.dmi b/icons/hud/lobby/background.dmi new file mode 100644 index 0000000000000000000000000000000000000000..baae06fc1bd10d114eed3d0a20fe48a920347b1e GIT binary patch literal 527 zcmeAS@N?(olHy`uVBq!ia0vp^(}B2}g&9b8oAYl5Qd$8%A+84w90&}L+jnIDti|&m zJieo#pk-m>5*?qUpr~SIZZ)ORML|jR$^DN1|Nl$MYsUk1F_r}R1v5B2yO9Ru6jp^q zl(?i8Cl_TFlw{`TF)&oj2@WeLD*gT?xZva0CtBXRTIbH358e=JaMAd|Bc1a;nkN~G zczk(xS{MfzUpDq~uu)E4_h{0QNg)c+nwo}|)_XPfo9MfCb{ng1ULmohq1$+^hM~FW zp|G%muf>eB`51UvWco~PU0whkBIfDh7?RQW_NFyolYD6fn zOlLguf{({kR&k3+OYTmE${&uM@@~gG3iC5K9)3v6;J6;>($v=8dm+-(a`vf%iOFYf zsBwrL{IEgLDlGm$h2h$*qCOdS6Sf8E7i&5lcamb4Fi1Giz{vbfpXdG-5QB{eDuQ6V z(fqc$t$u$$+rPfNjh$0IpJu%(BcJzt+i%rvs-KjYb^0DVvu8{H)9@8;F74W+)BSDD z<}2q4KRQz+6}I_x2{3vXJYD@< J);T3K0RRSt+5Z3l literal 0 HcmV?d00001 diff --git a/icons/hud/lobby/bottom_buttons.dmi b/icons/hud/lobby/bottom_buttons.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1407dfd597bcb340def7559ae96b3186093994cd GIT binary patch literal 871 zcmV-t1DO1YP)fFDZ*Bkpc$}S*K?;K~6hzm_DS~cGX~k_fMJX=o6(rPe5{OaqL#4NGRIn|y z*tnYsGhrV5n4R-WQL^k>&^uUEona@I?hlj+wB&9@x64K2E9e3bm)OT7(l+?=3X76`@Z;;%D* zCw_gIiZkMNQKE%xxS0|yq+#9OP?J_oQpXvzPU>1~UG*6PLuGBv25Y&0W3AndhG95r zxN$?YVFQsf)T(_fH5!zunyY3oT(5|>yVzhf8X8%v(V(fRNylR_q)1H$vu{R&Rn{6C zkD;H-$uNAn8(X<0Ly1Q+WFW&}KWPXuu%TYvRog0+!AxV2x@+Ssk+qbXCCuQhgCa7C zbuhzkCRQ4PJVU$CHf@;ELMqlj+^usNF7LVROSCvl$8TMt#p5@dcsjlu`*wSLEz#{G zt=o$Z?X@n^;(W^XP@=^@;ZlDb+HVV&7A`GZdVGHWY}?0McgE-SU*r-tk3YG7{DSkH z>-QJVV-zmjv;#y*5T5UFYj})8kU3t3AoI=!Le23iJV3}Ogc|cI1Q{|4p~k!lL57S% zs4=fXkSSmkLXGhgf^3+}m{FmjnKLl2LIW}ip~k!lL55T8LCx_h0vR6s6x2>r1EDtd z`v%4G#BMDJ%4R_R|bCx&DPq*+qo@c%>a$f`0#h92QkjBe|eXW4+`B z;SO~{GN_kw?`96_U+h@})JPf(STE(qz(F#oHF9I%piX1Gl&vpZP@ExS@G=-G$Y63~ xD9GT~OBsU;>a<@kCHR9uzr0&#%nO%F^cNFnh9ud7ickOm002ovPDHLkV1g*RkTn1R literal 0 HcmV?d00001 diff --git a/icons/hud/lobby/character_setup.dmi b/icons/hud/lobby/character_setup.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ca81a5d75833d5ffd82a0f1a5634aa2d3ab5aa05 GIT binary patch literal 1543 zcmV+i2Kf1jP)HTI~(jT|uqd_kY7pNK9su3}s7DcF)Wy#|)VXpD~c(KYe&e24N4oM zj%Yv6=c{!%%H%sNXkK)F6AQgwpd&sXmtU@`z`WQLo!`Vl-$&3PJ8-`0OM{DAr;sc! z!d~Cr-``$eUR3+-RUV#0cHn%~XV04+kV3KC{;@lqQY^{%=4LO+EZtb*RR$4QIxf&| zEQK`7658_#N0%A6GN1--!&20a$#EaZjgESX;mUv-xCKk0oomj7-1A))vmxLekQ%rR z%Sbub6BE6+t?UMFH#$=p1X!+>0X1+7mSj^qBf#Q*ds_gQ9WXpE&v0Jcf!nN?w?5!0CuAohyTgEd80eSU?3k|Ftz>>IHkcc`QLCWE9Wf9KDhjw7wb8P;u6xj#$8_B5C zK~I=X`GTb?k4J=Gc~0m{nkbvE+!RFZ(pd9i9ML|>Zyb&?`3?)37oFe4La!I-h|lBk z%T*Pa7n`E_Y7jv)orBW0p=V@hXD|EFBkUHx^Gj^!I$i(Paj%45)$Iu=v_xi`^JK#c*Xn z4cvkypdAu>zRO}Z1iS-M1Gi!EwZnREJJ}7~Zgi$H2(ZY?plqof5-b7j(Eawd05CgX zcwW$N)TA9!>&4d&%j4;U$|o}~E{iH4blY9K4cZ}jAJwl<#YhEWa(TPL}cmDfOaTZhN2xxmZ4~eJ+XK? z54t#^*Y(Bn9qq6;mTzc>HOoM3Xe?}m#agl5Orfx*>b^O#rplTsE`CGrSFEYRS1Q(2 zSyN?AHKq;nUG1M_iB}m!VClF(SyN?Al{Hn?RL6v|rW&@+l|e+7{){!%u(77vj%6Sw zSy&_Uj5RW7tdaTqJZogEk+DX`8dpLLP)ZLp)+nKY3h3|LlH`Xho%TNW6he z(v41SW?_GBV3BuTz`(#j!*Q7a0004WQchCV=- z0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#atuvOxi~XYGt)ClfIK5Z zuHur!l2jm5DJwrSFFrjnH&uy?GbOXA7^IksGpz_H0%2pSjL!g?lLImniIIKyC|@GIyC1`ff~?_MA% zGJ0+TujoS+${2#Tx4eIHI`JyX$lXzeXz%(kS0)9=m{-o%`)^m)C&+G;d z+%WVQJyfBD(f8tg;}~s%_dX!tjQRn_XluUutKm|wK@4uX2+pX~RE zA(8GCQX~Oi0}==z#iSLKzc+~orT|Q%aw@3T*{Vo7ERgU5m2x=fw1S2-dBw{}Eu$39 zq>UJ>I%jlTrS-PuX1dGFCl%|%Eqe_?S z7;)tf{d0|_M4XhH3!yW+I_0mre8_Ib*ukC0zNR&Yz#>lU4pag0YQG=kp2vN|nDq zi4yfEMW42wDF2%w%Krw4@)zab1_nKbc#$gf)r&x{dgMh=`3Eg~5jV$9G6Az9WK0sS zA%RH;Uc^&aJYZIY8Iz<=)jsY;$coVa#S3Isgc*}N88z`DWJQeqIGS?IikLGw%Iwa) z2w4$7FJxAP&RnjI$Lyh zKXi86@BAOr*Ug002ovPDHLkV1l!QT@U~O literal 0 HcmV?d00001 diff --git a/icons/hud/lobby/observe.dmi b/icons/hud/lobby/observe.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e7e42b9c396295156858714faf583577f0970cdb GIT binary patch literal 2094 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 literal 0 HcmV?d00001 diff --git a/icons/hud/lobby/poll_overlay.dmi b/icons/hud/lobby/poll_overlay.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2fc97162601c500d74793b42e091ff4c0c500a54 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^5YK07RogN!d5dpXD$uX{A<$fOX3U`_q4 zHv1Ip)!jS0ja4_VkkCjuadc+blo_+R61BB={My;z%f>K|O*%jH_p2#Do0UCX9780g zCMPs7J2J8@vT*W{5ms06%Mf7ZYe-_4Skd BStI}e literal 0 HcmV?d00001 diff --git a/icons/hud/lobby/ready.dmi b/icons/hud/lobby/ready.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d2a45a883f42a84d4f082e18384c41d4feaf9fb8 GIT binary patch literal 4098 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 Sy-MJ}mI-ZYX;Ni`jsF)Q7q<-n literal 0 HcmV?d00001 diff --git a/yogstation.dme b/yogstation.dme index 041b02ebeeff..f96dea593648 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -231,6 +231,7 @@ #include "code\_onclick\hud\map_popups.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\new_player.dm" #include "code\_onclick\hud\pai.dm" #include "code\_onclick\hud\parallax.dm" #include "code\_onclick\hud\picture_in_picture.dm" diff --git a/yogstation/code/modules/xenoarch/loot/guns.dm b/yogstation/code/modules/xenoarch/loot/guns.dm index 23865696a6e2..5a3ee15e79e3 100644 --- a/yogstation/code/modules/xenoarch/loot/guns.dm +++ b/yogstation/code/modules/xenoarch/loot/guns.dm @@ -42,7 +42,6 @@ if(chargesound != oldsound) playsound(src, chargesound, 100) - sleep(1) playsound(src, chargesound, 75) return @@ -173,4 +172,4 @@ icon_state = "spur_low" damage = 20 range = 7 - ..() \ No newline at end of file + ..() From f2556ac2f33ade9201c08f7aa2b8b330edc3898b Mon Sep 17 00:00:00 2001 From: Gabriel Adamson Date: Thu, 2 Sep 2021 13:33:01 -0500 Subject: [PATCH 2/6] Didn't mean to commit this --- config/private_default.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/private_default.txt b/config/private_default.txt index 36ed37846ea6..a1865be51b18 100644 --- a/config/private_default.txt +++ b/config/private_default.txt @@ -70,7 +70,7 @@ ENABLE_LOCALHOST_RANK TICK_LIMIT_MC_INIT 500 ## Should SQL be enabled? Uncomment to enable -SQL_ENABLED +#SQL_ENABLED ## Prefix to be added to the name of every table, older databases will require this be set to erro_ ## Note, this does not change the table names in the database, you will have to do that yourself. From 264df8bc2316c95e7a1c95b1cd3ee9e1b417179a Mon Sep 17 00:00:00 2001 From: Gabriel Adamson Date: Thu, 2 Sep 2021 13:54:33 -0500 Subject: [PATCH 3/6] This doesn't need changed anymore --- yogstation/code/modules/xenoarch/loot/guns.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/yogstation/code/modules/xenoarch/loot/guns.dm b/yogstation/code/modules/xenoarch/loot/guns.dm index 5a3ee15e79e3..23865696a6e2 100644 --- a/yogstation/code/modules/xenoarch/loot/guns.dm +++ b/yogstation/code/modules/xenoarch/loot/guns.dm @@ -42,6 +42,7 @@ if(chargesound != oldsound) playsound(src, chargesound, 100) + sleep(1) playsound(src, chargesound, 75) return @@ -172,4 +173,4 @@ icon_state = "spur_low" damage = 20 range = 7 - ..() + ..() \ No newline at end of file From 07ac7cdc1c1077423f136b50c57a489976d8bc97 Mon Sep 17 00:00:00 2001 From: Gabriel Adamson Date: Thu, 2 Sep 2021 19:01:25 -0500 Subject: [PATCH 4/6] Dark mode --- icons/hud/lobby/background.dmi | Bin 527 -> 3629 bytes icons/hud/lobby/bottom_buttons.dmi | Bin 871 -> 4312 bytes icons/hud/lobby/character_setup.dmi | Bin 1543 -> 1471 bytes icons/hud/lobby/join.dmi | Bin 1311 -> 1180 bytes icons/hud/lobby/observe.dmi | Bin 2094 -> 2047 bytes icons/hud/lobby/ready.dmi | Bin 4098 -> 15081 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/hud/lobby/background.dmi b/icons/hud/lobby/background.dmi index baae06fc1bd10d114eed3d0a20fe48a920347b1e..2d002f0162cc2877f761085ebf9bb73b63d5cdcf 100644 GIT binary patch literal 3629 zcmbtWhcn#m7XAsbdhab-5YcPY#p*R!u?W#u2&+Yn9$g5V=qpI{UP81)%jzo#!79;% z;6}-cdiVS8-0%JYcji6sGjryg=gfJ|oO$2G`^GwyWNc&r08r}bYMS9O2XCPy#P}Qj zg;yF6q~5w#egHsD|CbQ}x%n&rKxXn70=a+R4dIXQb3=G@>p>vg-o6Oe$4^`UAZQ+C z4u_g=GpXQ~jx`JtB3~IG%os_y%`}oD8PWxWc}QvW6L^Z|7)^UpaD&F>e!+hR;_*-+Ih+;x@;w-hWfwsy;$Bjf1*LC^B`WO=Tk~Dm1ug zzsC&pqgU3&)S}4vy#X4MCTAYMOFjbNG+bHvE^jyJBR~)|MNR^A8|8INaKv9z?`Y&a zB#3-Y(Cwdo&wwP70Z>hT9jS^!J}U~o0)R{&;30SP@zS6!gK73jv$kT(J(6o77GztKP>5TYpk1m5SRJ9n4Txtu|Bhj5t#Miuzj%!yN<5k{j z0I=d8K5-=?-ozHEL>%dPReXD&$jy$t@F_0YwUJuwJy5tkZ+YbXmo{2OFWctkHrCf? z_4_q!9EL5!uHe0ox-BoC{0UdSz@2>mxXK?TWgDeKbo#w_^w_Y3V?2ZOx#PlSn$ATl z`Sk_o6mP$tV;fAEVa=4zCsi{y0iPQ&4=pA_G69^oWV0@`0%sH{AJUzNZbjkeO zLkSF~yawsAx{_u|P;Lud&O;U78w&9cwcFE`1_7z)i?~i5$yZU0rYc`4-b32T<=LKV z7n6T+_Ls~}V=B!1;@ixok|I~M^`**HyiO)5tesKM>PrLGGzgc;B3mUDCP%h1k~%99d4H|-VV zMV1>h3$)Yz>1T12l8lGxitx?QrO}JigeE}x<@xCnAyR^EFK_5Iyn{~CO=?einelCl zROHF%vhg8@=AAtnK?<)#xbF_euA|ob)}`0k*Le%jcEdfc`{CbC zyZD;RIO~h$_THrOiusF1$vb1uklHB6RVg#C2VP_szt8F1|zE(l{HM7d1 z5_NyqoZTE=p;R7U2`@)L!SBMYE)$8Z`V9L_An!~I8y>B7qPfYPSet@GcswYp;+{sy z_6szO%{>bc?#RC6>_}FrtSC}|Nb5^mHklp0as`9dvVBhT{f$Ytgvzpx!jqO54(_bp zVK0?2Y?E|(=uw%Ol?kiTtun3B+3k|6-7783okvlr59kX%6x4yIVQ!+f%;(G( z%gD-@j8qg)YQ-u&O4y4!Gy^|*mF;I2e6))!FhrCs1$S+oafFFqLN7hf%1(4BV8l%n z{KQxa42$w-Ss#Qlr}zN&mnp=yPYqJy@Y*43<#~GBg!0>I?HAhADUZ<)*Z9{w(VpnH z0>lD50tQAqM*F#DMs1~cN|g+i3^*w+^xvX(?~{ z;G);KZe41%-_q$7Ypq~a0<*BTZPKnm)!d%xsOc!9Eo(DI8dnv}!29ZdwG6dXw6fN3 z%o1a3TRdCB9N>=3@Yc_@ef!8RWLSIHi%S&{W&9jf6{j_4xL>m`gW?0lrCdz@J~-_2 zaptx-95zlfJ}bS}LO*h+|1ruuZ%PNw3~%#`IZ8-QG>9G%%Tg7~V@EFzcCG9CpZM6W zgiM~G@|yB`_sX$#`*Qn__v07djLN*ZQ(z_S_oZ(T^4)Y}0!;qqwS>oVb+`${Bntk1 zi%;B1Jl(S9TYYOuU?tAsfLZmos_&aM)iq`LC8;H=N2BuHt%I#2CVhy4N3qM02)=9Q z>yYaSpe*t>0h}-~N5H=$hz_o*Evv!JjW{ zcyL?Um~_lzs@VJCKW4sw95x-2`@$&%W8-5jBxi3Nz?vgVm)rsh%} zT+&3LPE=o3ShZ5jU3p%4ora-cdQS{E6vTvU<-DGJT)x;lieE*olCOm_ zXNwQodIuL_dXHnvm@35RL=-dC3=@p+z516rjc_?r%I!n?z}u;0!M&Wla9;5Vxru~X z$U|W+<3n9xqmYcB>7BB{{GX*uL^j%<3s$`BG^8|K%u_62$_?Q5lu}Xbl8nhnf9a!9 z$zz0Uf$zXKT?0m{U1A%rK6@p%igUdN4S6)ZtiEX_O4g!L`U7e$^i3Gl2zRk`{WO+1 ztdLn%aCdBPv}qXoQa=CS&GjB#FWpK;OG%u8r6?zCv#Z)&p;6f<7)!Rsc=K-D1LA7s z4@oV;p3^2(dzM+X;avhDMjlaiJ;TvG?+HA1$t}n>V#9V9zU|qXz{IVV-#eVeq1aU! z6O(Egu*_ME5wk)IK^yGxh~ZB;3$L0hs`}fU$6Y5~w>OtW3v8$|E3-DUsJtlW=9?*( zA2jcs{MN#XXN?JAJ7QWOZErs*f9P~68^Vk!fuZl9$IvsV-2UX^dxvkQUK9K5p`E{F zeokX;I&qh(Lm#mg1QtfquG22(dgo0zaBX7c_G#w1r)`a~r_bI1;UwWDh>xn}Tie%Z z&Pf%hS=!9qT^*`{TOY4b2Z5rLa+DS?^3kh&-kQPd+c?r?92ceHd_YQQ^$KX}RsbiQ zQ`}u6_b^vG&ph|s#?hwTWK?xxW@jnnLI-<`I$uWFDp>yrI`nvcJ9-KUKO9d%y+(zF zi~U)!#}>DQZaHC=-Kh}=?KJ)?lUmowTS}cun1_cS{0|$k8}ybREOYA=A9?Qh?C+a7wf?T2)|4|TOUHReUv4%giJmemcGT4KtBFQIvI1%I~BRfh`S2_?D7StdV#t5hDh zTNz?OO=mxzHvPciklMim$$ed?=g0o5Q8mV)JF3}>I&`$Ot@#2w0#fes`C?gIT?o^A!Zw)f|zq z`)2X=mO7PF)_S-f%*^*monKx$R>c_|>}XMZF2Rw7a=&l&{!dT*si4brgk5~lM= z;Q`{zEu|SZsOFqNfd?Aa1d9Lo3DbRE&@Ho$xSV2O?psPu4FZ2h65|v87x@p7=3oAQ zi2g3{U!wm%O{~;(38p`VKf|E0dC=6^pvlq;oq(yj{W;a|fERAE*o)2G zit~W*^UG@+q(#>aG4qRIYo(9~Wt8$}%!}d2{soqc#jS|SKKQt5Ic>A#IQHi)J0e&n-3%JfV%p3lvi@0U<+W|0TD=lr^_2`Jhv6 zJwfcmlUk;!vkFh6fV#GPeA^Q{Px{5d*K9SQgVruDf%;qwu9MG-wfm`Ue8XTsKmmGl zQ=8-Go_5vL$FJVjS1Vm!nwnf25A083@1U0`xqj}U zxAlCBwlk;^XVrJ>ecSV=$0Zso16{hj0=%5P?ZB5*?qUpr~SIZZ)ORML|jR$^DN1|Nl$MYsUk1F_r}R1v5B2yO9Ru6jp^q zl(?i8Cl_TFlw{`TF)&oj2@WeLD*gT?xZva0CtBXRTIbH358e=JaMAd|Bc1a;nkN~G zczk(xS{MfzUpDq~uu)E4_h{0QNg)c+nwo}|)_XPfo9MfCb{ng1ULmohq1$+^hM~FW zp|G%muf>eB`51UvWco~PU0whkBIfDh7?RQW_NFyolYD6fn zOlLguf{({kR&k3+OYTmE${&uM@@~gG3iC5K9)3v6;J6;>($v=8dm+-(a`vf%iOFYf zsBwrL{IEgLDlGm$h2h$*qCOdS6Sf8E7i&5lcamb4Fi1Giz{vbfpXdG-5QB{eDuQ6V z(fqc$t$u$$+rPfNjh$0IpJu%(BcJzt+i%rvs-KjYb^0DVvu8{H)9@8;F74W+)BSDD z<}2q4KRQz+6}I_x2{3vXJYD@< J);T3K0RRSt+5Z3l diff --git a/icons/hud/lobby/bottom_buttons.dmi b/icons/hud/lobby/bottom_buttons.dmi index 1407dfd597bcb340def7559ae96b3186093994cd..1d2133d861d98a5d48a0277e16946c3402b3292c 100644 GIT binary patch delta 4120 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 diff --git a/icons/hud/lobby/character_setup.dmi b/icons/hud/lobby/character_setup.dmi index ca81a5d75833d5ffd82a0f1a5634aa2d3ab5aa05..2059389d4403b494313844ff9849988dc15298af 100644 GIT binary patch delta 1220 zcmV;#1UvhO48IGIBoTE`OjJex|Nl`}UNJH;C@LwDH9P}4IysSdDiwNetfT+{00DGT zPE!Ct=GbNc005VfwvB(eloee4T)z ziwl_-g>ScBa3X*HzASI9D#yGSh{CtKk8tAcpm^wuoQqmPyj~C)bfZhS!^YVu0#U8lHdKrz!@^eiEm-TYBBJxSk zi_HZDglfa$o%#lDbRU(kPdYR6l2q3V;bO_k@-(@R=)i5BFLk$$Rt7{f%*<)R#ftyu zQr+`Wf|Y*((G2KxKrWq?K|n73g}&rwE4fTI*BEW?9{S>=lFL@x4qK-g(QBZK_rzsu z2f4WQ>6=UTCsUulS+>m{%Y}x2V4KT8qJzuVPlWnqx&=^S@6dij7`S)1%Zno4fdJU$ z`A!}n4N#A4>M8=U@CDT2wob~bIxf3nFQNcQzTbc6@&G*Q$@i#=Ky18>oU~0MtLnHA zh#0q!M`RCHR0pn2U@S7QO6s_Xs>2aM4u>ljk$iuv1h*@R!S8Z`KEQ7zt4;?sVFq%8 zOOYRsgnm&;TwhXG89byBs@g@N=0zu>eUjhUU8V6B7cwsj-)_C&MEpG-Z>}oGycmeW zx4VCjaN_Ntc<76qi&{Zyy~Fe6=jU<;^?trw&hn@v-VTa~K6768AP9Sh&KTr7$y0I( zrwjsc>9{}xdxzCM-;*erL6w1T;C9|&gWZ@s#i%my4cyK<^z8XI7ri0S9nd#$JMXaE z+fHT!HyfQ+1`aM#8RWseL;Kqs0ibt4_q>0Q-zbcCm>*9kBA@iU*jzwBsJ6X!gLsFz zLs#WhE|#n;dhrhZw~kf@L^I6H>EPa>wdbP*D+8h#(CL6&IxB;KT>1<44&A}t;p4cl zcgS&%2(@Cn1yEs6)qZngPnA7YDt=w>SL~_cS1R^Y*;8dtHDnC(UF|8kgi{6qxO9J9 zpzNu#r^=oxd#V#pu&3&d&dMMlm;Qo1Rd=wb+K9`bBGhbj3!uUtnXQD`BV&(@iW!$) zW{(U@WcJ9|BV&&&WDHV!KP8uN${+xjjti7MGWN*WBV&(j;tBT1+|gMX1mx0Rut(+& i_Q)Q`<@x{b@E-&4)fQOy*-!ug000O{MNUMnLSTX`#8YAb delta 1292 zcmV+n1@rp93x^DlBoTN}OjJd{z`#*gUcSV?nxmhQH9Q93?~!yW70Nl0Hvj+t z0d!JMQvg8b*k%9#0GW}qjem6vxs(-L{anDF1OPn7NBoomR44!d1ei%gK~#90?V5{r zqA(DKiHTI~(jT|uqd_kY7pNK9su3}s7DcF)Wy#|)VXpD~c(KYe&e24N4Hy=f;zUoVZi(03U zEHA=d-`?NfUSD2R`|VX8oqn;wutvE2T#JDpN2$@u1GFUc(3SmIR%5m-7d z&~7Y+G|Lj&^9e_n8Mrc_25!Sr)Q-tbX5 z8n_M1NIBON6TP>s>;`T(I#U@0Sgw@;HE;`-WK%mMz~X*;TL73HFg!2Ma9-Sj+pL%5 z=O`K348gKqu2!ggGV|iHr~*Q_)#9B{1Gl=5>enaZ*?GzR^@3QOva&vn?jt<#cb+dz zw~na{P|Yy4r+*QPV}H-$@A<%il>w?5!0CuAohyTgEd80eau1?VikmO3 zL~ZNHs3sPaBF3%ck-CFb{=kin8Ve1q9l(;fT9Al396`$AaAgtB$A@-c+jDIGt`yk^ z^&82k(?L&|P5FYQDvw8mUwKaGOPVN~uiO+w?b2BDVjR&v$!{EvGWiY*nirkl#6qtZ z=!nnb@qf!z6_^*BqVtlBhjR_y1?=jY|Ds`vBda+ZhZkR3Q* z_1W{L2c%Few}0$H?GUrvS0iJVPAu^%g9t1g7ic#YPdoJYe8SOX2CfXKf!nb7+F^^` z7(K;sWk3zwf+e6G5_`VOVm1W415yLGVez%YdVg;_*$v!obfz*0u*k}wY^fa*ECKD% z{r0v1Fgsv)UeIsUq#aW0#n%qYjkkm zWo7jj+F{%0OVh1mDg#tAOzr8G+F?r;f6oUFtPD`i08U3_>0B8^Wa-a zp?_$HJ+XK?54t#^*Y(Bn9qq6;mTzc>HOoM3Xe?}m#agl5Orfx*>b^O#rplTsE`CGr zSFEYRS1Q(2SyN?AHKq;nUG1M_iB}m!VClF(SyN?Al{Hn?RL6v|rW&@+l|e+7{){!% zu(77vj%6SwSy&_Uj5RW7tdaTqJZogEkxj8i#u{0##v0jw$P%wIh``cufwD%%8X0S3 ztdWfgV~s3qohyTgEd3d4WMN~C?0zi#e}~abu>1ir_#4jQO)TO70000CP=MQJh*cQ~e5yv~<6EGzq>q7;yYzVPK%a-hKxG)>QP~ z2M*~|3~h>{$MOEhQPhXQRfG>vD;feuaXjLu2!~0c0vL-Z!W5Zyqv)o{4g>*)nhpZZ zASRPDhlHXyO=Ev4Vw`e}Q3QMqh#`O!nFf4fVtxn)r^pT@0hAd!9@zKv)~YB;(`48X z;RHNoG8So^kIC{6WRQ8&wjzN9t|Yw_@llpxgl*=-OguH9n{_DS*XG%LGF1$Vg=By+ z9!k+-KF^YoM-fa8M^Ta}MOv!4U9AW-F{5ar8*37=XpVn}-J|KyqlkBTlHJv#S^7zj zW~#_$fH5Av9sz7c^11uw(RgAhS_0g86gRpIMR7dto=2dB-L8JKHXdJVtYxj4#7M5; zxO=UcpAxNTwOXw=+wEq(lCUEft7yI1tl96YzhOvJ`0z4=MASw^1lX1zah5DdMB5 z!U)^Uhn0A0Kv#Dt;@9e`E_20jI!Oi?bfcp9z`%Y97RQ;6ltmEcC{kg`9uG7 zV@)C!)$&Hnm4nau^DdXwT|KIgpY*6!MK%MB@$mJ?asKAHKQxcf-?;NAZ*&=o^1SSx zN3DO(->i+t*BWbCYbG(0YdG&-Yv!lKcK+wf^?Erg=WjBG9XV_9E!~Sx9@4cArgq5!#FVguMt0YA=E> zZWhvBAE8P5Y*$f_7cTwhPd=M`_ILH!^q)Wd=l>J~ z`D`!fKYxEr&i|fsz|NmQAP@)y0)apv{BZmOq)#d0ZpMQQ00000NkvXXu0mjf&U~Lh delta 1005 zcmVY=yN04bO^gR!(gEBE9eIX4#Cs!ULYtk zdTs)*=tC9C7=`!a`H#n_Nd=z~-ayA_2pC1tNPUDjjAI+XSVtkIn6wK<7n69P3t;HV zLEtLr#pJCa%_x5wk0V23GFF%%3HTZiK>#Tx4eIHI`JyX$lXzeXz%(kS0)98%&x;&lT z)T6iYl^(s>NxTA#@u=$&fHN}py>1;%ri{@$z+XpEq02BSiYC?T2$%$yyPx*P{d+Aa z*=v*-nmrsH7(IVfp@h-*;(g;7ZG!hcAmEJp0mf)+zWS@-Qoc6c@*ZswwpW|&x5OoP?b|;| z)^7R%A|%Sc3Zne0EBK7?2Kvf>mn1u*+jmKt+5pBn3Ngi`6_r1q!~i3g?tOrvrtsMmklsz^F4knjSPayaO;f`&AC#mh)7 zqZH1hjTos>mSKc#R>Mr+H7J)?FjD98EI%Z+!trP-z!(q9=$PkOx~pLXi^F4-rk0VT zN|);xape#FbB(1$oRpgjp)b*ukC0zNR&Yz#>lU4pag0YQG=kp2v zN|nDqi4yfEMW42wDF2%w%Krw4@)zab1_nKbc#$gf)r&x{dgMh=`3Eg~5jV$9G6Az9 zWK0sSA%RH;Uc^&aJYZIY8Iz<=)jsY;$clf^|HTVrR)iUoI~g_cB4kC3{WzL(%!-&Z zIm+zLy$D$mKQClfgw9;9#4fxDSrKDDGGb({$n_otEqf8K0yP;KSu0Ypj=+ip_(W>e zi+B}SUdXIS#a^Qyl6Jkw-Bv`r$nEI27ZK$z%D*v0XV;^zI@@Q|;DP%C-uXYIv%5`r z=Px>2bap>Uvzed=(o=PLJf2cqWneqw}F8`AP@)y0)apv b_+Ri3+KnmVIXZEk}=b86;=6(No-}yFbE4A{? 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 I-8VY-cZn>Y4FCWD diff --git a/icons/hud/lobby/ready.dmi b/icons/hud/lobby/ready.dmi index d2a45a883f42a84d4f082e18384c41d4feaf9fb8..ab473ee8dff1d1a688e43cbdb4eb1ecc495b33a0 100644 GIT binary patch literal 15081 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 Twh8`!0Ps>uQL;?jFyQ|IKmOuJ literal 4098 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 Sy-MJ}mI-ZYX;Ni`jsF)Q7q<-n From bc3b0e8cf69c112142086ccb35939f620622494a Mon Sep 17 00:00:00 2001 From: Gabriel Adamson Date: Sat, 4 Sep 2021 12:23:03 -0500 Subject: [PATCH 5/6] Added countdown timer to lobby screen --- code/_onclick/hud/new_player.dm | 133 ++++++++++++++++++ .../subsystem/processing/fastlobbyprocess.dm | 6 + icons/hud/lobby/countdown_background.dmi | Bin 0 -> 6502 bytes icons/hud/lobby/countdown_letters.dmi | Bin 0 -> 512 bytes yogstation.dme | 1 + 5 files changed, 140 insertions(+) create mode 100644 code/controllers/subsystem/processing/fastlobbyprocess.dm create mode 100644 icons/hud/lobby/countdown_background.dmi create mode 100644 icons/hud/lobby/countdown_letters.dmi diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 6e8a36c751e3..4c9e2eddbbea 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -7,6 +7,7 @@ var/atom/movable/screen/lobbyscreen = new button() lobbyscreen.hud = src static_inventory += lobbyscreen + lobbyscreen.postInit() /* Screen objects @@ -41,6 +42,8 @@ */ var/del_on_map_removal = TRUE +/atom/movable/screen/proc/postInit() + /atom/movable/screen/Destroy() master = null hud = null @@ -304,3 +307,133 @@ return var/mob/dead/new_player/new_player = hud.mymob new_player.handle_player_polling() + +/atom/movable/screen/lobby/timer + icon = 'icons/hud/lobby/countdown_background.dmi' + icon_state = "hidden" + screen_loc = "TOP,RIGHT" + + var/list/atom/movable/screen/lobby/display/displays = list() + + var/delayed = FALSE + var/active = FALSE + var/show_numbers = FALSE + + var/list/display_screen_locs = list( + "TOP:-7,RIGHT:-64", + "TOP:-7,RIGHT:-44", + "TOP:-7,RIGHT:-31" + ) + +GLOBAL_LIST_EMPTY(lobby_timers) + +/atom/movable/screen/lobby/timer/New(loc, ...) + . = ..() + for(var/screen_loc as anything in display_screen_locs) + var/atom/movable/screen/lobby/display/D = new() + D.screen_loc = screen_loc + displays += D + + if(SSticker.current_state > GAME_STATE_STARTUP) + set_active(TRUE) + else + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/activate) + +/atom/movable/screen/lobby/timer/proc/set_active(new_active) + if(new_active == active) + return + active = new_active + + if(active) + flick("show_[delayed ? "delayed" : "eta"]", src) + addtimer(VARSET_CALLBACK(src, show_numbers, 13)) + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/deactivate) + START_PROCESSING(SSlobbyprocess, src) + else + flick("hide_[delayed ? "delayed" : "eta"]", src) + show_numbers = FALSE + hide_numbers() + STOP_PROCESSING(SSlobbyprocess, src) + update_icon() + +/atom/movable/screen/lobby/timer/proc/activate() + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME) + set_active(TRUE) + +/atom/movable/screen/lobby/timer/proc/deactivate() + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP) + set_active(FALSE) + +/atom/movable/screen/lobby/timer/Destroy() + . = ..() + GLOB.lobby_timers -= src + +/atom/movable/screen/lobby/timer/process() + + var/time = SSticker.GetTimeLeft() + if(time == -10) + if(!delayed) + delay() + return + if(delayed) + undelay() + + if(!show_numbers) + return + + if(time < 0) + time = 0 + + var/seconds = round(time/10) + if(seconds > 639) + seconds = 639 + + var/minutes = round(seconds/60) + if(minutes > 9) + minutes = 9 + seconds -= minutes * 60 + + var/tens_seconds = round(seconds/10) + var/single_seconds = seconds % 10 + + displays[1].icon_state = "[minutes]-green" + displays[2].icon_state = "[tens_seconds]-green" + displays[3].icon_state = "[single_seconds]-green" + +/atom/movable/screen/lobby/timer/postInit() + . = ..() + for(var/atom/movable/screen/lobby/display/D as anything in displays) + D.hud = hud + hud.static_inventory += D + GLOB.lobby_timers += src + +/atom/movable/screen/lobby/timer/proc/hide_numbers() + for(var/atom/movable/screen/lobby/display/D as anything in displays) + D.icon_state = "" + +/atom/movable/screen/lobby/timer/proc/delay() + if(delayed) return + delayed = TRUE + hide_numbers() + flick("eta_delay", src) + show_numbers = FALSE + update_icon() + +/atom/movable/screen/lobby/timer/proc/undelay() + if(!delayed) return + delayed = FALSE + flick("delay_eta", src) + addtimer(VARSET_CALLBACK(src, show_numbers, 6)) + update_icon() + +/atom/movable/screen/lobby/timer/proc/update_icon() + if(!active) + icon_state = "hidden" + return + if(delayed) + icon_state = "delayed" + else + icon_state = "eta" + +/atom/movable/screen/lobby/display + icon = 'icons/hud/lobby/countdown_letters.dmi' \ No newline at end of file diff --git a/code/controllers/subsystem/processing/fastlobbyprocess.dm b/code/controllers/subsystem/processing/fastlobbyprocess.dm new file mode 100644 index 000000000000..9cf2d2950e9e --- /dev/null +++ b/code/controllers/subsystem/processing/fastlobbyprocess.dm @@ -0,0 +1,6 @@ +//Fires five times every second. + +PROCESSING_SUBSYSTEM_DEF(lobbyprocess) + name = "Lobby Processing" + stat_tag = "LP" + runlevels = RUNLEVEL_LOBBY diff --git a/icons/hud/lobby/countdown_background.dmi b/icons/hud/lobby/countdown_background.dmi new file mode 100644 index 0000000000000000000000000000000000000000..626bd249e792e74cf0c810609437598e126b4cd1 GIT binary patch literal 6502 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 DQaHcC literal 0 HcmV?d00001 diff --git a/icons/hud/lobby/countdown_letters.dmi b/icons/hud/lobby/countdown_letters.dmi new file mode 100644 index 0000000000000000000000000000000000000000..74f9f2f79ccea9f94d68b7bb34a39c1afe4557ee GIT binary patch literal 512 zcmV+b0{{JqP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#atw{QI5Sc+(=$qd980d^lEji!AWO+mH@zq|HBX6)GbOXA7^IMkGp#5wHxOo&uxN~Ah7BGs7_sm_8(b(Tb`Gayo3a$-(qQW21YOQo`ctDg%vrUBu8 ziYXXXIpP2S0Od(UK~yM_g^e9{D+gSdP ztQHEJ!+HBn(Y@g*)+=-z?&J6vxB`TdszBA&6c4>=dmGD}VC|1KLZFH?N=nJPkE1{e zQQ;5=o>OG$5)}X!s0cY#yG_tIqjXLM%^@_0!1g(W;eQ`2Oi6B0t*Po0Ds_bGgnE6x zZUdbK;W=D_7Cp%=ESy{TtA#Za{Z0L-wd_cc-1-2o9SR-mE~s$;0000 Date: Fri, 17 Sep 2021 13:51:30 +0100 Subject: [PATCH 6/6] I hate conflicts --- .../modules/mob/dead/new_player/new_player.dm | 62 ++----------------- 1 file changed, 5 insertions(+), 57 deletions(-) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 5bdbb3084979..5a132ae9eeea 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -46,63 +46,11 @@ if(!client) return 0 - //Determines Relevent Population Cap - var/relevant_cap - var/hpc = CONFIG_GET(number/hard_popcap) - var/epc = CONFIG_GET(number/extreme_popcap) - if(hpc && epc) - relevant_cap = min(hpc, epc) - else - relevant_cap = max(hpc, epc) - - if(href_list["show_preferences"]) - client.prefs.ShowChoices(src) - return 1 - - if(href_list["ready"]) - var/tready = text2num(href_list["ready"]) - //Avoid updating ready if we're after PREGAME (they should use latejoin instead) - //This is likely not an actual issue but I don't have time to prove that this - //no longer is required - if(SSticker.current_state <= GAME_STATE_PREGAME) - ready = tready - //if it's post initialisation and they're trying to observe we do the needful - if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) - ready = tready - make_me_an_observer() - return - - if(href_list["refresh"]) - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - - if(href_list["late_join"]) - if(!SSticker || !SSticker.IsRoundInProgress()) - to_chat(usr, span_danger("The round is either not ready, or has already finished...")) - return - - if(href_list["late_join"] == "override") - LateChoices() - return - - if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) - //yogs start -- donors bypassing the queue - if(ckey(key) in get_donators()) - to_chat(usr, span_notice("Because you are a donator, you have bypassed the queue! Thank you for donating!")) - LateChoices() - return - //yogs end - to_chat(usr, span_danger("[CONFIG_GET(string/hard_popcap_message)]")) - - var/queue_position = SSticker.queued_players.Find(usr) - if(queue_position == 1) - to_chat(usr, 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(usr, span_notice("There are [queue_position-1] players in front of you in the queue to join the game.")) - else - SSticker.queued_players += usr - to_chat(usr, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].")) - return + + if(href_list["late_join"]) //This still exists for queue messages in chat + if(!SSticker?.IsRoundInProgress()) + to_chat(usr, span_boldwarning("The round is either not ready, or has already finished...")) + return LateChoices() return