diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 28dbf0aa495..fe10371949b 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -1,3 +1,4 @@ +/* SKYRAT EDIT REMOVAL - Custom HTML Lobby Screen /datum/hud/new_player /datum/hud/new_player/New(mob/owner) @@ -353,3 +354,4 @@ return var/mob/dead/new_player/new_player = hud.mymob new_player.handle_player_polling() +*/ // SKYRAT EDIT END diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index c39f4d28836..1c2ca4be357 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -676,7 +676,7 @@ var/client/holder INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) - +/* SKYRAT EDIT REMOVAL /atom/movable/screen/splash/Initialize(mapload, client/C, visible, use_previous_title) . = ..() if(!istype(C)) @@ -696,7 +696,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/splash) icon = SStitle.previous_icon holder.screen += src - +*/ // SKYRAT EDIT END /atom/movable/screen/splash/proc/Fade(out, qdel_after = TRUE) if(QDELETED(src)) return diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a3d228709d1..346a63684ef 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -215,7 +215,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new init_stage_completed = 0 var/mc_started = FALSE - to_chat(world, span_boldannounce("Initializing subsystems...")) + add_startup_message("Initializing subsystems...") //SKYRAT EDIT CHANGE - Custom HTML Lobby Screen var/list/stage_sorted_subsystems = new(INITSTAGE_MAX) for (var/i in 1 to INITSTAGE_MAX) @@ -251,6 +251,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new SetRunLevel(1) // Loop. Master.StartProcessing(0) + add_startup_message("Clearing clutter...") //SKYRAT EDIT ADDITION + var/time = (REALTIMEOFDAY - start_timeofday) / 10 diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 1f472713dcb..d1582ba7c68 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -56,10 +56,10 @@ /// Running average of the amount of tick usage (in percents of a game tick) the subsystem has spent past its allocated time without pausing var/tick_overrun = 0 - + /// How much of a tick (in percents of a tick) were we allocated last fire. var/tick_allocation_last = 0 - + /// How much of a tick (in percents of a tick) do we get allocated by the mc on avg. var/tick_allocation_avg = 0 @@ -113,10 +113,10 @@ SHOULD_NOT_OVERRIDE(TRUE) set waitfor = FALSE . = SS_IDLE - + tick_allocation_last = Master.current_ticklimit-(TICK_USAGE) tick_allocation_avg = MC_AVERAGE(tick_allocation_avg, tick_allocation_last) - + . = SS_SLEEPING fire(resumed) . = state @@ -260,7 +260,7 @@ SEND_SIGNAL(src, COMSIG_SUBSYSTEM_POST_INITIALIZE, start_timeofday) var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" - to_chat(world, span_boldannounce("[msg]")) + add_startup_message(msg) //SKYRAT EDIT CHANGE log_world(msg) return time diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 146505abb36..67a956fa354 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -671,6 +671,7 @@ SUBSYSTEM_DEF(job) to_chat(player, "You have failed to qualify for any job you desired.") unassigned -= player player.ready = PLAYER_NOT_READY + player.client << output(player.ready, "lobby_browser:imgsrc") //SKYRAT EDIT ADDITION /datum/controller/subsystem/job/Recover() diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 83ccf517d16..628be2e99a2 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -260,7 +260,7 @@ Used by the AI doomsday and the self-destruct nuke. if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE)) errorList |= pm.original_path if(!silent) - INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") + add_startup_message("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") //SKYRAT EDIT CHANGE return parsed_maps /datum/controller/subsystem/mapping/proc/loadWorld() @@ -272,7 +272,7 @@ Used by the AI doomsday and the self-destruct nuke. // load the station station_start = world.maxz + 1 - INIT_ANNOUNCE("Loading [config.map_name]...") + add_startup_message("Loading [config.map_name]...") // SKYRAT EDIT CHANGE LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION) if(SSdbcore.Connect()) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e6e47b66647..b6913f4cd56 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -160,6 +160,8 @@ SUBSYSTEM_DEF(ticker) discord_alerted = TRUE send2chat("<@&[CONFIG_GET(string/game_alert_role_id)]> New round starting on [SSmapping.config.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles.", CONFIG_GET(string/chat_announce_new_game)) // Skyrat EDIT -- role pingcurrent_state = GAME_STATE_PREGAME current_state = GAME_STATE_PREGAME + change_title_screen() //SKYRAT EDIT ADDITION - Title screen + addtimer(CALLBACK(GLOBAL_PROC, .proc/change_title_screen), 1 SECONDS) //SKYRAT EDIT ADDITION - Title screen //Everyone who wants to be an observer is now spawned SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME) fire() @@ -351,8 +353,12 @@ SUBSYSTEM_DEF(ticker) GLOB.joined_player_list += player.ckey var/atom/destination = player.mind.assigned_role.get_roundstart_spawn_point() if(!destination) // Failed to fetch a proper roundstart location, won't be going anywhere. + player.show_title_screen() //SKYRAT EDIT CHANGE continue player.create_character(destination) + else + player.show_title_screen() //SKYRAT EDIT ADDITION + CHECK_TICK diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index b8ab24b5c5a..5a08e0d6657 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -1,3 +1,4 @@ +/* SKYRAT EDIT REMOVAL SUBSYSTEM_DEF(title) name = "Title Screen" flags = SS_NO_FIRE @@ -68,3 +69,4 @@ SUBSYSTEM_DEF(title) splash_turf = SStitle.splash_turf file_path = SStitle.file_path previous_icon = SStitle.previous_icon +*/ diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 9a8aa7a8ca4..b66ef75efb2 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -144,5 +144,5 @@ CHECK_TICK var/message = "[name] finished in [(REALTIMEOFDAY - start_time)/10]s!" - to_chat(world, span_boldannounce("[message]")) + add_startup_message(message) //SKYRAT EDIT CHANGE log_world(message) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 35e2371d8a6..c22d46ac191 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -82,7 +82,7 @@ bullet_bounce_sound = null INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) - +/* SKYRAT EDIT REMOVAL /turf/closed/indestructible/splashscreen/Initialize(mapload) . = ..() SStitle.splash_turf = src @@ -110,7 +110,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) if(NAMEOF(src, icon)) SStitle.icon = icon handle_generic_titlescreen_sizes() - +*/ /turf/closed/indestructible/start_area name = null desc = null diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index f424c20d432..eb24a89c64a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -100,6 +100,9 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/request_more_opfor, //SKYRAT EDIT ADDITION /client/proc/fix_say, // SKYRAT EDIT ADDITION /client/proc/spawn_sunbeam, // SKYRAT EDIT ADDITION + /client/proc/admin_change_title_screen, //SKYRAT EDIT ADDITION + /client/proc/change_title_screen_notice, //SKYRAT EDIT ADDITION + /client/proc/change_title_screen_html, //SKYRAT EDIT ADDITION /client/proc/cmd_select_equipment, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 92ba7aa51ec..0ccb4978807 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -3,7 +3,7 @@ invisibility = INVISIBILITY_ABSTRACT density = FALSE stat = DEAD - hud_type = /datum/hud/new_player + //hud_type = /datum/hud/new_player SKYRAT EDIT REMOVAL hud_possible = list() var/ready = FALSE @@ -40,6 +40,7 @@ /mob/dead/new_player/prepare_huds() return +/* SKYRAT EDIT REMOVAL - MOVED TO MODULAR /mob/dead/new_player/Topic(href, href_list[]) if(src != usr) return @@ -111,7 +112,7 @@ if(href_list["votepollref"]) var/datum/poll_question/poll = locate(href_list["votepollref"]) in GLOB.polls vote_on_poll_handler(poll, href_list) - +*/ //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() @@ -126,6 +127,7 @@ var/this_is_like_playing_right = alert(usr, "Are you sure you wish to observe?[less_input_message]", "Observe", "Yes", "No") //SKYRAT EDIT CHANGE if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") ready = PLAYER_NOT_READY + show_title_screen() // SKYRAT EDIT ADDITION return FALSE var/mob/dead/observer/observer = new() @@ -434,6 +436,7 @@ /mob/dead/new_player/proc/close_spawn_windows() + hide_title_screen() // SKYRAT EDIT ADDITION src << browse(null, "window=latechoices") //closes late choices window (Hey numbnuts go make this tgui) src << browse(null, "window=randjob") //closes the random job window diff --git a/config/skyrat/lobby_html.txt b/config/skyrat/title_html.txt similarity index 95% rename from config/skyrat/lobby_html.txt rename to config/skyrat/title_html.txt index 379b9dd4d22..b5d4b2b5348 100644 --- a/config/skyrat/lobby_html.txt +++ b/config/skyrat/title_html.txt @@ -78,9 +78,9 @@ margin-right: 100%; margin-top: 5px; padding-left: 6px; - font-size: 6vmin; - line-height: 6vmin; - height: 6vmin; + font-size: 4vmin; + line-height: 4vmin; + height: 4vmin; letter-spacing: 1px; border: 2px solid white; background-color: #0080ff; @@ -110,9 +110,9 @@ margin-right: 100%; margin-top: 5px; padding-left: 6px; - font-size: 6vmin; - line-height: 6vmin; - height: 6vmin; + font-size: 4vmin; + line-height: 4vmin; + height: 4vmin; letter-spacing: 1px; border: 2px solid white; background-color: #0080ff; diff --git a/interface/skin.dmf b/interface/skin.dmf index f29bffeb22f..7502d0e1a5c 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -117,6 +117,17 @@ window "mapwindow" right-click = true saved-params = "zoom;letterbox;zoom-mode" style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; }" + elem "title_browser" + type = BROWSER + pos = 0,0 + size = 640x480 + anchor1 = 0,0 + anchor2 = 100,100 + background-color = none + is-visible = false + is-disabled = true + saved-params = "" + auto-format = false elem "status_bar" type = LABEL pos = 0,464 diff --git a/modular_skyrat/master_files/code/_onclick/hud/new_player.dm b/modular_skyrat/master_files/code/_onclick/hud/new_player.dm deleted file mode 100644 index e5285df0f01..00000000000 --- a/modular_skyrat/master_files/code/_onclick/hud/new_player.dm +++ /dev/null @@ -1,29 +0,0 @@ -/atom/movable/screen/lobby/button/server_swap - icon = 'modular_skyrat/master_files/icons/hud/lobby/bottom_buttons.dmi' - icon_state = "server_swap" - base_icon_state = "server_swap" - screen_loc = "TOP:-122,CENTER:-54" - -/atom/movable/screen/lobby/button/server_swap/Click(location, control, params) - . = ..() - if(!.) - return - var/list/servers = CONFIG_GET(keyed_list/cross_server) - var/mob/dead/new_player/new_player = hud.mymob - if(servers.len == 1) - var/server_name = servers[1] - var/server_ip = servers[server_name] - var/confirm = tgui_alert(new_player, "Are you sure you want to swap to [server_name] ([server_ip])?", "Swapping server!", list("Send me there", "Stay here")) - if(confirm == "Connect me!") - to_chat_immediate(new_player, "So long, spaceman.") - new_player.client << link(server_ip) - return - var/server_name = tgui_input_list(new_player, "Please select the server you wish to swap to:", "Swap servers!", servers) - if(!server_name) - return - var/server_ip = servers[server_name] - var/confirm = tgui_alert(new_player, "Are you sure you want to swap to [server_name] ([server_ip])?", "Swapping server!", list("Connect me!", "Stay here!")) - if(confirm == "Connect me!") - to_chat_immediate(new_player, "So long, spaceman.") - new_player.client << link(server_ip) - return diff --git a/modular_skyrat/modules/title_screen/code/_title_screen_defines.dm b/modular_skyrat/modules/title_screen/code/_title_screen_defines.dm new file mode 100644 index 00000000000..85854fbceca --- /dev/null +++ b/modular_skyrat/modules/title_screen/code/_title_screen_defines.dm @@ -0,0 +1,166 @@ +GLOBAL_VAR(current_title_screen) + +GLOBAL_VAR(current_title_screen_notice) + +GLOBAL_VAR(title_html) + +GLOBAL_LIST_EMPTY(title_screens) + +#define DEFAULT_TITLE_SCREEN_IMAGE 'modular_skyrat/modules/title_screen/icons/skyrat_title_screen.png' +#define DEFAULT_TITLE_LOADING_SCREEN 'modular_skyrat/modules/title_screen/icons/loading_screen.gif' + +#define DEFAULT_TITLE_HTML {" + + + + + + + + "} diff --git a/modular_skyrat/modules/title_screen/code/new_player.dm b/modular_skyrat/modules/title_screen/code/new_player.dm new file mode 100644 index 00000000000..1f081ee23a4 --- /dev/null +++ b/modular_skyrat/modules/title_screen/code/new_player.dm @@ -0,0 +1,259 @@ +/mob/dead/new_player/Topic(href, href_list[]) + if(src != usr) + return + + if(!client) + return + + if(client.interviewee) + return FALSE + + if(href_list["observe"]) + play_lobby_button_sound() + make_me_an_observer() + return + + if(href_list["server_swap"]) + play_lobby_button_sound() + server_swap() + return + + if(href_list["view_manifest"]) + play_lobby_button_sound() + ViewManifest() + return + + if(href_list["toggle_antag"]) + play_lobby_button_sound() + var/datum/preferences/preferences = client.prefs + preferences.write_preference(GLOB.preference_entries[/datum/preference/toggle/be_antag], !preferences.read_preference(/datum/preference/toggle/be_antag)) + client << output(!preferences.read_preference(/datum/preference/toggle/be_antag), "title_browser:toggle_antag") + return + + if(href_list["character_setup"]) + play_lobby_button_sound() + var/datum/preferences/preferences = client.prefs + preferences.current_window = PREFERENCE_TAB_CHARACTER_PREFERENCES + preferences.update_static_data(src) + preferences.ui_interact(src) + return + + if(href_list["game_options"]) + play_lobby_button_sound() + var/datum/preferences/preferences = client.prefs + preferences.current_window = PREFERENCE_TAB_GAME_PREFERENCES + preferences.update_static_data(usr) + preferences.ui_interact(usr) + return + + if(href_list["toggle_ready"]) + play_lobby_button_sound() + if(!is_admin(client) && length_char(client?.prefs?.read_preference(/datum/preference/text/flavor_text)) < FLAVOR_TEXT_CHAR_REQUIREMENT) + to_chat(src, span_notice("You need at least [FLAVOR_TEXT_CHAR_REQUIREMENT] characters of flavor text to ready up for the round. You have [length_char(client.prefs.read_preference(/datum/preference/text/flavor_text))] characters.")) + return + + ready = !ready + client << output(ready, "title_browser:toggle_ready") + return + + if(href_list["late_join"]) + play_lobby_button_sound() + if(!SSticker?.IsRoundInProgress()) + to_chat(src, span_boldwarning("The round is either not ready, or has already finished...")) + return + + //Determines Relevent Population Cap + var/relevant_cap + var/hard_popcap = CONFIG_GET(number/hard_popcap) + var/extreme_popcap = CONFIG_GET(number/extreme_popcap) + if(hard_popcap && extreme_popcap) + relevant_cap = min(hard_popcap, extreme_popcap) + else + relevant_cap = max(hard_popcap, extreme_popcap) + + if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(key) in GLOB.admin_datums))) + to_chat(src, span_danger("[CONFIG_GET(string/hard_popcap_message)]")) + + var/queue_position = SSticker.queued_players.Find(src) + if(queue_position == 1) + to_chat(src, 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(src, span_notice("There are [queue_position-1] players in front of you in the queue to join the game.")) + else + SSticker.queued_players += src + to_chat(src, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].")) + return + + if(length_char(src.client.prefs.read_preference(/datum/preference/text/flavor_text)) < FLAVOR_TEXT_CHAR_REQUIREMENT) + to_chat(src, span_notice("You need at least [FLAVOR_TEXT_CHAR_REQUIREMENT] characters of flavor text to join the round. You have [length_char(src.client.prefs.read_preference(/datum/preference/text/flavor_text))] characters.")) + return + + LateChoices() + return + + if(href_list["cancrand"]) + src << browse(null, "window=randjob") //closes the random job window + LateChoices() + return + + if(href_list["SelectedJob"]) + select_job(href_list["SelectedJob"]) + return + + if(href_list["viewpoll"]) + play_lobby_button_sound() + var/datum/poll_question/poll = locate(href_list["viewpoll"]) in GLOB.polls + poll_player(poll) + return + + if(href_list["votepollref"]) + var/datum/poll_question/poll = locate(href_list["votepollref"]) in GLOB.polls + vote_on_poll_handler(poll, href_list) + return + + +/mob/dead/new_player/Login() + . = ..() + show_title_screen() + +/** + * Shows the titlescreen to a new player. + */ +/mob/dead/new_player/proc/show_title_screen() + if (client?.interviewee) + return + + winset(src, "title_browser", "is-disabled=false;is-visible=true") + + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/lobby) //Sending pictures to the client + assets.send(src) + + update_title_screen() + +/** + * Hard updates the title screen HTML, it causes visual glitches if used. + */ +/mob/dead/new_player/proc/update_title_screen() + var/dat = get_title_html() + + src << browse(GLOB.current_title_screen, "file=loading_screen.gif;display=0") + src << browse(dat, "window=title_browser") + +/datum/asset/simple/lobby + assets = list( + "FixedsysExcelsior3.01Regular.ttf" = 'html/browser/FixedsysExcelsior3.01Regular.ttf', + ) + +/** + * Removes the titlescreen entirely from a mob. + */ +/mob/dead/new_player/proc/hide_title_screen() + if(client?.mob) + winset(client, "title_browser", "is-disabled=true;is-visible=false") + +/mob/dead/new_player/proc/play_lobby_button_sound() + SEND_SOUND(src, sound('modular_skyrat/master_files/sound/effects/save.ogg')) + +/** + * Selects a new job or gives random if unset. + */ +/mob/dead/new_player/proc/select_job(job) + if(job == "Random") + var/list/dept_data = list() + for(var/datum/job_department/department as anything in SSjob.joinable_departments) + for(var/datum/job/job_datum as anything in department.department_jobs) + if(IsJobUnavailable(job_datum.title, TRUE) != JOB_AVAILABLE) + continue + dept_data += job_datum.title + var/random = pick(dept_data) + var/randomjob = "

[random]
Reroll
Cancel

" + var/datum/browser/popup = new(src, "randjob", "
Random Job
", 200, 150) + popup.set_window_options("can_close=0") + popup.set_content(randomjob) + popup.open(FALSE) + return + + if(!SSticker?.IsRoundInProgress()) + to_chat(usr, span_danger("The round is either not ready, or has already finished...")) + return + + if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) + to_chat(usr, span_notice("There is an administrative lock on entering the game!")) + return + + //Determines Relevent Population Cap + var/relevant_cap + var/hard_popcap = CONFIG_GET(number/hard_popcap) + var/extreme_popcap = CONFIG_GET(number/extreme_popcap) + if(hard_popcap && extreme_popcap) + relevant_cap = min(hard_popcap, extreme_popcap) + else + relevant_cap = max(hard_popcap, extreme_popcap) + + if(LAZYLEN(SSticker.queued_players) && !(ckey(key) in GLOB.admin_datums)) + if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) + to_chat(usr, span_warning("Server is full.")) + return + + AttemptLateSpawn(job) + +/** + * Allows the player to select a server to join from any loaded servers. + */ +/mob/dead/new_player/proc/server_swap() + var/list/servers = CONFIG_GET(keyed_list/cross_server) + if(LAZYLEN(servers) == 1) + var/server_name = servers[1] + var/server_ip = servers[server_name] + var/confirm = tgui_alert(src, "Are you sure you want to swap to [server_name] ([server_ip])?", "Swapping server!", list("Send me there", "Stay here")) + if(confirm == "Connect me!") + to_chat_immediate(src, "So long, spaceman.") + client << link(server_ip) + return + var/server_name = tgui_input_list(src, "Please select the server you wish to swap to:", "Swap servers!", servers) + if(!server_name) + return + var/server_ip = servers[server_name] + var/confirm = tgui_alert(src, "Are you sure you want to swap to [server_name] ([server_ip])?", "Swapping server!", list("Connect me!", "Stay here!")) + if(confirm == "Connect me!") + to_chat_immediate(src, "So long, spaceman.") + src.client << link(server_ip) + +/** + * Shows the player a list of current polls, if any. + */ +/mob/dead/new_player/proc/playerpolls() + var/output + if (!SSdbcore.Connect()) + return + 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)) + + if(!query_get_new_polls.Execute()) + qdel(query_get_new_polls) + return + if(query_get_new_polls.NextRow()) + output +={"POLLS (NEW)"} + else + output +={"POLLS"} + qdel(query_get_new_polls) + if(QDELETED(src)) + return + return output diff --git a/modular_skyrat/modules/title_screen/code/title_screen_controls.dm b/modular_skyrat/modules/title_screen/code/title_screen_controls.dm new file mode 100644 index 00000000000..15db95a01da --- /dev/null +++ b/modular_skyrat/modules/title_screen/code/title_screen_controls.dm @@ -0,0 +1,121 @@ + +/** + * Enables an admin to upload a new titlescreen image. + */ +/client/proc/admin_change_title_screen() + set category = "Admin.Fun" + set name = "Title Screen: Change" + + if(!check_rights(R_FUN)) + return + + log_admin("[key_name(usr)] is changing the title screen.") + message_admins("[key_name_admin(usr)] is changing the title screen.") + + switch(alert(usr, "Please select a new title screen.", "Title Screen", "Change", "Reset", "Cancel")) + if("Change") + var/file = input(usr) as icon|null + if(!file) + return + change_title_screen(file) + if("Reset") + change_title_screen() + if("Cancel") + return + +/** + * Sets a titlescreen notice, a big red text on the main screen. + */ +/client/proc/change_title_screen_notice() + set category = "Admin.Fun" + set name = "Title Screen: Set Notice" + + if(!check_rights(R_FUN)) + return + + log_admin("[key_name(usr)] is setting the title screen notice.") + message_admins("[key_name_admin(usr)] is setting the title screen notice.") + + var/new_notice = input(usr, "Please input a notice to be displayed on the title screen:", "Titlescreen Notice") + if(!new_notice) + set_title_screen_notice() + return + set_title_screen_notice(new_notice) + for(var/mob/dead/new_player/new_player in GLOB.new_player_list) + to_chat(new_player, span_boldannounce("TITLE NOTICE UPDATED: [new_notice]")) + SEND_SOUND(new_player, sound('modular_skyrat/modules/admin/sound/duckhonk.ogg')) + +/** + * Adds a startup message to the splashscreen. + */ +/proc/add_startup_message(msg) + var/msg_dat = {""} + + GLOB.startup_messages.Insert(1, msg_dat) + + for(var/mob/dead/new_player/iterating_new_player in GLOB.new_player_list) + INVOKE_ASYNC(iterating_new_player, /mob/dead/new_player.proc/update_title_screen) + +/** + * Changes the title screen to a new image. + */ + +/proc/change_title_screen(new_screen) + if(new_screen) + GLOB.current_title_screen = new_screen + else + if(LAZYLEN(GLOB.title_screens)) + GLOB.current_title_screen = pick(GLOB.title_screens) + else + GLOB.current_title_screen = DEFAULT_TITLE_SCREEN_IMAGE + + for(var/mob/dead/new_player/new_player in GLOB.new_player_list) + INVOKE_ASYNC(new_player, /mob/dead/new_player.proc/show_title_screen) + +/** + * Adds a notice to the main title screen in the form of big red text! + */ +/proc/set_title_screen_notice(new_title) + GLOB.current_title_screen_notice = new_title ? sanitize_text(new_title) : null + + for(var/mob/dead/new_player/new_player in GLOB.new_player_list) + INVOKE_ASYNC(new_player, /mob/dead/new_player.proc/show_title_screen) + +/** + * Reloads the titlescreen if it is bugged for someone. + */ +/client/verb/fix_title_screen() + set name = "Fix Lobby Screen" + set desc = "Lobbyscreen broke? Press this." + set category = "OOC" + + if(istype(mob, /mob/dead/new_player)) + var/mob/dead/new_player/new_player = mob + new_player.show_title_screen() + else + winset(src, "title_browser", "is-disabled=true;is-visible=false") + +/** + * An admin debug command that enables you to change the HTML on the go. + */ +/client/proc/change_title_screen_html() + set category = "Admin.Fun" + set name = "Title Screen: Set HTML" + + if(!check_rights(R_DEBUG)) + return + + log_admin("[key_name(usr)] is setting the title screen HTML.") + message_admins("[key_name_admin(usr)] is setting the title screen HTML.") + + var/new_html = input(usr, "Please enter your desired HTML(WARNING: YOU WILL BREAK SHIT)", "DANGER: TITLE HTML EDIT") as message|null + + if(!new_html) + return + + GLOB.title_html = new_html + + for(var/mob/dead/new_player/new_player in GLOB.new_player_list) + INVOKE_ASYNC(new_player, /mob/dead/new_player.proc/show_title_screen) + + message_admins("[key_name_admin(usr)] has changed the title screen HTML.") diff --git a/modular_skyrat/modules/title_screen/code/title_screen_html.dm b/modular_skyrat/modules/title_screen/code/title_screen_html.dm new file mode 100644 index 00000000000..87ea5814b62 --- /dev/null +++ b/modular_skyrat/modules/title_screen/code/title_screen_html.dm @@ -0,0 +1,101 @@ + +GLOBAL_LIST_EMPTY(startup_messages) +// FOR MOR INFO ON HTML CUSTOMISATION, SEE: https://github.com/Skyrat-SS13/Skyrat-tg/pull/4783 + +#define MAX_STARTUP_MESSAGES 27 + +/mob/dead/new_player/proc/get_title_html() + var/dat = GLOB.title_html + if(SSticker.current_state == GAME_STATE_STARTUP) + dat += {""} + dat += {" +
+ + "} + var/loop_index = 0 + for(var/i in GLOB.startup_messages) + if(loop_index >= MAX_STARTUP_MESSAGES) + break + dat += i + loop_index++ + dat += "
" + + else + dat += {""} + + if(GLOB.current_title_screen_notice) + dat += {" +
+ +
+ "} + + dat += {" +
+ SETUP ([uppertext(client.prefs.read_preference(/datum/preference/name/real_name))]) + "} + + dat += {"GAME OPTIONS + "} + + if(!SSticker || SSticker.current_state <= GAME_STATE_PREGAME) + dat += {"[ready == PLAYER_READY_TO_PLAY ? "READY ☑" : "READY ☒"] + "} + else + dat += {"JOIN + "} + dat += {"CREW + "} + + dat += {"[client.prefs.read_preference(/datum/preference/toggle/be_antag) ? "BE ANTAG ☑" : "BE ANTAG ☒"] + "} + + dat += {"OBSERVE + "} + + dat += {" + SWAP SERVERS + "} + + if(!is_guest_key(src.key)) + dat += playerpolls() + + dat += "
" + dat += {" + + "} + dat += "" + + return dat + diff --git a/modular_skyrat/modules/title_screen/code/title_screen_subsystem.dm b/modular_skyrat/modules/title_screen/code/title_screen_subsystem.dm new file mode 100644 index 00000000000..ea8e405039b --- /dev/null +++ b/modular_skyrat/modules/title_screen/code/title_screen_subsystem.dm @@ -0,0 +1,48 @@ +SUBSYSTEM_DEF(title) + name = "Title Screen" + flags = SS_NO_FIRE + init_order = INIT_ORDER_TITLE + + var/file_path + var/icon/startup_splash + +/datum/controller/subsystem/title/Initialize() + var/dat + if(!fexists("[global.config.directory]/skyrat/title_html.txt")) + to_chat(world, span_boldwarning("CRITICAL ERROR: Unable to read title_html.txt, reverting to backup title html, please check your server config and ensure this file exists.")) + dat = DEFAULT_TITLE_HTML + else + dat = file2text("[global.config.directory]/skyrat/title_html.txt") + + GLOB.title_html = dat + + var/list/provisional_title_screens = flist("[global.config.directory]/title_screens/images/") + var/list/title_screens = list() + + for(var/screen in provisional_title_screens) + var/list/formatted_list = splittext(screen, "+") + if((LAZYLEN(formatted_list) == 1 && (formatted_list[1] != "exclude" && formatted_list[1] != "blank.png" && formatted_list[1] != "startup_splash"))) + title_screens += screen + + if(LAZYLEN(formatted_list) > 1 && lowertext(formatted_list[1]) == "startup_splash") + var/file_path = "[global.config.directory]/title_screens/images/[screen]" + ASSERT(fexists(file_path)) + startup_splash = new(fcopy_rsc(file_path)) + + if(startup_splash) + change_title_screen(startup_splash) + else + change_title_screen(DEFAULT_TITLE_LOADING_SCREEN) + + if(length(title_screens)) + for(var/i in title_screens) + var/file_path = "[global.config.directory]/title_screens/images/[i]" + ASSERT(fexists(file_path)) + var/icon/title2use = new(fcopy_rsc(file_path)) + GLOB.title_screens += title2use + + return ..() + +/datum/controller/subsystem/title/Recover() + startup_splash = SStitle.startup_splash + file_path = SStitle.file_path diff --git a/modular_skyrat/modules/lobbyscreen/icons/loading_screen.gif b/modular_skyrat/modules/title_screen/icons/loading_screen.gif similarity index 100% rename from modular_skyrat/modules/lobbyscreen/icons/loading_screen.gif rename to modular_skyrat/modules/title_screen/icons/loading_screen.gif diff --git a/modular_skyrat/modules/lobbyscreen/icons/skyrat_lobbyscreen.png b/modular_skyrat/modules/title_screen/icons/skyrat_title_screen.png similarity index 100% rename from modular_skyrat/modules/lobbyscreen/icons/skyrat_lobbyscreen.png rename to modular_skyrat/modules/title_screen/icons/skyrat_title_screen.png diff --git a/modular_skyrat/modules/lobbyscreen/readme.md b/modular_skyrat/modules/title_screen/readme.md similarity index 100% rename from modular_skyrat/modules/lobbyscreen/readme.md rename to modular_skyrat/modules/title_screen/readme.md diff --git a/tgstation.dme b/tgstation.dme index 5299ddf222b..e6da1d1a93c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4576,7 +4576,6 @@ #include "modular_skyrat\master_files\code\_globalvars\lists\ambience.dm" #include "modular_skyrat\master_files\code\_globalvars\lists\chat.dm" #include "modular_skyrat\master_files\code\_onclick\cyborg.dm" -#include "modular_skyrat\master_files\code\_onclick\hud\new_player.dm" #include "modular_skyrat\master_files\code\_onclick\hud\screen_objects.dm" #include "modular_skyrat\master_files\code\controllers\configuration\entries\skyrat_config_entries.dm" #include "modular_skyrat\master_files\code\datums\ai_laws.dm" @@ -5823,6 +5822,11 @@ #include "modular_skyrat\modules\teshari\code\teshari_bodytype.dm" #include "modular_skyrat\modules\teshari\code\teshari_clothes.dm" #include "modular_skyrat\modules\ticket_counter\code\counter.dm" +#include "modular_skyrat\modules\title_screen\code\_title_screen_defines.dm" +#include "modular_skyrat\modules\title_screen\code\new_player.dm" +#include "modular_skyrat\modules\title_screen\code\title_screen_controls.dm" +#include "modular_skyrat\modules\title_screen\code\title_screen_html.dm" +#include "modular_skyrat\modules\title_screen\code\title_screen_subsystem.dm" #include "modular_skyrat\modules\tribal_extended\code\bow.dm" #include "modular_skyrat\modules\tribal_extended\code\crafting.dm" #include "modular_skyrat\modules\tribal_extended\code\quiver.dm"