mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
248 lines
7.4 KiB
Plaintext
248 lines
7.4 KiB
Plaintext
/datum/preferences
|
|
COOLDOWN_DECLARE(ui_refresh_cooldown)
|
|
|
|
/datum/preferences/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, custom_state)
|
|
if(!char_render_holders)
|
|
update_preview_icon()
|
|
show_character_previews()
|
|
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "PreferencesMenu", "Preferences")
|
|
ui.set_autoupdate(FALSE)
|
|
ui.open()
|
|
CallAsync(src, PROC_REF(jiggle_map))
|
|
|
|
/datum/preferences/tgui_state(mob/user)
|
|
return GLOB.tgui_always_state
|
|
|
|
/datum/preferences/tgui_status(mob/user, datum/tgui_state/state)
|
|
return user.client == client ? STATUS_INTERACTIVE : STATUS_CLOSE
|
|
|
|
/datum/preferences/ui_assets(mob/user)
|
|
var/list/assets = list(
|
|
get_asset_datum(/datum/asset/simple/preferences),
|
|
get_asset_datum(/datum/asset/spritesheet/preferences),
|
|
get_asset_datum(/datum/asset/json/preferences),
|
|
)
|
|
|
|
for (var/datum/preference_middleware/preference_middleware as anything in middleware)
|
|
assets += preference_middleware.get_ui_assets()
|
|
|
|
return assets
|
|
|
|
/datum/preferences/tgui_data(mob/user)
|
|
var/list/data = list()
|
|
|
|
if(tainted_character_profiles)
|
|
data["character_profiles"] = create_character_profiles()
|
|
tainted_character_profiles = FALSE
|
|
|
|
data["character_preferences"] = compile_character_preferences(user)
|
|
|
|
data["active_slot"] = default_slot
|
|
data["saved_notification"] = saved_notification
|
|
|
|
for(var/datum/preference_middleware/preference_middleware as anything in middleware)
|
|
data += preference_middleware.get_ui_data(user)
|
|
|
|
return data
|
|
|
|
/datum/preferences/tgui_static_data(mob/user)
|
|
var/list/data = list()
|
|
|
|
data["character_profiles"] = create_character_profiles()
|
|
|
|
// data["character_preview_view"] = character_preview_view.assigned_map
|
|
// data["overflow_role"] = SSjob.GetJobType(SSjob.overflow_role).title
|
|
|
|
data["window"] = current_window
|
|
|
|
for(var/datum/preference_middleware/preference_middleware as anything in middleware)
|
|
data += preference_middleware.get_ui_static_data(user)
|
|
|
|
return data
|
|
|
|
/datum/preferences/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
. = bay_act(action, params, ui, state)
|
|
if(.)
|
|
return
|
|
|
|
switch(action)
|
|
if("set_preference")
|
|
var/requested_preference_key = params["preference"]
|
|
var/value = params["value"]
|
|
|
|
for(var/datum/preference_middleware/preference_middleware as anything in middleware)
|
|
if(preference_middleware.pre_set_preference(ui.user, requested_preference_key, value))
|
|
return TRUE
|
|
|
|
var/datum/preference/requested_preference = GLOB.preference_entries_by_key[requested_preference_key]
|
|
if(isnull(requested_preference))
|
|
return FALSE
|
|
|
|
// SAFETY: `update_preference` performs validation checks
|
|
if(!update_preference(requested_preference, value))
|
|
return FALSE
|
|
|
|
// if(istype(requested_preference, /datum/preference/name)) // TODO: do this
|
|
// tainted_character_profiles = TRUE
|
|
|
|
return TRUE
|
|
|
|
if("set_color_preference")
|
|
var/requested_preference_key = params["preference"]
|
|
|
|
var/datum/preference/requested_preference = GLOB.preference_entries_by_key[requested_preference_key]
|
|
if(isnull(requested_preference))
|
|
return FALSE
|
|
|
|
if(!istype(requested_preference, /datum/preference/color))
|
|
return FALSE
|
|
|
|
var/default_value = read_preference(requested_preference.type)
|
|
|
|
// Yielding
|
|
var/new_color = tgui_color_picker(
|
|
ui.user,
|
|
"Select new color",
|
|
null,
|
|
default_value || COLOR_WHITE,
|
|
)
|
|
|
|
if(!new_color)
|
|
return FALSE
|
|
|
|
if(!update_preference(requested_preference, new_color))
|
|
return FALSE
|
|
|
|
return TRUE
|
|
|
|
for(var/datum/preference_middleware/preference_middleware as anything in middleware)
|
|
. = preference_middleware.tgui_act(action, params, ui, state)
|
|
if(.)
|
|
return
|
|
|
|
return FALSE
|
|
|
|
/// Actions pertaining to the old bay system
|
|
/datum/preferences/proc/bay_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
|
. = FALSE
|
|
|
|
switch(action)
|
|
// Basic actions
|
|
if("load")
|
|
if(!IsGuestKey(ui.user.key))
|
|
open_load_dialog(ui.user)
|
|
. = TRUE
|
|
if("save")
|
|
save_character()
|
|
save_preferences()
|
|
saved_notification = TRUE
|
|
VARSET_IN(src, saved_notification, FALSE, 1 SECONDS)
|
|
. = TRUE
|
|
if("reload")
|
|
load_preferences(TRUE)
|
|
load_character()
|
|
attempt_vr(client.prefs_vr,"load_vore","") //VOREStation Edit
|
|
sanitize_preferences()
|
|
. = TRUE
|
|
if("resetslot")
|
|
if(!isnewplayer(ui.user))
|
|
to_chat(ui.user, span_userdanger("You can't change your character slot while being in round."))
|
|
if("Yes" != tgui_alert(ui.user, "This will reset the current slot. Continue?", "Reset current slot?", list("No", "Yes")))
|
|
return
|
|
if("Yes" != tgui_alert(ui.user, "Are you completely sure that you want to reset this character slot?", "Reset current slot?", list("No", "Yes")))
|
|
return
|
|
reset_slot()
|
|
sanitize_preferences()
|
|
. = TRUE
|
|
if("copy")
|
|
if(!isnewplayer(ui.user))
|
|
to_chat(ui.user, span_userdanger("You can't change your character slot while being in round."))
|
|
if(!IsGuestKey(ui.user.key))
|
|
open_copy_dialog(ui.user)
|
|
. = TRUE
|
|
// More specific stuff
|
|
if("switch_category")
|
|
var/new_category = params["category"]
|
|
for(var/datum/category_group/player_setup_category/PS in player_setup.categories)
|
|
if(PS.name == new_category)
|
|
player_setup.selected_category = PS
|
|
update_tgui_static_data(ui.user, ui)
|
|
break
|
|
. = TRUE
|
|
if("game_prefs")
|
|
ui.user.client.game_options()
|
|
. = TRUE
|
|
if("refresh_character_preview")
|
|
if(!COOLDOWN_FINISHED(src, ui_refresh_cooldown))
|
|
return
|
|
update_preview_icon()
|
|
COOLDOWN_START(src, ui_refresh_cooldown, 5 SECONDS)
|
|
CallAsync(src, PROC_REF(jiggle_map))
|
|
. = TRUE
|
|
|
|
/datum/preferences/proc/jiggle_map()
|
|
// Fix for weird byond bug, jiggles the map around a little
|
|
var/obj/screen/setup_preview/pm_helper/PMH = LAZYACCESS(char_render_holders, "PMH")
|
|
sleep(0.1 SECONDS)
|
|
PMH.screen_loc = LAZYACCESS(preview_screen_locs, "PMHjiggle")
|
|
sleep(0.1 SECONDS)
|
|
PMH.screen_loc = LAZYACCESS(preview_screen_locs, "PMH")
|
|
|
|
/datum/preferences/tgui_close(mob/user)
|
|
load_character()
|
|
save_preferences()
|
|
|
|
/datum/preferences/proc/create_character_profiles()
|
|
var/list/profiles = list()
|
|
|
|
for(var/index in 1 to CONFIG_GET(number/character_slots))
|
|
// TODO: It won't be updated in the savefile yet, so just read the name directly
|
|
// if(index == default_slot)
|
|
// profiles += read_preference(/datum/preference/name/real_name)
|
|
// continue
|
|
|
|
var/tree_key = "character[index]"
|
|
var/save_data = savefile.get_entry(tree_key)
|
|
var/name = save_data?["real_name"]
|
|
|
|
if(isnull(name))
|
|
profiles += null
|
|
continue
|
|
|
|
profiles += name
|
|
|
|
return profiles
|
|
|
|
/datum/preferences/proc/compile_character_preferences(mob/user)
|
|
var/list/preferences = list()
|
|
|
|
for(var/datum/preference/preference as anything in get_preferences_in_priority_order())
|
|
if(!preference.is_accessible(src))
|
|
continue
|
|
|
|
var/value = read_preference(preference.type)
|
|
var/data = preference.compile_ui_data(user, value)
|
|
|
|
LAZYINITLIST(preferences[preference.category])
|
|
preferences[preference.category][preference.savefile_key] = data
|
|
|
|
for(var/datum/preference_middleware/preference_middleware as anything in middleware)
|
|
var/list/append_character_preferences = preference_middleware.get_character_preferences(user)
|
|
if(isnull(append_character_preferences))
|
|
continue
|
|
|
|
for(var/category in append_character_preferences)
|
|
if(category in preferences)
|
|
preferences[category] += append_character_preferences[category]
|
|
else
|
|
preferences[category] = append_character_preferences[category]
|
|
|
|
return preferences
|