[TGUI] Loadout (#27026)

* [TGUI] Loadout

* Loadout Tweaks

* Cleanup

* Almost there

* Allow to sort alphabetical

* UX tweaks

* Note and remove tweaks from scarf

* Oh fuck

* Ooops

* Sorting features

* Global search

* Rebuild

* Sure

* Rebuildo and some review changes

* TGUI REBUILDO!

---------

Co-authored-by: ROdenFL <ROdenFL@yandex.ru>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Aylong
2024-11-09 08:04:53 +00:00
committed by GitHub
co-authored by ROdenFL Burzah
parent 9329140099
commit ca50656a51
22 changed files with 611 additions and 235 deletions
@@ -1,5 +1,10 @@
/datum/gear_tweak/proc/get_contents(metadata)
return
/datum/gear_tweak
/// Displayed in TGUI name
var/display_type
/// Font Awesome icon
var/fa_icon
/// Explains what is this do in TGUI tooltip
var/info
/datum/gear_tweak/proc/get_metadata(user, metadata)
return
@@ -10,102 +15,51 @@
/datum/gear_tweak/proc/tweak_gear_data(metadata, datum/gear_data)
return
/datum/gear_tweak/proc/tweak_item(obj/item/I, metadata)
/datum/gear_tweak/proc/tweak_item(obj/item/gear, metadata)
return
/*
* Color adjustment
*/
// MARK: Color
/datum/gear_tweak/color
display_type = "Color"
fa_icon = "palette"
info = "Recolorable"
var/list/valid_colors
/datum/gear_tweak/color/New(list/colors)
valid_colors = colors
..()
/datum/gear_tweak/color/get_contents(metadata)
return "Color: <font color='[metadata]'>&#9899;</font>"
/datum/gear_tweak/color/get_default()
return valid_colors ? valid_colors[1] : COLOR_GRAY
/datum/gear_tweak/color/get_metadata(user, metadata)
if(valid_colors)
return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors
return tgui_input_list(user, "Choose an item color.", "Recolor Gear", valid_colors, metadata)
return tgui_input_color(user, "Choose an item color.", "Global Preference", metadata)
/datum/gear_tweak/color/tweak_item(obj/item/I, metadata)
if(valid_colors && !(metadata in valid_colors))
/datum/gear_tweak/color/tweak_item(obj/item/gear, metadata)
if((valid_colors && !(metadata in valid_colors)) || !metadata)
return
I.color = metadata
/*
* Path adjustment
*/
gear.color = metadata
/datum/gear_tweak/path
var/list/valid_paths
// MARK: Rename
/datum/gear_tweak/rename
display_type = "Name"
fa_icon = "edit"
info = "Renameable"
/datum/gear_tweak/path/New(list/paths)
valid_paths = paths
..()
/datum/gear_tweak/rename/get_default()
return ""
/datum/gear_tweak/path/get_contents(metadata)
return "Type: [metadata]"
/datum/gear_tweak/rename/get_metadata(user, metadata)
var/new_name = tgui_input_text(user, "Rename an object. Enter empty line for stock name", "Rename Gear", metadata, MAX_NAME_LEN)
if(isnull(new_name))
return metadata
return new_name
/datum/gear_tweak/path/get_default()
return valid_paths[1]
/datum/gear_tweak/path/get_metadata(user, metadata)
return input(user, "Choose a type.", "Character Preference", metadata) as null|anything in valid_paths
/datum/gear_tweak/path/tweak_gear_data(metadata, datum/gear_data/gear_data)
if(!(metadata in valid_paths))
/datum/gear_tweak/rename/tweak_item(obj/item/gear, metadata)
if(!metadata)
return
gear_data.path = valid_paths[metadata]
/*
* Content adjustment
*/
/datum/gear_tweak/contents
var/list/valid_contents
/datum/gear_tweak/contents/New()
valid_contents = args.Copy()
..()
/datum/gear_tweak/contents/get_contents(metadata)
return "Contents: [english_list(metadata, and_text = ", ")]"
/datum/gear_tweak/contents/get_default()
. = list()
for(var/i = 1 to length(valid_contents))
. += "Random"
/datum/gear_tweak/contents/get_metadata(user, list/metadata)
. = list()
for(var/i = length(metadata) to length(valid_contents))
metadata += "Random"
for(var/i = 1 to length(valid_contents))
var/entry = input(user, "Choose an entry.", "Character Preference", metadata[i]) as null|anything in (valid_contents[i] + list("Random", "None"))
if(entry)
. += entry
else
return metadata
/datum/gear_tweak/contents/tweak_item(obj/item/I, list/metadata)
if(length(metadata) != length(valid_contents))
return
for(var/i = 1 to length(valid_contents))
var/path
var/list/contents = valid_contents[i]
if(metadata[i] == "Random")
path = pick(contents)
path = contents[path]
else if(metadata[i] == "None")
continue
else
path = contents[metadata[i]]
new path(I)
gear.name = metadata
@@ -1,14 +1,5 @@
GLOBAL_LIST_EMPTY(loadout_categories)
GLOBAL_LIST_EMPTY(gear_datums)
/datum/loadout_category
var/category = ""
var/list/gear = list()
/datum/loadout_category/New(cat)
category = cat
..()
/datum/gear
/// Displayed name of the item listing.
var/display_name
@@ -48,10 +39,10 @@ GLOBAL_LIST_EMPTY(gear_datums)
location = nlocation
/datum/gear/proc/spawn_item(location, metadata)
var/datum/gear_data/gd = new(path, location)
for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_gear_data(metadata["[gt]"], gd)
var/item = new gd.path(gd.location)
for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_item(item, metadata["[gt]"])
var/datum/gear_data/gear_data = new(path, location)
for(var/datum/gear_tweak/tweak in gear_tweaks)
tweak.tweak_gear_data(metadata["[tweak]"], gear_data)
var/item = new gear_data.path(gear_data.location)
for(var/datum/gear_tweak/tweak in gear_tweaks)
tweak.tweak_item(item, metadata["[tweak]"])
return item
@@ -0,0 +1,61 @@
GLOBAL_LIST_EMPTY(gear_tgui_info)
/datum/ui_module/loadout
name = "Loadout"
/datum/ui_module/loadout/ui_state(mob/user)
return GLOB.always_state
/datum/ui_module/loadout/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Loadout", name)
ui.set_autoupdate(FALSE)
ui.open()
/datum/ui_module/loadout/ui_data(mob/user)
var/list/data = list()
data["gear_slots"] = user?.client?.prefs.build_loadout()
data["selected_gears"] = user?.client?.prefs?.active_character?.loadout_gear
return data
/datum/ui_module/loadout/ui_static_data(mob/user)
var/list/data = list()
data["gears"] = GLOB.gear_tgui_info
data["max_gear_slots"] = user?.client?.prefs?.max_gear_slots
data["user_tier"] = user?.client?.donator_level
return data
/datum/ui_module/loadout/ui_act(action, list/params)
if(..())
return
. = TRUE
var/mob/user = usr
var/datum/character_save/active_character = user.client.prefs.active_character
switch(action)
if("toggle_gear")
var/datum/gear/gear = GLOB.gear_datums[text2path(params["gear"])]
if(gear && ("[gear]" in active_character.loadout_gear))
active_character.loadout_gear -= "[gear]"
return TRUE
if(gear.donator_tier && user.client.donator_level < gear.donator_tier)
to_chat(user, "<span class='warning'>That gear is only available at a higher donation tier than you are on.</span>")
return FALSE
user.client.prefs.build_loadout(gear)
return TRUE
if("set_tweak")
if(!(params["gear"] in active_character.loadout_gear))
return FALSE
var/datum/gear/gear = GLOB.gear_datums[text2path(params["gear"])]
var/datum/gear_tweak/tweak = locate(text2path(params["tweak"])) in gear.gear_tweaks
active_character.set_tweak_metadata(gear, tweak, tweak.get_metadata(user, active_character.get_tweak_metadata(gear, tweak)))
return TRUE
if("clear_loadout")
active_character.loadout_gear.Cut()
return TRUE