From 8bb1c2b32a1b327bc0145606618381c8deecade5 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Mon, 30 May 2022 01:31:54 -0300 Subject: [PATCH] Upload files --- _maps/map_files/generic/CentCom.dmm | 2 +- code/__DEFINES/dcs/signals.dm | 2 +- .../dcs/signals/signals_subsystem.dm | 25 ++ code/__DEFINES/layers_planes.dm | 3 + code/__DEFINES/mobs.dm | 1 - code/__HELPERS/clients.dm | 12 + code/_onclick/hud/new_player.dm | 336 ++++++++++++++++++ code/controllers/subsystem/ticker.dm | 15 +- code/controllers/subsystem/title.dm | 15 +- code/game/turfs/closed.dm | 28 +- code/modules/mob/dead/new_player/login.dm | 5 +- .../modules/mob/dead/new_player/new_player.dm | 146 ++------ icons/blanks/32x32.dmi | Bin 0 -> 216 bytes icons/blanks/96x96.dmi | Bin 0 -> 222 bytes icons/blanks/blank_title.png | Bin 0 -> 181 bytes icons/hud/lobby/background.dmi | Bin 0 -> 527 bytes icons/hud/lobby/bottom_buttons.dmi | Bin 0 -> 844 bytes icons/hud/lobby/character_setup.dmi | Bin 0 -> 1465 bytes icons/hud/lobby/join.dmi | Bin 0 -> 1180 bytes icons/hud/lobby/observe.dmi | Bin 0 -> 2075 bytes icons/hud/lobby/poll_overlay.dmi | Bin 0 -> 257 bytes icons/hud/lobby/ready.dmi | Bin 0 -> 4098 bytes tgstation.dme | 3 + 23 files changed, 445 insertions(+), 148 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_subsystem.dm create mode 100644 code/__HELPERS/clients.dm create mode 100644 code/_onclick/hud/new_player.dm create mode 100644 icons/blanks/32x32.dmi create mode 100644 icons/blanks/96x96.dmi create mode 100644 icons/blanks/blank_title.png 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/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index a147773cd1..cb32e435ca 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2280,7 +2280,7 @@ /turf/open/floor/plasteel, /area/tdome/arena_source) "fX" = ( -/turf/closed/indestructible/riveted, +/turf/closed/indestructible/start_area, /area/start) "fY" = ( /obj/effect/landmark/start/new_player, diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 1039a07982..b3dbc46806 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -539,7 +539,7 @@ #define COMSIG_MECHA_EQUIPMENT_CLICK "mecha_action_equipment_click" /// Prevents click from happening. #define COMPONENT_CANCEL_EQUIPMENT_CLICK (1<<0) - + // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) diff --git a/code/__DEFINES/dcs/signals/signals_subsystem.dm b/code/__DEFINES/dcs/signals/signals_subsystem.dm new file mode 100644 index 0000000000..c39b59262b --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_subsystem.dm @@ -0,0 +1,25 @@ +// Subsystem signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +///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" + +///Called when the ticker fails to set up the game for start +#define COMSIG_TICKER_ERROR_SETTING_UP "comsig_ticker_error_setting_up" + +/// Called when the round has started, but before GAME_STATE_PLAYING +#define COMSIG_TICKER_ROUND_STARTING "comsig_ticker_round_starting" + +// Point of interest signals +/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_added : (atom/new_poi) +#define COMSIG_ADDED_POINT_OF_INTEREST "added_point_of_interest" +/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed : (atom/old_poi) +#define COMSIG_REMOVED_POINT_OF_INTEREST "removed_point_of_interest" diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm index 2550084207..fd841ba258 100644 --- a/code/__DEFINES/layers_planes.dm +++ b/code/__DEFINES/layers_planes.dm @@ -187,6 +187,9 @@ #define ABOVE_HUD_LAYER 30 #define ABOVE_HUD_RENDER_TARGET "ABOVE_HUD_PLANE" +#define LOBBY_BACKGROUND_LAYER 3 +#define LOBBY_BUTTON_LAYER 4 + #define SPLASHSCREEN_LAYER 90 #define SPLASHSCREEN_PLANE 90 #define SPLASHSCREEN_RENDER_TARGET "SPLASHSCREEN_PLANE" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index c8c084fc18..36f427a1bb 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 // movement intent defines for the m_intent var #define MOVE_INTENT_WALK "walk" diff --git a/code/__HELPERS/clients.dm b/code/__HELPERS/clients.dm new file mode 100644 index 0000000000..3b61cf1e1c --- /dev/null +++ b/code/__HELPERS/clients.dm @@ -0,0 +1,12 @@ +///Returns whether or not a player is a guest using their ckey as an input +/proc/is_guest_key(key) + if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx + return FALSE + + var/i, ch, len = length(key) + + for(i = 7, i <= len, ++i) //we know the first 6 chars are Guest- + ch = text2ascii(key, i) + if (ch < 48 || ch > 57) //0-9 + return FALSE + return TRUE diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm new file mode 100644 index 0000000000..a56e6414a7 --- /dev/null +++ b/code/_onclick/hud/new_player.dm @@ -0,0 +1,336 @@ +/datum/hud/new_player + +/datum/hud/new_player/New(mob/dead/new_player/owner) + ..() + //This shouldn't happen like this but, age_verify sleeps, and they'll get the buttons when it's done. + if (!owner.age_verify()) + return + var/list/buttons = subtypesof(/atom/movable/screen/lobby) + for(var/button_type in buttons) + var/atom/movable/screen/lobby/lobbyscreen = new button_type() + lobbyscreen.SlowInit() + lobbyscreen.hud = src + static_inventory += lobbyscreen + 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 + screen_loc = "TOP,CENTER" + +/// Run sleeping actions after initialize +/atom/movable/screen/lobby/proc/SlowInit() + return + +/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 + /// The ref of the mob that owns this button. Only the owner can click on it. + var/owner + +/atom/movable/screen/lobby/button/Click(location, control, params) + if(owner != REF(usr)) + return + + . = ..() + + if(!enabled) + return + flick("[base_icon_state]_pressed", src) + update_appearance(UPDATE_ICON) + return TRUE + +/atom/movable/screen/lobby/button/MouseEntered(location,control,params) + if(owner != REF(usr)) + return + + . = ..() + highlighted = TRUE + update_appearance(UPDATE_ICON) + +/atom/movable/screen/lobby/button/MouseExited() + if(owner != REF(usr)) + 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 + +/atom/movable/screen/lobby/button/proc/set_button_status(status) + if(status == enabled) + return FALSE + enabled = status + update_appearance(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.current_tab = SETTINGS_TAB + 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) + . = ..() + switch(SSticker.current_state) + if(GAME_STATE_PREGAME, GAME_STATE_STARTUP) + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/hide_ready_button) + if(GAME_STATE_SETTING_UP) + set_button_status(FALSE) + RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, .proc/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/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/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.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) + +///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) + . = ..() + switch(SSticker.current_state) + if(GAME_STATE_PREGAME, GAME_STATE_STARTUP) + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, .proc/show_join_button) + if(GAME_STATE_SETTING_UP) + set_button_status(TRUE) + RegisterSignal(SSticker, COMSIG_TICKER_ERROR_SETTING_UP, .proc/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/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, 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.LateChoices() + +/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/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/show_join_button) + +/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() + SIGNAL_HANDLER + flick("[base_icon_state]_enabled", src) + set_button_status(TRUE) + UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/enable_observing) + +/atom/movable/screen/lobby/button/settings + icon = 'icons/hud/lobby/bottom_buttons.dmi' + icon_state = "settings" + base_icon_state = "settings" + screen_loc = "TOP:-122,CENTER:+30" + +/atom/movable/screen/lobby/button/settings/Click(location, control, params) + . = ..() + if(!.) + return + + hud.mymob.client.prefs.current_tab = GAME_PREFERENCES_TAB + hud.mymob.client.prefs.ShowChoices(hud.mymob) + +/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:+2" + +/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:-26" + + var/new_poll = FALSE + +/atom/movable/screen/lobby/button/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/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) + . = ..() + 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 05bef50714..8585098054 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -164,8 +164,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 @@ -203,6 +203,7 @@ SUBSYSTEM_DEF(ticker) for(var/client/C in SSvote.voting) C << browse(null, "window=vote;can_close=0") SSvote.reset() + SEND_SIGNAL(src, COMSIG_TICKER_ENTER_SETTING_UP) current_state = GAME_STATE_SETTING_UP Master.SetRunLevel(RUNLEVEL_SETUP) if(start_immediately) @@ -215,6 +216,7 @@ SUBSYSTEM_DEF(ticker) start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) timeLeft = null Master.SetRunLevel(RUNLEVEL_LOBBY) + SEND_SIGNAL(src, COMSIG_TICKER_ERROR_SETTING_UP) if(GAME_STATE_PLAYING) mode.process(wait * 0.1) @@ -378,8 +380,6 @@ SUBSYSTEM_DEF(ticker) LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name) else stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.") - else - player.new_player_panel() CHECK_TICK /datum/controller/subsystem/ticker/proc/collect_minds() @@ -633,13 +633,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/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 3cc3d9dd99..476f0d362e 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(title) /datum/controller/subsystem/title/Initialize() if(file_path && icon) - return ..() + return if(fexists("data/previous_title.dat")) var/previous_path = file2text("data/previous_title.dat") @@ -31,13 +31,16 @@ SUBSYSTEM_DEF(title) if(length(title_screens)) file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]" - if(!file_path || !fexists(file_path)) + if(!file_path) file_path = "icons/default_title.dmi" - if(fexists(file_path)) - icon = new(fcopy_rsc(file_path)) - if(splash_turf) - splash_turf.icon = icon + ASSERT(fexists(file_path)) + + icon = new(fcopy_rsc(file_path)) + + if(splash_turf) + splash_turf.icon = icon + splash_turf.handle_generic_titlescreen_sizes() return ..() diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index e57b0c9806..94f190aa24 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -73,16 +73,30 @@ /turf/closed/indestructible/splashscreen name = "Space Station 13" - icon = 'icons/blank_title.png' + desc = null + icon = 'icons/blanks/blank_title.png' icon_state = "" - layer = FLY_LAYER + pixel_x = -64 + plane = SPLASHSCREEN_PLANE bullet_bounce_sound = null -/turf/closed/indestructible/splashscreen/New() +INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) + +/turf/closed/indestructible/splashscreen/Initialize(mapload) + . = ..() SStitle.splash_turf = src if(SStitle.icon) icon = SStitle.icon - ..() + handle_generic_titlescreen_sizes() + +///helper proc that will center the screen if the icon is changed to a generic width, to make admins have to fudge around with pixel_x less. returns null +/turf/closed/indestructible/splashscreen/proc/handle_generic_titlescreen_sizes() + var/icon/size_check = icon(SStitle.icon, icon_state) + var/width = size_check.Width() + if(width == 480) // 480x480 is nonwidescreen + pixel_x = 0 + else if(width == 608) // 608x480 is widescreen + pixel_x = -64 /turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value) . = ..() @@ -90,7 +104,13 @@ switch(var_name) if(NAMEOF(src, icon)) SStitle.icon = icon + handle_generic_titlescreen_sizes() +/turf/closed/indestructible/start_area + name = null + desc = null + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' icon_state = "riveted" diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 887556500c..af840fafc3 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 ba082f4870..d3d0af1d91 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -1,5 +1,3 @@ -#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. @@ -10,6 +8,8 @@ density = FALSE stat = DEAD + hud_type = /datum/hud/new_player + hud_possible = list() var/mob/living/new_character //for instant transfer once the round is set up @@ -43,69 +43,6 @@ /mob/dead/new_player/prepare_huds() return -/mob/dead/new_player/proc/new_player_panel() - var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" - 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)) - output += playerpolls() - - output += "
" - - //src << browse(output,"window=playersetup;size=210x240;can_close=0") - 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) - -/mob/dead/new_player/proc/playerpolls() - var/output = "" //hey tg why is this a list? - if (SSdbcore.Connect()) - var/isadmin = FALSE - if(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" = ckey)) - var/rs = REF(src) - if(!query_get_new_polls.Execute()) - qdel(query_get_new_polls) - return - if(query_get_new_polls.NextRow()) - output += "

Show Player Polls (NEW!)

" - else - output += "

Show Player Polls

" - qdel(query_get_new_polls) - if(QDELETED(src)) - return - return output - /mob/dead/new_player/proc/age_gate() var/list/dat = list("
") dat += "Enter your date of birth here, to confirm that you are over 18.
" @@ -269,61 +206,12 @@ if(!age_verify()) 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(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))) - 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].") - return LateChoices() - - if(href_list["manifest"]) - ViewManifest() + return if(href_list["SelectedJob"]) if(!SSticker || !SSticker.IsRoundInProgress()) @@ -337,6 +225,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.") @@ -349,6 +248,15 @@ if(!GLOB.enter_allowed) to_chat(usr, " There is an administrative lock on entering the game!") + //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.") @@ -360,13 +268,6 @@ SSticker.queue_delay = 4 qdel(src) - 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)) @@ -460,7 +361,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/icons/blanks/32x32.dmi b/icons/blanks/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6c4f2b33e0fee9d3f99ff3febc0760cfd078aed2 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5Tn`*LkmkKF1;}MA3GxeO zaCmkj4amu^3W+FjNi9w;$}A|!%+F(BsF)KRR!~&>{Y!Ac$FEPcymhtCojD)8A=Kca z@q&JF>8>?&JF>8>?r978O6lM^IZ7bl4HG(F^GV0pm6sL^WE Q0hDF%boFyt=akR{025G63;+NC literal 0 HcmV?d00001 diff --git a/icons/blanks/blank_title.png b/icons/blanks/blank_title.png new file mode 100644 index 0000000000000000000000000000000000000000..387a21f03a013222955c883c585ed77afad0bd69 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0y~yU`k+MV0^&H3>2~W>wFDJF%}28J29*~C-V}>VM%xN zb!1@J*w6hZkrl{i4)6(a1=7o_Y;OT6&H|6fVg?4j!ywFfJby(BP|(`b#WAGf*4u-I oj6mL@1z-JhIpP(7OhVv62=jyl2F404&0vsHPgg&ebxsLQ0RK=WZ2$lO literal 0 HcmV?d00001 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..d0aa1228c7db38b89bcc173373c4b38c5d81126f GIT binary patch literal 844 zcmV-S1GD^zP)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+?!>s0aZ#gH)AO)3S~ZrnpU|V$eNpEXj4A5Q7}FjrBonQ39UGkE_?2^R%LbUZ zCc0t+QHXciKbB_0K%K95nAog{hHY-JCNXS$y~Bi|z9W;b!ICC@GWeT&1L@<0)6Q9! zui^MEPX>SU(J(XvSt>k|B^xUE+zJC$Kts2>YlpT}!BVlphMc3)TaqgDn#dOR!TOCh z<7>sEF(yR@ztOI2n9-`ytbce~=PF#@^SG_iYBzp<>l&>dzd6*?{$+n0H~ZHb?H_6F zFWUKQU8B|cSnZ)ktA$Jb!li{vLH`pjJ->hY@$q)}#^?24oz$kxP!#Hi^EP^Qz9 z77;u>=>WD{f#pv!!JewWksLLj<`Y6Wqa|O=W(z1kZw0QKG@~qEg((=dNMo&w2}Jw3 zDCP_ID8naO(7I@TNQ-~Jz(D+doSofOj&-pV%@1kuKSwa|c3{5hOP!lqQ@mPU1YY0X z-``$eUR3+-RUWOt+kyG2&z?6ufa23~{nzez?9-AAuMT@j*3wT)yviVgmYy5bKDpn~ zQc74YuAJ`)beZ9)49LV?w3JO?IP`@a4Afi9QyGwnJ7_6&aN>--IiG4V3BjEK>BL>M z3{-GBG19qhZWFjobfz+JXrYw>ow$RRWZ47*poQMOEdWdgbg#=ZTo*cVm;I9b9wYBj+tWx3!Pm94b3O=QWq@i1a5|!vc$GnaEtiA2mo43{S)%d5j&JZZG7jO}1s zR|CHICA6$4(8bBmrL~lQO8xV(ga~?v>#DA+wJHGC zRkfCfDh)u7Y?@JsLin{B2iqoSMuoJj>y1FIDAi_D$wTo$PqhJ~5QXw3D%7@t92L@n zC}Q4P9x0uyZciKx)Ldv{9fZ6fF>1R5lL{wD_MR7<&#+#szntLx~(>EWbd$Y)Kyhm z3n?q>i+G3rN5@nKsAd@3)6u;{lJh|TD+5$BfYa<9ei7^)y20Mz?X<9W7!6Vj!-H5m zwjY!f_EhPY6ML%csp8_-^?k*jD*U8kPnA7Y_EclyF2B`&q?UMnIGWN)Z9ZLp)+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?lLImF;D8dw(cBAN~$PNSnhMEon z%^)U|GlzttI89?IVw`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=XpV>7qv_D2ho)5F&@4i0c=I`x%=kPcw#A90^E5NH@XZ(aXjvxN1%k=u70yN9$#y$Wv!XSNUq_y zd##zD60K;pTCF$R?Pk4_up=0&Xua92;R9pmebg*6iQ;Uct>V*)n(yo$FWe|{6g|bz zqUg0)?zEyETZRB;D+&XaqP_g;uYgYZzwzGg(H^0CwcEcWZh2}iKO0-S3j;i+t*BWbCYbG(0YdG&-Yv!lKcK+wf^?Erg=WjBG9XV_9E!~Sx9@4cArgq5!#FVguMt0YA=E>ZWhvB zAEEkeS5c1_F8$|EKAU{@clFuypFjQQ{}coHY%l0P ue}7EQ|DJQe&YwUa5C{YUfj}VqaQp+LPbuPV#)Aw10000-e|C~Sz<<}BOK}I=4nqP!J=Z(?#^UCRQhrEgNdoxfB=}!wq;z0G&I?k-nFA& zbif4so^@Xk|5cuU%*u86O>oJ(ulw`P!LN5%l=*qEyo4v;+*c0;W$= zDOvnjeT1_I^N^;Bs-D9!Uwh&SSRB>1kO|>7Lw~EZ%eoM9nug8D#$3x+7(SBzVOrsT zQxX;v2y&VE^OOSAWCY=pJSd4L6JlsdG1PbvDD7?_j+T)8_=Gw(J2VY%e&_ihyBZgD{`-&ZeeyQ_L=A5IE2h^$_u>+9o)c0W;@S>sQ`l zz&I9maNR$=LUxsJvNu(U#Kfu%WT@p~8H}?J;hXcSX3TIorAWN}gBkOE?;1lkhj?co}fc6XtyAaDw~vzz0r z7QBWVq5f4-JEu~6K5r2KuJWs5++Ryx=ZuZ6o_cxP@@5>hXZF{!NopHU=aF#+YT->E%)kvbW~AUK(FtE!P&pQ z{UE{P=jWRDm=zg*CGhKz2_AWlCKXTO$YT0y`Ei=lis9UG~+6v;t>8v7nvs3 zv02_vyEGG0>c%nrB+ct&L)n19 zoRgG{;}D;?YMfGTHKFO?eLey{0oA;ula(xm43Kbxjtj4Dd2**D>($O$nEaulCzV1U z9IN3UHndq7D#$eccjvP9C*eOhT;@b)9S}4miDhAs2OenLpW<;B}-(+l? zYlc8Md)lA28H9FrM~71iy14&lyIEJ+%x3V21z)-bjvW4CWRf)_Dfc>jV)!^tW`6KG zk02l99>ZN4XcwY(%=C4Xd%15=6}o|XB6KMyv77gPeg4y@t~)AiKgM^~pR2MuJFFYU zpzL#Q7||Q>Sw6kHu)Yq$PycN!q$=%VV@+2Y_@&-N9wD^vV|95z#OPb*KYKU^ZCPn7 z%4`$q=<(3`WCx@ow8v-pCv|vl6ajhW&mAL*Fuu-hSD$P`JYR?7ST5bBF*u&lj~PPJ z9HV=BQ=A53SH0WAZ!HeTrQ93pt+5$idO9pve(24fyJLikuiJl`KUq|l1LOrZoQc?7G7Ii4%8(G6x@os`R$mzQT}dotgRKw`tc5W!!MQDwjL&SS70;d>)jQQ6lFCHMV>%`D$3k1>sfE1oWe-&D!57 zD8`$=C$jev2C{EHV3otVlfm770;|1Lq9NT zV}6*sU3EfgcIH`$Fx}94f-H4gUNN{^VxdM8qHf#}qF!lr7SZ#K-Any@pA z>nFGGFj!OBZDPNodC-FH@w1%9%{I<8k%K zge07$sF*!OVEsC=w#)0g1K?2#gV7E8lL?80jk4G{f@9_fL0WTP$YN+vH`ha2HfX;U!1Jd*%%8kr zMfLxYK07RogN!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/tgstation.dme b/tgstation.dme index e33a3644d6..410731cab4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -153,6 +153,7 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\mapping\maploader.dm" #include "code\__DEFINES\material\worth.dm" #include "code\__DEFINES\mobs\innate_abilities.dm" @@ -173,6 +174,7 @@ #include "code\__HELPERS\angles.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\chat.dm" +#include "code\__HELPERS\clients.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\config.dm" #include "code\__HELPERS\custom_holoforms.dm" @@ -282,6 +284,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\picture_in_picture.dm" #include "code\_onclick\hud\plane_master.dm" #include "code\_onclick\hud\radial.dm"