From 0b6d743e229a650e92be3a586b1602d151168fe3 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 28 Oct 2023 17:51:02 -0300 Subject: [PATCH 1/2] go --- code/__DEFINES/loadout.dm | 3 + code/_globalvars/lists/loadout_categories.dm | 3 +- code/controllers/subsystem/job.dm | 4 + code/modules/client/preferences.dm | 183 +++++++++++-------- 4 files changed, 120 insertions(+), 73 deletions(-) diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 0b1db1ecc6..e4e784c039 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -61,6 +61,9 @@ //unlockable items #define LOADOUT_CATEGORY_UNLOCKABLE "Unlockable" +//errors with your savefile +#define LOADOUT_CATEGORY_ERROR "Errors" + //how many prosthetics can we have #define MAXIMUM_LOADOUT_PROSTHETICS 4 diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm index 37e6145e47..53604111dd 100644 --- a/code/_globalvars/lists/loadout_categories.dm +++ b/code/_globalvars/lists/loadout_categories.dm @@ -11,5 +11,6 @@ GLOBAL_LIST_INIT(loadout_categories, list( LOADOUT_CATEGORY_GLOVES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLASSES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE, - LOADOUT_CATEGORY_UNLOCKABLE = LOADOUT_SUBCATEGORIES_NONE + LOADOUT_CATEGORY_UNLOCKABLE = LOADOUT_SUBCATEGORIES_NONE, + LOADOUT_CATEGORY_ERROR = LOADOUT_SUBCATEGORIES_NONE )) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index ac681642c7..46266385d1 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -694,6 +694,8 @@ SUBSYSTEM_DEF(job) return for(var/i in chosen_gear) var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM] + if(!G) + continue G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)] if(!G) continue @@ -755,6 +757,8 @@ SUBSYSTEM_DEF(job) return for(var/i in chosen_gear) var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM] + if(!G) + continue G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)] if(!G) continue diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 43f800b812..7d3361fff1 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -266,6 +266,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/tcg_cards = list() var/list/tcg_decks = list() + var/loadout_errors = 0 + /datum/preferences/New(client/C) parent = C @@ -364,12 +366,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) gear_points = CONFIG_GET(number/initial_gear_points) var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"] if(chosen_gear) + loadout_errors = 0 for(var/loadout_item in chosen_gear) var/loadout_item_path = loadout_item[LOADOUT_ITEM] - if(loadout_item_path) - var/datum/gear/loadout_gear = text2path(loadout_item_path) - if(loadout_gear) - gear_points -= initial(loadout_gear.cost) + if(!loadout_item_path) + loadout_errors++ + continue + var/datum/gear/loadout_gear = text2path(loadout_item_path) + if(!loadout_gear) + loadout_errors++ + continue + gear_points -= initial(loadout_gear.cost) else chosen_gear = list() @@ -916,9 +923,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += " |" if(category == gear_category) - dat += " [category] " + dat += " [(category == LOADOUT_CATEGORY_ERROR && loadout_errors) ? "[category] (!)" : category] " else - dat += " [category] " + dat += " [(category == LOADOUT_CATEGORY_ERROR && loadout_errors) ? "[category] (!)" : category] " dat += "" dat += "
" @@ -944,74 +951,97 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += " [subcategory] " dat += "" - dat += "" - dat += "
" - dat += "
" - dat += "" - dat += "" - dat += "" - dat += "" - var/even = FALSE - for(var/name in GLOB.loadout_items[gear_category][gear_subcategory]) - var/datum/gear/gear = GLOB.loadout_items[gear_category][gear_subcategory][name] - var/donoritem = gear.donoritem - if(donoritem && !gear.donator_ckey_check(user.ckey)) - continue - var/background_cl = "#23273C" - if(even) - background_cl = "#17191C" - even = !even - var/class_link = "" - var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]") - var/extra_loadout_data = "" - if(loadout_item) - class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'" - if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) - extra_loadout_data += "
Color" - for(var/loadout_color in loadout_item[LOADOUT_COLOR]) - extra_loadout_data += "[loadout_color]" - else - var/loadout_color_non_poly = "#FFFFFF" - if(length(loadout_item[LOADOUT_COLOR])) - loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1] - extra_loadout_data += "
Color" - extra_loadout_data += "[loadout_color_non_poly]" - if(gear.loadout_flags & LOADOUT_CAN_NAME) - extra_loadout_data += "
Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]" - if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION) - extra_loadout_data += "
Description" - else if((gear_points - gear.cost) < 0) - class_link = "style='white-space:normal;' class='linkOff'" - else if(donoritem) - class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" - else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear)) - class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" - else - class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'" - dat += "" - dat += "" + dat += "" + else + //we add the user's progress to the description assuming they have progress + var/datum/gear/unlockable/unlockable = gear + var/progress_made = unlockable_loadout_data[unlockable.progress_key] + if(!progress_made) + progress_made = 0 + dat += "" + dat += "
NameCostRestrictionsDescription
[name][extra_loadout_data][gear.cost]" - if(islist(gear.restricted_roles)) - if(gear.restricted_roles.len) - if(gear.restricted_desc) - dat += "" - dat += gear.restricted_desc - dat += "" + if(gear_category != LOADOUT_CATEGORY_ERROR) + dat += "" + dat += "
" + dat += "
" + dat += "" + dat += "" + dat += "" + dat += "" + + for(var/name in GLOB.loadout_items[gear_category][gear_subcategory]) + var/datum/gear/gear = GLOB.loadout_items[gear_category][gear_subcategory][name] + var/donoritem = gear.donoritem + if(donoritem && !gear.donator_ckey_check(user.ckey)) + continue + var/background_cl = "#23273C" + if(even) + background_cl = "#17191C" + even = !even + var/class_link = "" + var/list/loadout_item = has_loadout_gear(loadout_slot, "[gear.type]") + var/extra_loadout_data = "" + if(loadout_item) + class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=0'" + if(gear.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) + extra_loadout_data += "
Color" + for(var/loadout_color in loadout_item[LOADOUT_COLOR]) + extra_loadout_data += "[loadout_color]" else - dat += "" - dat += gear.restricted_roles.Join(";") - dat += "" - if(!istype(gear, /datum/gear/unlockable)) - // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description" - dat += "" - else - //we add the user's progress to the description assuming they have progress - var/datum/gear/unlockable/unlockable = gear - var/progress_made = unlockable_loadout_data[unlockable.progress_key] - if(!progress_made) - progress_made = 0 - dat += "" - dat += "
NameCostRestrictionsDescription
[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description]
[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]
" + var/loadout_color_non_poly = "#FFFFFF" + if(length(loadout_item[LOADOUT_COLOR])) + loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1] + extra_loadout_data += "
Color" + extra_loadout_data += "[loadout_color_non_poly]" + if(gear.loadout_flags & LOADOUT_CAN_NAME) + extra_loadout_data += "
Name [loadout_item[LOADOUT_CUSTOM_NAME] ? loadout_item[LOADOUT_CUSTOM_NAME] : "N/A"]" + if(gear.loadout_flags & LOADOUT_CAN_DESCRIPTION) + extra_loadout_data += "
Description" + else if((gear_points - gear.cost) < 0) + class_link = "style='white-space:normal;' class='linkOff'" + else if(donoritem) + class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" + else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear)) + class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" + else + class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'" + dat += "
[name][extra_loadout_data][gear.cost]" + if(islist(gear.restricted_roles)) + if(gear.restricted_roles.len) + if(gear.restricted_desc) + dat += "" + dat += gear.restricted_desc + dat += "" + else + dat += "" + dat += gear.restricted_roles.Join(";") + dat += "" + if(!istype(gear, /datum/gear/unlockable)) + // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description" + dat += "[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description]
[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]
" + else + dat += "" + dat += "
" + dat += "
" + dat += "" + dat += "" + var/list/sanitize_current_slot = loadout_data["SAVE_[loadout_slot]"] + for(var/list/entry in sanitize_current_slot) + var/test_item = entry["loadout_item"] + if(text2path(test_item)) + continue + var/background_cl = "#23273C" + if(even) + background_cl = "#17191C" + even = !even + dat += "" + dat += "" dat += "
Item typeData contained
[test_item ? test_item : "no path!!?! Report to an admin!"]" + var/list/other_data = entry["loadout_item"] ? entry - "loadout_item" : entry + dat += json_encode(other_data) + dat += "
" if(PREFERENCES_TAB) // Game Preferences dat += "
" @@ -3244,6 +3274,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) loadout_data["SAVE_[loadout_slot]"] += list(new_loadout_data) //double packed because it does the union of the CONTENTS of the lists else loadout_data["SAVE_[loadout_slot]"] = list(new_loadout_data) //double packed because you somehow had no save slot in your loadout? + if(href_list["clear_invalid_gear"]) + var/thing_to_remove = html_decode(href_list["clear_invalid_gear"]) + if(!thing_to_remove) + return + var/list/sanitize_current_slot = loadout_data["SAVE_[loadout_slot]"] + for(var/list/entry in sanitize_current_slot) + if(entry["loadout_item"] == thing_to_remove) + sanitize_current_slot.Remove(list(entry)) + break if(href_list["loadout_color"] || href_list["loadout_color_polychromic"] || href_list["loadout_rename"] || href_list["loadout_redescribe"]) //if the gear doesn't exist, or they don't have it, ignore the request From 55e0e5de060acd40c1d0a0c1227de6c327d3e914 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sat, 28 Oct 2023 17:54:31 -0300 Subject: [PATCH 2/2] real quick --- code/controllers/subsystem/job.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 46266385d1..4daff91575 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -694,7 +694,7 @@ SUBSYSTEM_DEF(job) return for(var/i in chosen_gear) var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM] - if(!G) + if(!ispath(G)) continue G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)] if(!G) @@ -757,7 +757,7 @@ SUBSYSTEM_DEF(job) return for(var/i in chosen_gear) var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM] - if(!G) + if(!ispath(G)) continue G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)] if(!G)