From 10b2cc7eeffca311b2e150202b03485864a25f0f Mon Sep 17 00:00:00 2001 From: PrismaticGynoid Date: Sun, 14 Jan 2018 12:47:47 -0800 Subject: [PATCH] Multiple loadout slots (#4530) * Multiple loadout slots Ported from Bay. Each character can have 3 (number can be overridden by config) loadout slots. This way, you can have different outfits for different situations without needing to have a separate character slot or edit your loadout every time. Tested here, works as intended. The current loadout is set as slot 1, so you don't need to worry about remaking it. This also ports the to_file and from_file macros to make it work, I'm assuming they could later be used elsewhere as well. * Log of Changing --- code/_macros.dm | 2 + code/controllers/configuration.dm | 4 ++ .../preference_setup/loadout/loadout.dm | 39 +++++++++++++++++-- code/modules/client/preferences.dm | 6 ++- config/example/config.txt | 3 ++ .../PrismaticGynoid-toomanyloadouts.yml | 4 ++ 6 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 html/changelogs/PrismaticGynoid-toomanyloadouts.yml diff --git a/code/_macros.dm b/code/_macros.dm index 04dfa4eb1f..efd1e72edd 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -59,6 +59,8 @@ #define to_world_log(message) world.log << message // TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later. #define log_world(message) world.log << message +#define to_file(file_entry, source_var) file_entry << source_var +#define from_file(file_entry, target_var) file_entry >> target_var #define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b80652d6d6..061e125cef 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -81,6 +81,7 @@ var/list/gamemode_cache = list() var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. var/character_slots = 10 // The number of available character slots + var/loadout_slots = 3 // The number of loadout slots per character var/max_maint_drones = 5 //This many drones can spawn, var/allow_drone_spawn = 1 //assuming the admin allow them to. @@ -649,6 +650,9 @@ var/list/gamemode_cache = list() if("character_slots") config.character_slots = text2num(value) + if("loadout_slots") + config.loadout_slots = text2num(value) + if("allow_drone_spawn") config.allow_drone_spawn = text2num(value) diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index ecd61cae71..9ba9156fe1 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -47,10 +47,18 @@ var/list/gear_datums = list() var/current_tab = "General" /datum/category_item/player_setup_item/loadout/load_character(var/savefile/S) - S["gear"] >> pref.gear + from_file(S["gear_list"], pref.gear_list) + from_file(S["gear_slot"], pref.gear_slot) + if(pref.gear_list!=null && pref.gear_slot!=null) + pref.gear = pref.gear_list["[pref.gear_slot]"] + else + from_file(S["gear"], pref.gear) + pref.gear_slot = 1 /datum/category_item/player_setup_item/loadout/save_character(var/savefile/S) - S["gear"] << pref.gear + pref.gear_list["[pref.gear_slot]"] = pref.gear + to_file(S["gear_list"], pref.gear_list) + to_file(S["gear_slot"], pref.gear_slot) /datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost) . = list() @@ -68,6 +76,8 @@ var/list/gear_datums = list() var/mob/preference_mob = preference_mob() if(!islist(pref.gear)) pref.gear = list() + if(!islist(pref.gear_list)) + pref.gear_list = list() for(var/gear_name in pref.gear) if(!(gear_name in gear_datums)) @@ -102,7 +112,7 @@ var/list/gear_datums = list() fcolor = "#E67300" . += "" - . += "" + . += "" . += "
[total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\]
\<\<\[[pref.gear_slot]\] \>\>[total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\]
" var/firstcat = 1 @@ -187,6 +197,29 @@ var/list/gear_datums = list() return TOPIC_NOACTION set_tweak_metadata(gear, tweak, metadata) return TOPIC_REFRESH_UPDATE_PREVIEW + if(href_list["next_slot"] || href_list["prev_slot"]) + //Set the current slot in the gear list to the currently selected gear + pref.gear_list["[pref.gear_slot]"] = pref.gear + //If we're moving up a slot.. + if(href_list["next_slot"]) + //change the current slot number + pref.gear_slot = pref.gear_slot+1 + if(pref.gear_slot>config.loadout_slots) + pref.gear_slot = 1 + //If we're moving down a slot.. + else if(href_list["prev_slot"]) + //change current slot one down + pref.gear_slot = pref.gear_slot-1 + if(pref.gear_slot<1) + pref.gear_slot = config.loadout_slots + // Set the currently selected gear to whatever's in the new slot + if(pref.gear_list["[pref.gear_slot]"]) + pref.gear = pref.gear_list["[pref.gear_slot]"] + else + pref.gear = list() + pref.gear_list["[pref.gear_slot]"] = list() + // Refresh? + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["select_category"]) current_tab = href_list["select_category"] return TOPIC_REFRESH diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 40322abb57..72cfedad76 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -50,7 +50,9 @@ datum/preferences var/species_preview //Used for the species selection window. var/list/alternate_languages = list() //Secondary language(s) var/list/language_prefixes = list() //Kanguage prefix keys - var/list/gear //Custom/fluff item loadout. + var/list/gear //Left in for Legacy reasons, will no longer save. + var/list/gear_list = list() //Custom/fluff item loadouts. + var/gear_slot = 1 //The current gear save slot var/list/traits //Traits which modifier characters for better or worse (mostly worse). var/synth_color = 0 //Lets normally uncolorable synth parts be colorable. var/r_synth //Used with synth_color to color synth parts that normaly can't be colored. @@ -131,6 +133,8 @@ datum/preferences b_type = RANDOM_BLOOD_TYPE gear = list() + gear_list = list() + gear_slot = 1 if(istype(C)) client = C diff --git a/config/example/config.txt b/config/example/config.txt index 74a80dc88e..340d0e50b9 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -306,6 +306,9 @@ REQ_CULT_GHOSTWRITER 6 ## Sets the number of available character slots CHARACTER_SLOTS 10 +## Sets the number of loadout slots per character +LOADOUT_SLOTS 3 + ## Uncomment to use overmap system for zlevel travel #USE_OVERMAP diff --git a/html/changelogs/PrismaticGynoid-toomanyloadouts.yml b/html/changelogs/PrismaticGynoid-toomanyloadouts.yml new file mode 100644 index 0000000000..8df98cfc4f --- /dev/null +++ b/html/changelogs/PrismaticGynoid-toomanyloadouts.yml @@ -0,0 +1,4 @@ +author: ZeroBits +delete-after: True +changes: + - rscadd: "Added the ability to have multiple loadouts per character."