Files
VOREStation/code/modules/mob/new_player/lobby_browser.dm
T
Will 7c84aaee4b Paicontroller subsystem port (#19165)
* to subsystem

* wip subsystem pain

* some big recoding

* seperated

* oop

* fucking lua

* working on tgui foundation

* compile fixes

* nice and clean

* type

* inviting works

* unit testing

* agony

* test good

* typo

* that should be the basics

* Complete recode of pai saving

* restore fluff text

* migration

* pai notification automation

* swap

* length

* more fixes

* pai sprite datums

* type 13 uses all four directions

* eye handling

* use accessors

* working on icontests

* fix

* hologram eye test

* oop

* wait that doesn't work at all

* text

* eye colors and holo eyes

* lots of fixes

* fix those up

* organized

* belly cap

* that too

* death sprites

* resting eyes

* resting flag

* bad check here

* fixing icon files

* proper file

* garble

* fix some states

* pai death

* collapse pai files into single file

* allow some restricted pai interactions

* lamp

* block invites button

* collapse in remaining vr file

* this is actually needed

* documenting and organizing

* update to TGprefs

* remove gun toggle verb on pai

* forbid default name joins

* pai cable retraction

* various pai fixes

* icon forge pai

* pai eyes

* type 13 iconstate

* directionless

* small fix

* pai dir fix

* missing icon

* no fresh pais

* oops

* fixed pai join

* fixed change chassis

* pai UI

* .

* .

* reuse

* .

* .

* .

* push that

* Horro rmasks

* pai invite data change

* splitting

* use refs

* initial

* with PAI

* soem more

* .

* .

* .

* .

* ugh

* next

* pai invite

* only preview

* that

* use from char pref

* fixed pai invite not working

* small tgui fixes

* remove temp code

* .

* pai comments properly sent

* ooc

* horror

* need to use this for now

* .

* fix

* lol

* raw mob spawn fix

* pai software

* push

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2026-03-03 23:59:27 +01:00

182 lines
6.5 KiB
Plaintext

/mob/new_player/proc/initialize_lobby_screen()
if(!client)
return
var/datum/tgui/ui = SStgui.get_open_ui(src, src)
if(ui)
ui.close()
winset(src, "lobby_browser", "is-disabled=false;is-visible=true")
// winset(src, "mapwindow.status_bar", "is-visible=false")
lobby_window = new(client, "lobby_browser")
lobby_window.initialize(
assets = list(
get_asset_datum(/datum/asset/simple/tgui)
)
)
tgui_interact(src)
/mob/new_player/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, custom_state)
. = ..()
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "LobbyMenu", window = lobby_window)
ui.closeable = FALSE
ui.open(preinitialized = TRUE)
/mob/new_player/tgui_state(mob/user)
return GLOB.tgui_always_state
/mob/new_player/ui_assets(mob/user)
. = ..()
. += get_asset_datum(/datum/asset/simple/lobby_files)
/mob/new_player/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
var/displayed_name = world.name
if(config && CONFIG_GET(string/servername))
displayed_name = CONFIG_GET(string/servername)
data["server_name"] = displayed_name
data["map"] = using_map.full_name
data["station_time"] = stationtime2text()
data["display_loading"] = SSticker.current_state == GAME_STATE_STARTUP
data["round_start"] = !SSticker.mode || SSticker.current_state <= GAME_STATE_PREGAME
data["round_time"] = roundduration2text()
data["ready"] = ready
data["new_news"] = client?.check_for_new_server_news()
data["can_submit_feedback"] = SSsqlite.can_submit_feedback(client)
data["show_station_news"] = GLOB.news_data.station_newspaper
data["new_station_news"] = client.prefs.lastlorenews != GLOB.news_data.newsindex
data["new_changelog"] = read_preference(/datum/preference/text/lastchangelog) != GLOB.changelog_hash
data["can_start_now"] = client.is_localhost() && check_rights_for(client, R_SERVER)
data["immediate_start"] = SSticker.start_immediately || SSticker.current_state > GAME_STATE_PREGAME
return data
/mob/new_player/tgui_static_data(mob/user)
var/list/data = ..()
data["bg"] = 'icons/misc/loading.dmi'
data["bg_state"] = "loading"
return data
/mob/new_player/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
if(.)
return
switch(action)
if("character_setup")
client.prefs.ShowChoices(src)
return TRUE
if("ready")
if(!SSticker || SSticker.current_state <= GAME_STATE_PREGAME)
ready = !ready
else
ready = 0
return TRUE
if("manifest")
ViewManifest()
return TRUE
if("late_join")
if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
to_chat(usr, span_red("The round is either not ready, or has already finished..."))
return TRUE
var/time_till_respawn = time_till_respawn()
if(time_till_respawn == -1) // Special case, never allowed to respawn
to_chat(usr, span_warning("Respawning is not allowed!"))
else if(time_till_respawn) // Nonzero time to respawn
to_chat(usr, span_warning("You can't respawn yet! You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes."))
return TRUE
LateChoices()
return TRUE
if("observe")
if(QDELETED(src))
return FALSE
if(!SSticker || SSticker.current_state == GAME_STATE_STARTUP)
to_chat(src, span_warning("The game is still setting up, please try again later."))
return TRUE
if(tgui_alert(src,"Are you sure you wish to observe? If you do, make sure to not use any knowledge gained from observing if you decide to join later.","Observe Round?",list("Yes","No")) == "Yes")
if(QDELETED(src) || !client)
return TRUE
//Make a new mannequin quickly, and allow the observer to take the appearance
var/mob/living/carbon/human/dummy/mannequin = get_mannequin(client.ckey)
client.prefs.dress_preview_mob(mannequin)
var/mob/observer/dead/observer = new(mannequin)
observer.moveToNullspace() //Let's not stay in our doomed mannequin
spawning = 1
if(client.media)
client.media.stop_music() // MAD JAMS cant last forever yo
observer.started_as_observer = 1
close_spawn_windows()
var/obj/O = locate("landmark*Observer-Start")
if(istype(O))
to_chat(src, span_notice("Now teleporting."))
observer.forceMove(O.loc)
else
to_chat(src, span_danger("Could not locate an observer spawn point. Use the Teleport verb to jump to the station map."))
announce_ghost_joinleave(src)
if(client.prefs.read_preference(/datum/preference/toggle/human/name_is_always_random))
client.prefs.update_preference_by_type(/datum/preference/name/real_name, random_name(client.prefs.read_preference(/datum/preference/choiced/gender/identifying)))
observer.real_name = client.prefs.read_preference(/datum/preference/name/real_name)
observer.name = observer.real_name
if(!check_rights_for(client, R_HOLDER) && !CONFIG_GET(flag/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed.
remove_verb(observer, /mob/observer/dead/verb/toggle_antagHUD) // Poor guys, don't know what they are missing!
observer.key = key
observer.set_respawn_timer(time_till_respawn()) // Will keep their existing time if any, or return 0 and pass 0 into set_respawn_timer which will use the defaults
observer.client.init_verbs()
QDEL_NULL(mind)
qdel(src)
// pAI notify if we have be pAI invite on
SSpai.clear_pai_block_delay(REF(observer)) // Reset invite cooldown if we cancelled all invites for the round
if(SSpai.invite_valid(observer))
observer.pai_card_ping()
return TRUE
if("shownews")
handle_server_news()
return TRUE
if("give_feedback")
if(!SSsqlite.can_submit_feedback(persistent_client.client))
return
if(client.feedback_form)
client.feedback_form.display() // In case they closed the form early.
else
client.feedback_form = new(client)
return TRUE
if("open_station_news")
show_latest_news(GLOB.news_data.station_newspaper)
return TRUE
if("open_changelog")
write_preference_directly(/datum/preference/text/lastchangelog, GLOB.changelog_hash)
client.changes()
return TRUE
if("keyboard")
if(!SSsounds.initialized)
return
playsound_local(ui.user, get_sfx("keyboard"), vol = 20)
return TRUE
if("start_immediately")
if(!ui.user.client.is_localhost() || !check_rights_for(ui.user.client, R_SERVER))
return FALSE
SSticker.start_immediately = TRUE
if(SSticker.current_state == GAME_STATE_STARTUP)
to_chat(usr, span_admin("The server is still setting up, but the round will be started as soon as possible."))