diff --git a/baystation12.dme b/baystation12.dme
index 54912bc34eb..cae3ef936f8 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1025,7 +1025,6 @@
#include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_ambience.dm"
#include "code\modules\client\preferences_factions.dm"
-#include "code\modules\client\preferences_gear.dm"
#include "code\modules\client\preferences_notification.dm"
#include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_spawnpoints.dm"
@@ -1045,6 +1044,22 @@
#include "code\modules\client\preference_setup\global\02_settings.dm"
#include "code\modules\client\preference_setup\global\03_language.dm"
#include "code\modules\client\preference_setup\global\04_pai.dm"
+#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm"
+#include "code\modules\client\preference_setup\loadout\loadout.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_ears.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_general.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_head.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_mask.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_suit.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_utility.dm"
+#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm"
#include "code\modules\client\preference_setup\occupation\occupation.dm"
#include "code\modules\client\preference_setup\other\01_incidents.dm"
#include "code\modules\client\preference_setup\skills\skills.dm"
@@ -1820,6 +1835,7 @@
#include "code\modules\reagents\reagent_containers\food\cans.dm"
#include "code\modules\reagents\reagent_containers\food\condiment.dm"
#include "code\modules\reagents\reagent_containers\food\drinks.dm"
+#include "code\modules\reagents\reagent_containers\food\lunch.dm"
#include "code\modules\reagents\reagent_containers\food\sandwich.dm"
#include "code\modules\reagents\reagent_containers\food\snacks.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm"
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index ccbae49934c..01f95d2a360 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -333,7 +333,7 @@ var/global/datum/controller/occupations/job_master
else
permitted = 1
- if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
+ if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted]))
permitted = 0
if(!permitted)
@@ -343,10 +343,11 @@ var/global/datum/controller/occupations/job_master
if(G.slot && !(G.slot in custom_equip_slots))
// This is a miserable way to fix the loadout overwrite bug, but the alternative requires
// adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
+ var/metadata = H.client.prefs.gear[G.display_name]
if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
custom_equip_leftovers += thing
- else if(H.equip_to_slot_or_del(new G.path(H), G.slot))
- H << "Equipping you with [thing]!"
+ else if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
+ H << "Equipping you with \the [thing]!"
custom_equip_slots.Add(G.slot)
else
custom_equip_leftovers.Add(thing)
@@ -365,8 +366,9 @@ var/global/datum/controller/occupations/job_master
if(G.slot in custom_equip_slots)
spawn_in_storage += thing
else
- if(H.equip_to_slot_or_del(new G.path(H), G.slot))
- H << "Equipping you with [thing]!"
+ var/metadata = H.client.prefs.gear[G.display_name]
+ if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
+ H << "Equipping you with \the [thing]!"
custom_equip_slots.Add(G.slot)
else
spawn_in_storage += thing
@@ -429,9 +431,10 @@ var/global/datum/controller/occupations/job_master
if(!isnull(B))
for(var/thing in spawn_in_storage)
- H << "Placing [thing] in your [B]!"
+ H << "Placing \the [thing] in your [B.name]!"
var/datum/gear/G = gear_datums[thing]
- new G.path(B)
+ var/metadata = H.client.prefs.gear[G.display_name]
+ G.spawn_item(B, metadata)
else
H << "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug."
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 09ddfaea85b..0265f40d5ea 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -105,3 +105,80 @@
update_force()
user.visible_message(span("danger", "[user] smashes the [src] into [M], causing it to break open and strew its contents across the area"))
+
+/obj/item/weapon/storage/toolbox/lunchbox
+ name = "rainbow lunchbox"
+ icon = 'icons/obj/lunchbox.dmi'
+ force = 3
+ throwforce = 5
+ contained_sprite = 1
+ icon_state = "lunchbox_rainbow"
+ item_state = "lunchbox_rainbow"
+ desc = "A little lunchbox. This one is the colors of the rainbow."
+ attack_verb = list("lunched")
+ w_class = 3
+ max_storage_space = 8
+ var/filled = FALSE
+
+/obj/item/weapon/storage/toolbox/lunchbox/New()
+ ..()
+ if(filled)
+ var/list/lunches = lunchables_lunches()
+ var/lunch = lunches[pick(lunches)]
+ new lunch(src)
+
+ var/list/snacks = lunchables_snacks()
+ var/snack = snacks[pick(snacks)]
+ new snack(src)
+
+ var/list/drinks = lunchables_drinks()
+ var/drink = drinks[pick(drinks)]
+ new drink(src)
+
+/obj/item/weapon/storage/toolbox/lunchbox/filled
+ filled = TRUE
+
+/obj/item/weapon/storage/toolbox/lunchbox/heart
+ name = "heart lunchbox"
+ icon_state = "lunchbox_hearts"
+ item_state = "lunchbox_hearts"
+ desc = "A little lunchbox. This one has little hearts on it."
+
+/obj/item/weapon/storage/toolbox/lunchbox/heart/filled
+ filled = TRUE
+
+/obj/item/weapon/storage/toolbox/lunchbox/cat
+ name = "cat lunchbox"
+ icon_state = "lunchbox_cat"
+ item_state = "lunchbox_cat"
+ desc = "A little lunchbox. This one has a cat stamp on it."
+
+/obj/item/weapon/storage/toolbox/lunchbox/cat/filled
+ filled = TRUE
+
+/obj/item/weapon/storage/toolbox/lunchbox/nt
+ name = "NanoTrasen brand lunchbox"
+ icon_state = "lunchbox_nanotrasen"
+ item_state = "lunchbox_nanotrasen"
+ desc = "A little lunchbox. This one is branded with the NanoTrasen logo."
+
+/obj/item/weapon/storage/toolbox/lunchbox/nt/filled
+ filled = TRUE
+
+/obj/item/weapon/storage/toolbox/lunchbox/nymph
+ name = "\improper diona nymph lunchbox"
+ icon_state = "lunchbox_dionanymph"
+ item_state = "lunchbox_dionanymph"
+ desc = "A little lunchbox. This one has a diona nymph on the side."
+
+/obj/item/weapon/storage/toolbox/lunchbox/nymph/filled
+ filled = TRUE
+
+/obj/item/weapon/storage/toolbox/lunchbox/syndicate
+ name = "black and red lunchbox"
+ icon_state = "lunchbox_syndie"
+ item_state = "lunchbox_syndie"
+ desc = "A little lunchbox. This one is a sleek black and red."
+
+/obj/item/weapon/storage/toolbox/lunchbox/syndicate/filled
+ filled = TRUE
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index e1bce814e36..08bcb180119 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -278,6 +278,8 @@
prefs.last_id = computer_id //these are gonna be used for banning
. = ..() //calls mob.Login()
+
+ prefs.sanitize_preferences()
if (byond_version < config.client_error_version)
src << "Your version of BYOND is too old!"
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index 74c6ff7077a..2ceb8aea4d3 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -7,37 +7,31 @@
S["undershirt"] >> pref.undershirt
S["socks"] >> pref.socks
S["backbag"] >> pref.backbag
- S["gear"] >> pref.gear
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["underwear"] << pref.underwear
S["undershirt"] << pref.undershirt
S["socks"] << pref.socks
S["backbag"] << pref.backbag
- S["gear"] << pref.gear
/datum/category_item/player_setup_item/general/equipment/gather_load_query()
- return list("ss13_characters" = list("vars" = list("underwear", "undershirt", "socks", "backbag", "gear"), "args" = list("id")))
+ return list("ss13_characters" = list("vars" = list("underwear", "undershirt", "socks", "backbag"), "args" = list("id")))
/datum/category_item/player_setup_item/general/equipment/gather_load_parameters()
return list(":id" = pref.current_character)
/datum/category_item/player_setup_item/general/equipment/gather_save_query()
- return list("ss13_characters" = list("underwear", "undershirt", "socks", "backbag", "gear", "id" = 1, "ckey" = 1))
+ return list("ss13_characters" = list("underwear", "undershirt", "socks", "backbag", "id" = 1, "ckey" = 1))
/datum/category_item/player_setup_item/general/equipment/gather_save_parameters()
- return list(":underwear" = pref.underwear, ":undershirt" = pref.undershirt, ":socks" = pref.socks, ":backbag" = pref.backbag, ":gear" = list2params(pref.gear), ":id" = pref.current_character, ":ckey" = pref.client.ckey)
+ return list(":underwear" = pref.underwear, ":undershirt" = pref.undershirt, ":socks" = pref.socks, ":backbag" = pref.backbag, ":id" = pref.current_character, ":ckey" = pref.client.ckey)
/datum/category_item/player_setup_item/general/equipment/sanitize_character(var/sql_load = 0)
if (sql_load)
pref.backbag = text2num(pref.backbag)
- pref.gear = params2list(pref.gear)
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
- if (!islist(pref.gear))
- pref.gear = list()
-
var/undies = get_undies()
var/gender_socks = get_gender_socks()
if(!get_key_by_value(undies, pref.underwear))
@@ -47,45 +41,14 @@
if(!get_key_by_value(gender_socks, pref.socks))
pref.socks = gender_socks[gender_socks[1]]
- var/total_cost = 0
- for(var/gear_name in pref.gear)
- if(!gear_datums[gear_name])
- pref.gear -= gear_name
- else if(!(gear_name in valid_gear_choices()))
- pref.gear -= gear_name
- else
- var/datum/gear/G = gear_datums[gear_name]
- if(total_cost + G.cost > MAX_GEAR_COST)
- pref.gear -= gear_name
- else
- total_cost += G.cost
/datum/category_item/player_setup_item/general/equipment/content()
- . += "Equipment Loadout:
"
+ . += "Equipment:
"
. += "Underwear: [get_key_by_value(get_undies(),pref.underwear)]
"
. += "Undershirt: [get_key_by_value(undershirt_t,pref.undershirt)]
"
. += "Socks: [get_key_by_value(get_gender_socks(),pref.socks)]
"
. += "Backpack Type: [backbaglist[pref.backbag]]
"
- . += "
Custom Loadout:
"
- var/total_cost = 0
-
- if(pref.gear && pref.gear.len)
- for(var/i = 1; i <= pref.gear.len; i++)
- var/datum/gear/G = gear_datums[pref.gear[i]]
- if(G)
- total_cost += G.cost
- . += "[pref.gear[i]] ([G.cost] points) Remove
"
-
- . += "Used: [total_cost] points."
- else
- . += "None."
-
- if(total_cost < MAX_GEAR_COST)
- . += " Add"
- if(pref.gear && pref.gear.len)
- . += " Clear"
- . += "
"
/datum/category_item/player_setup_item/general/equipment/proc/get_undies()
return pref.gender == MALE ? underwear_m : underwear_f
@@ -93,17 +56,6 @@
/datum/category_item/player_setup_item/general/equipment/proc/get_gender_socks()
return pref.gender == MALE ? socks_m : socks_f
-/datum/category_item/player_setup_item/general/equipment/proc/valid_gear_choices(var/max_cost)
- . = list()
- var/mob/preference_mob = preference_mob()
- for(var/gear_name in gear_datums)
- var/datum/gear/G = gear_datums[gear_name]
- if(G.whitelisted && !is_alien_whitelisted(preference_mob, G.whitelisted))
- continue
- if(max_cost && G.cost > max_cost)
- continue
- . += gear_name
-
/datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["change_underwear"])
var/underwear_options = get_undies()
@@ -131,32 +83,4 @@
pref.backbag = backbaglist.Find(new_backbag)
return TOPIC_REFRESH
- else if(href_list["add_loadout"])
- var/total_cost = 0
- for(var/gear_name in pref.gear)
- if(gear_datums[gear_name])
- var/datum/gear/G = gear_datums[gear_name]
- total_cost += G.cost
-
- var/choice = input(user, "Select gear to add:", "Character Preference") as null|anything in valid_gear_choices(MAX_GEAR_COST - total_cost)
- if(choice && gear_datums[choice] && CanUseTopic(user))
- var/datum/gear/C = gear_datums[choice]
- total_cost += C.cost
- if(C && total_cost <= MAX_GEAR_COST)
- pref.gear += choice
- user << "Added \the '[choice]' for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)."
- else
- user << "Adding \the '[choice]' will exceed the maximum loadout cost of [MAX_GEAR_COST] points."
- return TOPIC_REFRESH
-
- else if(href_list["remove_loadout"])
- var/i_remove = text2num(href_list["remove_loadout"])
- if(i_remove < 1 || i_remove > pref.gear.len) return TOPIC_NOACTION
- pref.gear.Cut(i_remove, i_remove + 1)
- return TOPIC_REFRESH
-
- else if(href_list["clear_loadout"])
- pref.gear.Cut()
- return TOPIC_REFRESH
-
return ..()
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
new file mode 100644
index 00000000000..8620e866793
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
@@ -0,0 +1,145 @@
+/datum/gear_tweak/proc/get_contents(var/metadata)
+ return
+
+/datum/gear_tweak/proc/get_metadata(var/user, var/metadata)
+ return
+
+/datum/gear_tweak/proc/get_default()
+ return
+
+/datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data)
+ return
+
+/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata)
+ return
+
+/*
+Color adjustment
+*/
+
+var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
+
+/datum/gear_tweak/color
+ var/list/valid_colors
+
+/datum/gear_tweak/color/New(var/list/valid_colors)
+ src.valid_colors = valid_colors
+ ..()
+
+/datum/gear_tweak/color/get_contents(var/metadata)
+ return "Color: ⚫"
+
+/datum/gear_tweak/color/get_default()
+ return valid_colors ? valid_colors[1] : COLOR_GRAY
+
+/datum/gear_tweak/color/get_metadata(var/user, var/metadata)
+ if(valid_colors)
+ return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors
+ return input(user, "Choose an item color.", "Global Preference", metadata) as color|null
+
+/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata)
+ if(valid_colors && !(metadata in valid_colors))
+ return
+ I.color = metadata
+
+/*
+Path adjustment
+*/
+
+/datum/gear_tweak/path
+ var/list/valid_paths
+
+/datum/gear_tweak/path/New(var/list/valid_paths)
+ src.valid_paths = valid_paths
+ ..()
+
+/datum/gear_tweak/path/get_contents(var/metadata)
+ return "Type: [metadata]"
+
+/datum/gear_tweak/path/get_default()
+ return valid_paths[1]
+
+/datum/gear_tweak/path/get_metadata(var/user, var/metadata)
+ return input(user, "Choose a type.", "Character Preference", metadata) as null|anything in valid_paths
+
+/datum/gear_tweak/path/tweak_gear_data(var/metadata, var/datum/gear_data/gear_data)
+ if(!(metadata in valid_paths))
+ 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(var/metadata)
+ return "Contents: [english_list(metadata, and_text = ", ")]"
+
+/datum/gear_tweak/contents/get_default()
+ . = list()
+ for(var/i = 1 to valid_contents.len)
+ . += "Random"
+
+/datum/gear_tweak/contents/get_metadata(var/user, var/list/metadata)
+ . = list()
+ for(var/i = metadata.len to (valid_contents.len - 1))
+ metadata += "Random"
+ for(var/i = 1 to valid_contents.len)
+ 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(var/obj/item/I, var/list/metadata)
+ if(metadata.len != valid_contents.len)
+ return
+ for(var/i = 1 to valid_contents.len)
+ 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)
+
+/*
+Reagents adjustment
+*/
+
+
+/datum/gear_tweak/reagents
+ var/list/valid_reagents
+
+/datum/gear_tweak/reagents/New(var/list/reagents)
+ valid_reagents = reagents.Copy()
+ ..()
+
+/datum/gear_tweak/reagents/get_contents(var/metadata)
+ return "Reagents: [metadata]"
+
+/datum/gear_tweak/reagents/get_default()
+ return "Random"
+
+/datum/gear_tweak/reagents/get_metadata(var/user, var/list/metadata)
+ . = input(user, "Choose an entry.", "Character Preference", metadata) as null|anything in (valid_reagents + list("Random", "None"))
+ if(!.)
+ return metadata
+
+/datum/gear_tweak/reagents/tweak_item(var/obj/item/I, var/list/metadata)
+ if(metadata == "None")
+ return
+ if(metadata == "Random")
+ . = valid_reagents[pick(valid_reagents)]
+ else
+ . = valid_reagents[metadata]
+ I.reagents.add_reagent(., I.reagents.get_free_space())
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
new file mode 100644
index 00000000000..70a18e5b8a6
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -0,0 +1,228 @@
+var/list/loadout_categories = list()
+var/list/gear_datums = list()
+
+/datum/loadout_category
+ var/category = ""
+ var/list/gear = list()
+
+/datum/loadout_category/New(var/cat)
+ category = cat
+ ..()
+
+/hook/startup/proc/populate_gear_list()
+
+ //create a list of gear datums to sort
+ for(var/geartype in typesof(/datum/gear)-/datum/gear)
+ var/datum/gear/G = geartype
+
+ var/use_name = initial(G.display_name)
+ var/use_category = initial(G.sort_category)
+
+ if(!loadout_categories[use_category])
+ loadout_categories[use_category] = new /datum/loadout_category(use_category)
+ var/datum/loadout_category/LC = loadout_categories[use_category]
+ gear_datums[use_name] = new geartype
+ LC.gear[use_name] = gear_datums[use_name]
+
+ loadout_categories = sortAssoc(loadout_categories)
+ for(var/loadout_category in loadout_categories)
+ var/datum/loadout_category/LC = loadout_categories[loadout_category]
+ LC.gear = sortAssoc(LC.gear)
+ return 1
+
+/datum/category_item/player_setup_item/loadout
+ name = "Loadout"
+ sort_order = 1
+ var/current_tab = "General"
+
+/datum/category_item/player_setup_item/loadout/load_character(var/savefile/S)
+ S["gear"] >> pref.gear
+
+/datum/category_item/player_setup_item/loadout/save_character(var/savefile/S)
+ S["gear"] << pref.gear
+
+/datum/category_item/player_setup_item/loadout/gather_load_query()
+ return list("ss13_characters" = list("vars" = list("gear"), "args" = list("id")))
+
+/datum/category_item/player_setup_item/loadout/gather_save_query()
+ return list("ss13_characters" = list("gear", "id" = 1, "ckey" = 1))
+
+/datum/category_item/player_setup_item/loadout/gather_save_parameters()
+ return list(":gear" = list2params(pref.gear), ":id" = pref.current_character, ":ckey" = pref.client.ckey)
+
+/datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost)
+ . = list()
+ var/mob/preference_mob = preference_mob()
+ for(var/gear_name in gear_datums)
+ var/datum/gear/G = gear_datums[gear_name]
+
+ if(G.whitelisted && !is_alien_whitelisted(preference_mob, all_species[G.whitelisted]))
+ continue
+ if(max_cost && G.cost > max_cost)
+ continue
+ . += gear_name
+
+/datum/category_item/player_setup_item/loadout/sanitize_character(var/sql_load = 0)
+
+ if (sql_load)
+ pref.gear = params2list(pref.gear)
+
+ var/mob/preference_mob = preference_mob()
+ if(!islist(pref.gear))
+ pref.gear = list()
+
+ for(var/gear_name in pref.gear)
+ if(!(gear_name in gear_datums))
+ pref.gear -= gear_name
+ var/total_cost = 0
+ for(var/gear_name in pref.gear)
+ if(!gear_datums[gear_name])
+ preference_mob << "You cannot have more than one of the \the [gear_name]"
+ pref.gear -= gear_name
+ else if(!(gear_name in valid_gear_choices()))
+ preference_mob << "You cannot take \the [gear_name] as you are not whitelisted for the species."
+ pref.gear -= gear_name
+ else
+ var/datum/gear/G = gear_datums[gear_name]
+ if(total_cost + G.cost > MAX_GEAR_COST)
+ pref.gear -= gear_name
+ preference_mob << "You cannot afford to take \the [gear_name]"
+ else
+ total_cost += G.cost
+
+/datum/category_item/player_setup_item/loadout/content()
+ var/total_cost = 0
+ if(pref.gear && pref.gear.len)
+ for(var/i = 1; i <= pref.gear.len; i++)
+ var/datum/gear/G = gear_datums[pref.gear[i]]
+ if(G)
+ total_cost += G.cost
+
+ var/fcolor = "#3366CC"
+ if(total_cost < MAX_GEAR_COST)
+ fcolor = "#E67300"
+ . = list()
+ . += "
"
+ . += "| [total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\] |
"
+
+ . += "| "
+ var/firstcat = 1
+ for(var/category in loadout_categories)
+
+ if(firstcat)
+ firstcat = 0
+ else
+ . += " |"
+ if(category == current_tab)
+ . += " [category] "
+ else
+ var/datum/loadout_category/LC = loadout_categories[category]
+ var/tcolor = "#3366CC"
+ for(var/thing in LC.gear)
+ if(thing in pref.gear)
+ tcolor = "#E67300"
+ break
+ . += " [category] "
+ . += " |
"
+
+ var/datum/loadout_category/LC = loadout_categories[current_tab]
+ . += "
|
"
+ . += "| [LC.category] |
"
+ . += "
|
"
+ for(var/gear_name in LC.gear)
+ if(!(gear_name in valid_gear_choices()))
+ continue
+ var/datum/gear/G = LC.gear[gear_name]
+ var/ticked = (G.display_name in pref.gear)
+ . += "| [G.display_name] | "
+ . += "[G.cost] | "
+ . += "[G.description] |
"
+ if(ticked)
+ . += "| "
+ for(var/datum/gear_tweak/tweak in G.gear_tweaks)
+ . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]"
+ . += " |
"
+ . += "
"
+ . = jointext(.,null)
+
+/datum/category_item/player_setup_item/loadout/proc/get_gear_metadata(var/datum/gear/G)
+ . = pref.gear[G.display_name]
+ if(!.)
+ . = list()
+ pref.gear[G.display_name] = .
+
+/datum/category_item/player_setup_item/loadout/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak)
+ var/list/metadata = get_gear_metadata(G)
+ . = metadata["[tweak]"]
+ if(!.)
+ . = tweak.get_default()
+ metadata["[tweak]"] = .
+
+/datum/category_item/player_setup_item/loadout/proc/set_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak, var/new_metadata)
+ var/list/metadata = get_gear_metadata(G)
+ metadata["[tweak]"] = new_metadata
+
+/datum/category_item/player_setup_item/loadout/OnTopic(href, href_list, user)
+ if(href_list["toggle_gear"])
+ var/datum/gear/TG = gear_datums[href_list["toggle_gear"]]
+ if(TG.display_name in pref.gear)
+ pref.gear -= TG.display_name
+ else
+ var/total_cost = 0
+ for(var/gear_name in pref.gear)
+ var/datum/gear/G = gear_datums[gear_name]
+ if(istype(G)) total_cost += G.cost
+ if((total_cost+TG.cost) <= MAX_GEAR_COST)
+ pref.gear += TG.display_name
+ return TOPIC_REFRESH
+ if(href_list["gear"] && href_list["tweak"])
+ var/datum/gear/gear = gear_datums[href_list["gear"]]
+ var/datum/gear_tweak/tweak = locate(href_list["tweak"])
+ if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
+ return TOPIC_NOACTION
+ var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak))
+ if(!metadata || !CanUseTopic(user))
+ return TOPIC_NOACTION
+ set_tweak_metadata(gear, tweak, metadata)
+ return TOPIC_REFRESH
+ else if(href_list["select_category"])
+ current_tab = href_list["select_category"]
+ return TOPIC_REFRESH
+ else if(href_list["clear_loadout"])
+ pref.gear.Cut()
+ return TOPIC_REFRESH
+ return ..()
+
+/datum/gear
+ var/display_name //Name/index. Must be unique.
+ var/description //Description of this gear. If left blank will default to the description of the pathed item.
+ var/path //Path to item.
+ var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
+ var/slot //Slot to equip to.
+ var/list/allowed_roles //Roles that can spawn with this item.
+ var/whitelisted //Term to check the whitelist for..
+ var/sort_category = "General"
+ var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
+
+/datum/gear/New()
+ ..()
+ if(!description)
+ var/obj/O = path
+ description = initial(O.desc)
+
+/datum/gear_data
+ var/path
+ var/location
+
+/datum/gear_data/New(var/path, var/location)
+ src.path = path
+ src.location = location
+
+/datum/gear/proc/spawn_item(var/location, var/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]"])
+ return item
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
new file mode 100644
index 00000000000..04cffbef2e6
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -0,0 +1,69 @@
+/datum/gear/accessory
+ display_name = "suspenders"
+ path = /obj/item/clothing/accessory/suspenders
+ slot = slot_tie
+ sort_category = "Accessories"
+
+/datum/gear/accessory/waistcoat
+ display_name = "waistcoat"
+ path = /obj/item/clothing/accessory/wcoat
+
+/datum/gear/accessory/armband
+ display_name = "armband selection"
+ path = /obj/item/clothing/accessory/armband
+
+/datum/gear/accessory/armband/New()
+ ..()
+ var/armbands = list()
+ armbands["red armband"] = /obj/item/clothing/accessory/armband
+ armbands["cargo armband"] = /obj/item/clothing/accessory/armband/cargo
+ armbands["EMT armband"] = /obj/item/clothing/accessory/armband/medgreen
+ armbands["medical armband"] = /obj/item/clothing/accessory/armband/med
+ armbands["engineering armband"] = /obj/item/clothing/accessory/armband/engine
+ armbands["hydroponics armband"] = /obj/item/clothing/accessory/armband/hydro
+ armbands["science armband"] = /obj/item/clothing/accessory/armband/science
+ armbands["synthetic intelligence movement armband"] = /obj/item/clothing/accessory/armband/movement
+ armbands["ATLAS armband"] = /obj/item/clothing/accessory/armband/atlas
+ gear_tweaks += new/datum/gear_tweak/path(armbands)
+
+/datum/gear/accessory/holster
+ display_name = "holster selection"
+ path = /obj/item/clothing/accessory/holster
+ allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective", "Security Cadet")
+
+/datum/gear/accessory/holster/New()
+ ..()
+ var/holsters = list()
+ holsters["holster, armpit"] = /obj/item/clothing/accessory/holster/armpit
+ holsters["holster, hip"] = /obj/item/clothing/accessory/holster/hip
+ holsters["holster, waist"] = /obj/item/clothing/accessory/holster/waist
+ holsters["holster, thigh"] = /obj/item/clothing/accessory/holster/thigh
+ gear_tweaks += new/datum/gear_tweak/path(holsters)
+
+/datum/gear/accessory/tie
+ display_name = "tie selection"
+ path = /obj/item/clothing/accessory
+
+/datum/gear/accessory/tie/New()
+ ..()
+ var/ties = list()
+ ties["blue tie"] = /obj/item/clothing/accessory/blue
+ ties["red tie"] = /obj/item/clothing/accessory/red
+ ties["horrible tie"] = /obj/item/clothing/accessory/horrible
+ gear_tweaks += new/datum/gear_tweak/path(ties)
+
+/datum/gear/accessory/brown_vest
+ display_name = "webbing, engineering"
+ path = /obj/item/clothing/accessory/storage/brown_vest
+ allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer")
+
+/datum/gear/accessory/black_vest
+ display_name = "webbing, security"
+ path = /obj/item/clothing/accessory/storage/black_vest
+ allowed_roles = list("Security Officer","Head of Security","Warden")
+
+/datum/gear/accessory/webbing
+ display_name = "webbing, simple"
+ path = /obj/item/clothing/accessory/storage/webbing
+ cost = 2
+
diff --git a/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm b/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm
new file mode 100644
index 00000000000..c75a557675b
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_cosmetics.dm
@@ -0,0 +1,21 @@
+/datum/gear/cosmetic
+ display_name = "purple comb"
+ path = /obj/item/weapon/haircomb
+ sort_category = "Cosmetics"
+
+/datum/gear/cosmetic/lipstick
+ display_name = "lipstick selection"
+ path = /obj/item/weapon/lipstick
+
+/datum/gear/cosmetic/lipstick/New()
+ ..()
+ var/lipsticks = list()
+ lipsticks["lipstick, red"] = /obj/item/weapon/lipstick
+ lipsticks["lipstick, purple"] = /obj/item/weapon/lipstick/purple
+ lipsticks["lipstick, jade"] = /obj/item/weapon/lipstick/jade
+ lipsticks["lipstick, back"] = /obj/item/weapon/lipstick/black
+ gear_tweaks += new/datum/gear_tweak/path(lipsticks)
+
+/datum/gear/cosmetic/mirror
+ display_name = "handheld mirror"
+ path = /obj/item/weapon/mirror
diff --git a/code/modules/client/preference_setup/loadout/loadout_ears.dm b/code/modules/client/preference_setup/loadout/loadout_ears.dm
new file mode 100644
index 00000000000..11685305ca3
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_ears.dm
@@ -0,0 +1,19 @@
+// Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use
+// the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset.
+/datum/gear/ears
+ display_name = "earmuffs"
+ path = /obj/item/clothing/ears/earmuffs
+ sort_category = "Earwear"
+
+/datum/gear/ears/bandanna
+ display_name = "neck bandanna selection"
+ path = /obj/item/clothing/ears/bandanna
+
+/datum/gear/ears/bandanna/New()
+ ..()
+ var/bandanna = list()
+ bandanna["red bandanna"] = /obj/item/clothing/ears/bandanna
+ bandanna["blue bandanna"] = /obj/item/clothing/ears/bandanna/blue
+ bandanna["black bandanna"] = /obj/item/clothing/ears/bandanna/black
+ gear_tweaks += new/datum/gear_tweak/path(bandanna)
+
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
new file mode 100644
index 00000000000..fef99095d78
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
@@ -0,0 +1,50 @@
+// Eyes
+/datum/gear/eyes
+ display_name = "eyepatch"
+ path = /obj/item/clothing/glasses/eyepatch
+ slot = slot_glasses
+ sort_category = "Glasses and Eyewear"
+
+/datum/gear/eyes/glasses
+ display_name = "glasses, prescription"
+ path = /obj/item/clothing/glasses/regular
+
+/datum/gear/eyes/glasses/green
+ display_name = "glasses, green"
+ path = /obj/item/clothing/glasses/gglasses
+
+/datum/gear/eyes/glasses/prescriptionhipster
+ display_name = "glasses, hipster"
+ path = /obj/item/clothing/glasses/regular/hipster
+
+/datum/gear/eyes/glasses/monocle
+ display_name = "monocle"
+ path = /obj/item/clothing/glasses/monocle
+
+/datum/gear/eyes/scanning_goggles
+ display_name = "scanning goggles"
+ path = /obj/item/clothing/glasses/regular/scanners
+
+/datum/gear/eyes/sciencegoggles
+ display_name = "science Goggles"
+ path = /obj/item/clothing/glasses/science
+
+/datum/gear/eyes/security
+ display_name = "security HUD"
+ path = /obj/item/clothing/glasses/hud/security
+ allowed_roles = list("Security Officer","Head of Security","Warden")
+
+/datum/gear/eyes/medical
+ display_name = "medical HUD"
+ path = /obj/item/clothing/glasses/hud/health
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
+
+/datum/gear/eyes/shades
+ display_name = "sunglasses, fat"
+ path = /obj/item/clothing/glasses/sunglasses/big
+ allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective")
+
+/datum/gear/eyes/shades/prescriptionsun
+ display_name = "sunglasses, presciption"
+ path = /obj/item/clothing/glasses/sunglasses/prescription
+ cost = 2
diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm
new file mode 100644
index 00000000000..7c3c9da7e5a
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_general.dm
@@ -0,0 +1,69 @@
+/datum/gear/cane
+ display_name = "cane"
+ path = /obj/item/weapon/cane
+
+/datum/gear/dice
+ display_name = "d20"
+ path = /obj/item/weapon/dice/d20
+
+/datum/gear/cards
+ display_name = "deck of cards"
+ path = /obj/item/weapon/deck/cards
+
+/datum/gear/tarot
+ display_name = "deck of tarot cards"
+ path = /obj/item/weapon/deck/tarot
+
+/datum/gear/holder
+ display_name = "card holder"
+ path = /obj/item/weapon/deck/holder
+
+/datum/gear/cardemon_pack
+ display_name = "cardemon booster pack"
+ path = /obj/item/weapon/pack/cardemon
+
+/datum/gear/spaceball_pack
+ display_name = "spaceball booster pack"
+ path = /obj/item/weapon/pack/spaceball
+
+/datum/gear/flask
+ display_name = "flask"
+ path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
+
+/datum/gear/flask/New()
+ ..()
+ gear_tweaks += new/datum/gear_tweak/reagents(lunchables_ethanol_reagents())
+
+/datum/gear/vacflask
+ display_name = "vacuum-flask"
+ path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask
+
+/datum/gear/vacflask/New()
+ ..()
+ gear_tweaks += new/datum/gear_tweak/reagents(lunchables_drink_reagents())
+
+/datum/gear/boot_knife
+ display_name = "boot knife"
+ path = /obj/item/weapon/material/kitchen/utensil/knife/boot
+ cost = 3
+
+/datum/gear/cape
+ display_name = "tunnel cloak"
+ path = /obj/item/weapon/storage/backpack/cloak
+ cost = 1
+
+/datum/gear/lunchbox
+ display_name = "lunchbox"
+ description = "A little lunchbox."
+ cost = 2
+ path = /obj/item/weapon/storage/toolbox/lunchbox
+
+/datum/gear/lunchbox/New()
+ ..()
+ var/list/lunchboxes = list()
+ for(var/lunchbox_type in typesof(/obj/item/weapon/storage/toolbox/lunchbox))
+ var/obj/item/weapon/storage/toolbox/lunchbox/lunchbox = lunchbox_type
+ if(!initial(lunchbox.filled))
+ lunchboxes[initial(lunchbox.name)] = lunchbox_type
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(lunchboxes))
+ gear_tweaks += new/datum/gear_tweak/contents(lunchables_lunches(), lunchables_snacks(), lunchables_drinks())
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
new file mode 100644
index 00000000000..3680312c54f
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
@@ -0,0 +1,25 @@
+/datum/gear/gloves
+ display_name = "watch"
+ path = /obj/item/clothing/gloves/watch
+ cost = 2
+ slot = slot_gloves
+ sort_category = "Gloves and Handwear"
+
+/datum/gear/gloves/color
+ display_name = "gloves selection"
+ path = /obj/item/clothing/gloves/black
+
+/datum/gear/gloves/color/New()
+ ..()
+ var/gloves = list()
+ gloves["black gloves"] = /obj/item/clothing/gloves
+ gloves["red gloves"] = /obj/item/clothing/gloves/red
+ gloves["blue gloves"] = /obj/item/clothing/gloves/blue
+ gloves["orange gloves"] = /obj/item/clothing/gloves/orange
+ gloves["purple gloves"] = /obj/item/clothing/gloves/purple
+ gloves["brown gloves"] = /obj/item/clothing/gloves/brown
+ gloves["light-brown gloves"] = /obj/item/clothing/gloves/light_brown
+ gloves["white gloves"] = /obj/item/clothing/gloves/green
+ gloves["grey gloves"] = /obj/item/clothing/gloves/grey
+ gloves["rainbow gloves"] = /obj/item/clothing/gloves/rainbow
+ gear_tweaks += new/datum/gear_tweak/path(gloves)
diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm
new file mode 100644
index 00000000000..081b6536564
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_head.dm
@@ -0,0 +1,113 @@
+/datum/gear/head
+ display_name = "hat, boatsman"
+ path = /obj/item/clothing/head/boaterhat
+ slot = slot_head
+ sort_category = "Hats and Headwear"
+
+/datum/gear/head/bandana
+ display_name = "bandana selection"
+ path = /obj/item/clothing/head/bandana
+
+/datum/gear/head/bandana/New()
+ ..()
+ var/bandanas = list()
+ bandanas["green bandana"] = /obj/item/clothing/head/greenbandana
+ bandanas["orange bandana"] = /obj/item/clothing/head/orangebandana
+ bandanas["pirate bandana"] = /obj/item/clothing/head/bandana
+ gear_tweaks += new/datum/gear_tweak/path(bandanas)
+
+/datum/gear/head/cap
+ display_name = "cap selection"
+ path = /obj/item/clothing/head/soft/blue
+
+/datum/gear/head/cap/New()
+ ..()
+ var/caps = list()
+ caps["blue cap"] = /obj/item/clothing/head/soft/blue
+ caps["flat cap"] = /obj/item/clothing/head/flatcap
+ caps["green cap"] = /obj/item/clothing/head/soft/green
+ caps["grey cap"] = /obj/item/clothing/head/soft/grey
+ caps["mailman cap"] = /obj/item/clothing/head/mailman
+ caps["orange cap"] = /obj/item/clothing/head/soft/orange
+ caps["purple cap"] = /obj/item/clothing/head/soft/purple
+ caps["rainbow cap"] = /obj/item/clothing/head/soft/rainbow
+ caps["red cap"] = /obj/item/clothing/head/soft/red
+ caps["white cap"] = /obj/item/clothing/head/soft/mime
+ caps["yellow cap"] = /obj/item/clothing/head/soft/yellow
+ gear_tweaks += new/datum/gear_tweak/path(caps)
+
+/datum/gear/head/beret
+ display_name = "beret, red"
+ path = /obj/item/clothing/head/beret
+
+/datum/gear/head/beret/eng
+ display_name = "beret, engie-orange"
+ path = /obj/item/clothing/head/beret/engineering
+ allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
+
+/datum/gear/head/beret/purp
+ display_name = "beret, purple"
+ path = /obj/item/clothing/head/beret/purple
+
+/datum/gear/head/beret/sec
+ display_name = "beret,security"
+ path = /obj/item/clothing/head/beret/sec
+ allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
+
+/datum/gear/head/beret/warden
+ display_name = "beret,security (warden)"
+ path = /obj/item/clothing/head/beret/sec/warden
+ allowed_roles = list("Head of Security","Warden")
+
+/datum/gear/head/beret/hos
+ display_name = "beret,security (head of security)"
+ path = /obj/item/clothing/head/beret/sec/hos
+ allowed_roles = list("Head of Security")
+
+/datum/gear/head/cap/corp
+ display_name = "cap, corporate (security)"
+ path = /obj/item/clothing/head/soft/sec/corp
+ allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
+
+/datum/gear/head/cap/sec
+ display_name = "cap, security"
+ path = /obj/item/clothing/head/soft/sec
+ allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
+
+/datum/gear/head/hardhat
+ display_name = "hardhat, yellow"
+ path = /obj/item/clothing/head/hardhat
+ allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
+
+/datum/gear/head/hardhat/New()
+ ..()
+ var/hardhat = list()
+ hardhat["hardhat, yellow"] = /obj/item/clothing/head/hardhat
+ hardhat["hardhat, blue"] = /obj/item/clothing/head/hardhat/dblue
+ hardhat["hardhat, orange"] = /obj/item/clothing/head/hardhat/orange
+ hardhat["hardhat, red"] = /obj/item/clothing/head/hardhat/red
+ gear_tweaks += new/datum/gear_tweak/path(hardhat)
+
+/datum/gear/head/hairflower
+ display_name = "hair flower pin, red"
+ path = /obj/item/clothing/head/hairflower
+
+/datum/gear/head/bowler
+ display_name = "hat, bowler"
+ path = /obj/item/clothing/head/bowler
+
+/datum/gear/head/fez
+ display_name = "hat, fez"
+ path = /obj/item/clothing/head/fez
+
+/datum/gear/head/tophat
+ display_name = "hat, tophat"
+ path = /obj/item/clothing/head/that
+
+/datum/gear/head/philosopher_wig
+ display_name = "natural philosopher's wig"
+ path = /obj/item/clothing/head/philosopher_wig
+
+/datum/gear/head/ushanka
+ display_name = "ushanka"
+ path = /obj/item/clothing/head/ushanka
diff --git a/code/modules/client/preference_setup/loadout/loadout_mask.dm b/code/modules/client/preference_setup/loadout/loadout_mask.dm
new file mode 100644
index 00000000000..c6342904f67
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_mask.dm
@@ -0,0 +1,5 @@
+// Mask
+/datum/gear/mask
+ display_name = "sterile mask"
+ path = /obj/item/clothing/mask/surgical
+ cost = 2
diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm
new file mode 100644
index 00000000000..473714a5b81
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm
@@ -0,0 +1,45 @@
+// Shoelocker
+/datum/gear/shoes
+ display_name = "jackboots"
+ path = /obj/item/clothing/shoes/jackboots
+ slot = slot_shoes
+ sort_category = "Shoes and Footwear"
+
+/datum/gear/shoes/toeless
+ display_name = "toe-less jackboots"
+ path = /obj/item/clothing/shoes/jackboots/unathi
+
+/datum/gear/shoes/workboots
+ display_name = "workboots"
+ path = /obj/item/clothing/shoes/workboots
+
+/datum/gear/shoes/sandals
+ display_name = "sandals"
+ path = /obj/item/clothing/shoes/sandal
+
+/datum/gear/shoes/color
+ display_name = "shoe selection"
+ path = /obj/item/clothing/shoes/black
+
+/datum/gear/shoes/color/New()
+ ..()
+ var/shoes = list()
+ shoes["black shoes"] = /obj/item/clothing/shoes/black
+ shoes["blue shoes"] = /obj/item/clothing/shoes/blue
+ shoes["brown shoes"] = /obj/item/clothing/shoes/brown
+ shoes["green shoes"] = /obj/item/clothing/shoes/green
+ shoes["orange shoes"] = /obj/item/clothing/shoes/orange
+ shoes["purple shoes"] = /obj/item/clothing/shoes/purple
+ shoes["rainbow shoes"] = /obj/item/clothing/shoes/rainbow
+ shoes["red shoes"] = /obj/item/clothing/shoes/red
+ shoes["white shoes"] = /obj/item/clothing/shoes/white
+ shoes["yellow shoes"] = /obj/item/clothing/shoes/yellow
+ gear_tweaks += new/datum/gear_tweak/path(shoes)
+
+/datum/gear/shoes/dress
+ display_name = "shoes, dress"
+ path = /obj/item/clothing/shoes/laceup
+
+/datum/gear/shoes/leather
+ display_name = "shoes, leather"
+ path = /obj/item/clothing/shoes/leather
diff --git a/code/modules/client/preference_setup/loadout/loadout_smoking.dm b/code/modules/client/preference_setup/loadout/loadout_smoking.dm
new file mode 100644
index 00000000000..d41c0d44c18
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_smoking.dm
@@ -0,0 +1,27 @@
+/datum/gear/smokingpipe
+ display_name = "pipe, smoking"
+ path = /obj/item/clothing/mask/smokable/pipe
+
+/datum/gear/cornpipe
+ display_name = "pipe, corn"
+ path = /obj/item/clothing/mask/smokable/pipe/cobpipe
+
+/datum/gear/matchbook
+ display_name = "matchbook"
+ path = /obj/item/weapon/storage/box/matches
+
+/datum/gear/zippo
+ display_name = "zippo"
+ path = /obj/item/weapon/flame/lighter/zippo
+
+/datum/gear/cigarcase
+ display_name = "cigar case"
+ path = /obj/item/weapon/storage/fancy/cigar
+
+/datum/gear/cigarette
+ display_name = "cigarette packet"
+ path = /obj/item/weapon/storage/fancy/cigarettes
+
+/datum/gear/dromedaryco
+ display_name = "dromedaryco cigarette packet"
+ path = /obj/item/weapon/storage/fancy/cigarettes/dromedaryco
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
new file mode 100644
index 00000000000..2973900b7c2
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -0,0 +1,129 @@
+// Suit slot
+/datum/gear/suit
+ display_name = "apron, blue"
+ path = /obj/item/clothing/suit/apron
+ slot = slot_wear_suit
+ sort_category = "Suits and Overwear"
+ cost = 2
+
+/datum/gear/suit/leather
+ display_name = "jacket selection"
+ path = /obj/item/clothing/suit/storage/leather_jacket
+
+/datum/gear/suit/leather/New()
+ ..()
+ var/jackets = list()
+ jackets["bomber jacket"] = /obj/item/clothing/suit/storage/toggle/bomber
+ jackets["corporate black jacket"] = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen
+ jackets["corporate brown jacket"] = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen
+ jackets["black jacket"] = /obj/item/clothing/suit/storage/leather_jacket
+ jackets["brown jacket"] = /obj/item/clothing/suit/storage/toggle/brown_jacket
+ gear_tweaks += new/datum/gear_tweak/path(jackets)
+
+/datum/gear/suit/hazard_vest
+ display_name = "hazard vest"
+ path = /obj/item/clothing/suit/storage/hazardvest
+
+/datum/gear/suit/hoodie
+ display_name = "hoodie, grey"
+ path = /obj/item/clothing/suit/storage/toggle/hoodie
+
+/datum/gear/suit/hoodie/black
+ display_name = "hoodie, black"
+ path = /obj/item/clothing/suit/storage/toggle/hoodie/black
+
+/datum/gear/suit/labcoat
+ display_name = "labcoat selection"
+ path = /obj/item/clothing/suit/storage/toggle/labcoat
+
+/datum/gear/suit/labcoat/New()
+ ..()
+ var/labcoat = list()
+ labcoat["labcoat"] = /obj/item/clothing/suit/storage/toggle/labcoat
+ labcoat["labcoat, blue"] = /obj/item/clothing/suit/storage/toggle/labcoat/blue
+ labcoat["labcoat, green"] = /obj/item/clothing/suit/storage/toggle/labcoat/green
+ labcoat["labcoat, orange"] = /obj/item/clothing/suit/storage/toggle/labcoat/orange
+ labcoat["labcoat, purple"] = /obj/item/clothing/suit/storage/toggle/labcoat/purple
+ labcoat["labcoat, red"] = /obj/item/clothing/suit/storage/toggle/labcoat/red
+ gear_tweaks += new/datum/gear_tweak/path(labcoat)
+
+/datum/gear/suit/overalls
+ display_name = "overalls"
+ path = /obj/item/clothing/suit/apron/overalls
+ cost = 1
+
+/datum/gear/suit/poncho
+ display_name = "poncho selection"
+ path = /obj/item/clothing/suit/poncho
+ cost = 1
+
+/datum/gear/suit/poncho/New()
+ ..()
+ var/poncho = list()
+ poncho["poncho, tan"] = /obj/item/clothing/suit/poncho
+ poncho["poncho, blue"] = /obj/item/clothing/suit/poncho/blue
+ poncho["poncho, green"] = /obj/item/clothing/suit/poncho/green
+ poncho["poncho, purple"] = /obj/item/clothing/suit/poncho/purple
+ poncho["poncho, red"] = /obj/item/clothing/suit/poncho/red
+ gear_tweaks += new/datum/gear_tweak/path(poncho)
+
+/datum/gear/suit/blue_lawyer_jacket
+ display_name = "suit jacket, blue"
+ path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket
+
+/datum/gear/suit/purple_lawyer_jacket
+ display_name = "suit jacket, purple"
+ path = /obj/item/clothing/suit/storage/lawyer/purpjacket
+
+/datum/gear/suit/track_jacket
+ display_name = "track jacket"
+ path = /obj/item/clothing/suit/storage/toggle/tracksuit
+
+/datum/gear/suit/winter
+ display_name = "winter coat"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat
+
+/datum/gear/suit/winter/captain
+ display_name = "winter coat, captain"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain
+ allowed_roles = list("Captain")
+
+/datum/gear/suit/winter/security
+ display_name = "winter coat, security"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/security
+ allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
+
+/datum/gear/suit/winter/science
+ display_name = "winter coat, science"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/science
+ allowed_roles = list("Research Director","Scientist","Xenobiologist","Roboticist","Lab Assistant","Geneticist")
+
+/datum/gear/suit/winter/medical
+ display_name = "winter coat, medical"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Paramedic","Nursing Intern","Psychiatrist","Chemist",)
+
+/datum/gear/suit/winter/engineering
+ display_name = "winter coat, engineering"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering
+ allowed_roles = list("Station Engineer","Chief Engineer","Engineering Apprentice")
+
+/datum/gear/suit/winter/atmos
+ display_name = "winter coat, atmospherics"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
+ allowed_roles = list("Atmospheric Technician","Chief Engineer")
+
+/datum/gear/suit/winter/hydro
+ display_name = "winter coat, hydroponics"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/hydro
+ allowed_roles = list("Head of Personnel","Gardener")
+
+/datum/gear/suit/winter/cargo
+ display_name = "winter coat, cargo"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo
+ allowed_roles = list("Cargo Technician","Quartermaster","Head of Personnel")
+
+/datum/gear/suit/winter/mining
+ display_name = "winter coat, mining"
+ path = /obj/item/clothing/suit/storage/hooded/wintercoat/miner
+ allowed_roles = list("Quartermaster","Head of Personnel","Shaft Miner")
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
new file mode 100644
index 00000000000..22705c17560
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm
@@ -0,0 +1,150 @@
+// Uniform slot
+/datum/gear/uniform
+ display_name = "blazer, blue"
+ path = /obj/item/clothing/under/blazer
+ slot = slot_w_uniform
+ sort_category = "Uniforms and Casual Dress"
+
+/datum/gear/uniform/cheongsam
+ display_name = "cheongsam, white"
+ path = /obj/item/clothing/under/cheongsam
+
+/datum/gear/uniform/kilt
+ display_name = "kilt"
+ path = /obj/item/clothing/under/kilt
+
+/datum/gear/uniform/jumpskirt
+ display_name = "jumpskirt, black"
+ path = /obj/item/clothing/under/blackjumpskirt
+
+/datum/gear/uniform/jumpsuit
+ display_name = "generic jumpsuits"
+ path = /obj/item/clothing/under/color/grey
+
+/datum/gear/uniform/jumpsuit/New()
+ ..()
+ var/jumpsuit = list()
+ jumpsuit["grey jumpsuit"] = /obj/item/clothing/under/color/grey
+ jumpsuit["black jumpsuit"] = /obj/item/clothing/under/color/black
+ jumpsuit["blue jumpsuit"] = /obj/item/clothing/under/color/blue
+ jumpsuit["green jumpsuit"] = /obj/item/clothing/under/color/green
+ jumpsuit["orange jumpsuit"] = /obj/item/clothing/under/color/orange
+ jumpsuit["pink jumpsuit"] = /obj/item/clothing/under/color/pink
+ jumpsuit["red jumpsuit"] = /obj/item/clothing/under/color/red
+ jumpsuit["white jumpsuit"] = /obj/item/clothing/under/color/white
+ jumpsuit["yellow jumpsuit"] = /obj/item/clothing/under/color/yellow
+ jumpsuit["light blue jumpsuit"] = /obj/item/clothing/under/lightblue
+ jumpsuit["aqua jumpsuit"] = /obj/item/clothing/under/aqua
+ jumpsuit["purple jumpsuit"] = /obj/item/clothing/under/purple
+ jumpsuit["light purple jumpsuit"] = /obj/item/clothing/under/lightpurple
+ jumpsuit["light green jumpsuit"] = /obj/item/clothing/under/lightgreen
+ jumpsuit["brown jumpsuit"] = /obj/item/clothing/under/brown
+ jumpsuit["light brown jumpsuit"] = /obj/item/clothing/under/lightbrown
+ jumpsuit["yellow green jumpsuit"] = /obj/item/clothing/under/yellowgreen
+ jumpsuit["light red jumpsuit"] = /obj/item/clothing/under/lightred
+ jumpsuit["dark red jumpsuit"] = /obj/item/clothing/under/darkred
+ gear_tweaks += new/datum/gear_tweak/path(jumpsuit)
+
+/datum/gear/uniform/skirt
+ display_name = "plaid skirt, blue"
+ path = /obj/item/clothing/under/dress/plaid_blue
+
+/datum/gear/uniform/skirt/purple
+ display_name = "plaid skirt, purple"
+ path = /obj/item/clothing/under/dress/plaid_purple
+
+/datum/gear/uniform/skirt/red
+ display_name = "plaid skirt, red"
+ path = /obj/item/clothing/under/dress/plaid_red
+
+/datum/gear/uniform/suit
+ display_name = "suit selection"
+ path = /obj/item/clothing/under/lawyer/bluesuit
+
+/datum/gear/uniform/suit/New()
+ ..()
+ var/suits = list()
+ suits["amish suit"] = /obj/item/clothing/under/sl_suit
+ suits["black suit"] = /obj/item/clothing/under/suit_jacket
+ suits["blue suit"] = /obj/item/clothing/under/lawyer/blue
+ suits["burgundy suit"] = /obj/item/clothing/under/suit_jacket/burgundy
+ suits["charcoal suit"] = /obj/item/clothing/under/suit_jacket/charcoal
+ suits["checkered suit"] = /obj/item/clothing/under/suit_jacket/checkered
+ suits["executive suit"] = /obj/item/clothing/under/suit_jacket/really_black
+ suits["female executive suit"] = /obj/item/clothing/under/suit_jacket/female
+ suits["gentleman suit"] = /obj/item/clothing/under/gentlesuit
+ suits["navy suit"] = /obj/item/clothing/under/suit_jacket/navy
+ suits["old man suit"] = /obj/item/clothing/under/lawyer/oldman
+ suits["purple suit"] = /obj/item/clothing/under/lawyer/purpsuit
+ suits["red suit"] = /obj/item/clothing/under/suit_jacket/red
+ suits["red lawyer suit"] = /obj/item/clothing/under/lawyer/red
+ suits["shiny black suit"] = /obj/item/clothing/under/lawyer/black
+ suits["tan suit"] = /obj/item/clothing/under/suit_jacket/tan
+ suits["white suit"] = /obj/item/clothing/under/scratch
+ suits["white-blue suit"] = /obj/item/clothing/under/lawyer/bluesuit
+ gear_tweaks += new/datum/gear_tweak/path(suits)
+
+/datum/gear/uniform/scrubs
+ display_name = "scrubs selection"
+ path = /obj/item/clothing/under/rank/medical/black
+ allowed_roles = list("Scientist","Chief Medical Officer","Medical Doctor","Geneticist","Paramedic","Nursing Intern","Xenobiologist","Roboticist","Research Director","Detective",)
+
+/datum/gear/uniform/scrubs/New()
+ ..()
+ var/scrubs = list()
+ scrubs["scrubs, black"] = /obj/item/clothing/under/rank/medical/black
+ scrubs["scrubs, blue"] = /obj/item/clothing/under/rank/medical/blue
+ scrubs["scrubs, green"] = /obj/item/clothing/under/rank/medical/green
+ scrubs["scrubs, purple"] = /obj/item/clothing/under/rank/medical/purple
+ gear_tweaks += new/datum/gear_tweak/path(scrubs)
+
+/datum/gear/uniform/sundress
+ display_name = "sundress"
+ path = /obj/item/clothing/under/sundress
+
+/datum/gear/uniform/sundress/white
+ display_name = "sundress, white"
+ path = /obj/item/clothing/under/sundress_white
+
+/datum/gear/uniform/dress_fire
+ display_name = "flame dress"
+ path = /obj/item/clothing/under/dress/dress_fire
+
+/datum/gear/uniform/uniform_captain
+ display_name = "uniform, captain's dress"
+ path = /obj/item/clothing/under/dress/dress_cap
+ allowed_roles = list("Captain")
+
+/datum/gear/uniform/corpsecsuit
+ display_name = "uniform, corporate (Security)"
+ path = /obj/item/clothing/under/rank/security/corp
+ allowed_roles = list("Security Officer","Head of Security","Warden")
+
+/datum/gear/uniform/uniform_hop
+ display_name = "uniform, HoP's dress"
+ path = /obj/item/clothing/under/dress/dress_hop
+ allowed_roles = list("Head of Personnel")
+
+/datum/gear/uniform/uniform_hr
+ display_name = "uniform, HR director (HoP)"
+ path = /obj/item/clothing/under/dress/dress_hr
+ allowed_roles = list("Head of Personnel")
+
+/datum/gear/uniform/navysecsuit
+ display_name = "uniform, navyblue (Security)"
+ path = /obj/item/clothing/under/rank/security/navyblue
+ allowed_roles = list("Security Officer","Head of Security","Warden")
+
+/datum/gear/uniform/gearharness
+ display_name = "gear harness"
+ path = /obj/item/clothing/under/gearharness
+ cost = 2
+
+/datum/gear/uniform/track_pants
+ display_name = "track pants"
+ path = /obj/item/clothing/under/track
+
+/datum/gear/uniform/turtleneck
+ display_name = "tacticool turtleneck"
+ path = /obj/item/clothing/under/syndicate/tacticool
+
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
new file mode 100644
index 00000000000..6fd34e628c3
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -0,0 +1,55 @@
+/datum/gear/utility
+ display_name = "briefcase"
+ path = /obj/item/weapon/storage/briefcase
+ sort_category = "Utility"
+
+/datum/gear/utility/secure
+ display_name = "secure briefcase"
+ path = /obj/item/weapon/storage/secure/briefcase
+ cost = 2
+
+/datum/gear/utility/clipboard
+ display_name = "clipboard"
+ path = /obj/item/weapon/clipboard
+
+/datum/gear/utility/folder
+ display_name = "folders"
+ path = /obj/item/weapon/folder
+
+/datum/gear/utility/folder/New()
+ ..()
+ var/folders = list()
+ folders["blue folder"] = /obj/item/weapon/folder/blue
+ folders["grey folder"] = /obj/item/weapon/folder
+ folders["red folder"] = /obj/item/weapon/folder/red
+ folders["white folder"] = /obj/item/weapon/folder/white
+ folders["yellow folder"] = /obj/item/weapon/folder/yellow
+ gear_tweaks += new/datum/gear_tweak/path(folders)
+
+/datum/gear/utility/paicard
+ display_name = "personal AI device"
+ path = /obj/item/device/paicard
+
+/datum/gear/utility/wallet
+ display_name = "wallet"
+ path = /obj/item/weapon/storage/wallet
+
+/*
+/datum/gear/utility/cheaptablet
+ display_name = "cheap tablet computer"
+ path = /obj/item/modular_computer/tablet/preset/custom_loadout/cheap
+ cost = 3
+
+/datum/gear/utility/normaltablet
+ display_name = "tablet computer"
+ path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
+ cost = 4
+*/
+
+/datum/gear/utility/recorder
+ display_name = "universal recorder"
+ path = /obj/item/device/taperecorder
+
+/datum/gear/utility/camera
+ display_name = "camera"
+ path = /obj/item/device/camera
diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm
new file mode 100644
index 00000000000..6ee001c5ace
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm
@@ -0,0 +1,108 @@
+//unathi clothing
+
+/datum/gear/suit/unathi_mantle
+ display_name = "hide mantle (Unathi)"
+ path = /obj/item/clothing/suit/unathi/mantle
+ cost = 1
+ whitelisted = "Unathi"
+ sort_category = "Xenowear"
+
+/datum/gear/suit/unathi_robe
+ display_name = "roughspun robe (Unathi)"
+ path = /obj/item/clothing/suit/unathi/robe
+ cost = 1
+ whitelisted = "Unathi"
+ sort_category = "Xenowear"
+
+//skrell headtail adorns
+
+/datum/gear/ears/f_skrell
+ display_name = "headtail-wear, female (Skrell)"
+ path = /obj/item/clothing/ears/skrell/chain
+ sort_category = "Xenowear"
+ whitelisted = "Skrell"
+
+/datum/gear/ears/f_skrell/New()
+ ..()
+ var/f_chains = list()
+ f_chains["headtail chains"] = /obj/item/clothing/ears/skrell/chain
+ f_chains["headtail cloth"] = /obj/item/clothing/ears/skrell/cloth_female
+ f_chains["red-jeweled chain"] = /obj/item/clothing/ears/skrell/redjewel_chain
+ f_chains["ebony chain"] = /obj/item/clothing/ears/skrell/ebony_chain
+ f_chains["blue-jeweled chain"] = /obj/item/clothing/ears/skrell/bluejeweled_chain
+ f_chains["silver chain"] = /obj/item/clothing/ears/skrell/silver_chain
+ f_chains["blue cloth"] = /obj/item/clothing/ears/skrell/blue_skrell_cloth_band_female
+ gear_tweaks += new/datum/gear_tweak/path(f_chains)
+
+/datum/gear/ears/m_skrell
+ display_name = "headtail-wear, male (Skrell)"
+ path = /obj/item/clothing/ears/skrell/band
+ sort_category = "Xenowear"
+ whitelisted = "Skrell"
+
+/datum/gear/ears/m_skrell/New()
+ ..()
+ var/m_chains = list()
+ m_chains["headtail bands"] = /obj/item/clothing/ears/skrell/chain
+ m_chains["headtail cloth"] = /obj/item/clothing/ears/skrell/cloth_male
+ m_chains["red-jeweled bands"] = /obj/item/clothing/ears/skrell/redjeweled_band
+ m_chains["ebony bands"] = /obj/item/clothing/ears/skrell/ebony_band
+ m_chains["blue-jeweled bands"] = /obj/item/clothing/ears/skrell/bluejeweled_band
+ m_chains["silver bands"] = /obj/item/clothing/ears/skrell/silver_band
+ m_chains["blue cloth"] = /obj/item/clothing/ears/skrell/blue_skrell_cloth_band_male
+ gear_tweaks += new/datum/gear_tweak/path(m_chains)
+
+//vaurca items
+
+/datum/gear/eyes/blindfold
+ display_name = "vaurca blindfold (Vaurca)"
+ path = /obj/item/clothing/glasses/sunglasses/blinders
+ cost = 2
+ whitelisted = "Vaurca"
+ sort_category = "Xenowear"
+
+/datum/gear/mask/vaurca
+ display_name = "mandible garment (Vaurca)"
+ path = /obj/item/clothing/mask/breath/vaurca
+ cost = 1
+ whitelisted = "Vaurca"
+ sort_category = "Xenowear"
+
+//beastmen gloves
+
+/datum/gear/gloves/unathi
+ display_name = "gloves selection (Unathi)"
+ path = /obj/item/clothing/gloves/black/unathi
+ whitelisted = "Unathi"
+ sort_category = "Xenowear"
+
+/datum/gear/gloves/unathi/New()
+ ..()
+ var/un_gloves = list()
+ un_gloves["black gloves"] = /obj/item/clothing/gloves/black/unathi
+ un_gloves["red gloves"] = /obj/item/clothing/gloves/red/unathi
+ un_gloves["blue gloves"] = /obj/item/clothing/gloves/blue/unathi
+ un_gloves["orange gloves"] = /obj/item/clothing/gloves/orange/unathi
+ un_gloves["purple gloves"] = /obj/item/clothing/gloves/purple/unathi
+ un_gloves["brown gloves"] = /obj/item/clothing/gloves/brown/unathi
+ un_gloves["green gloves"] = /obj/item/clothing/gloves/green/unathi
+ un_gloves["white gloves"] = /obj/item/clothing/gloves/white/unathi
+ gear_tweaks += new/datum/gear_tweak/path(un_gloves)
+
+/datum/gear/gloves/tajara
+ display_name = "gloves selection (Tajara)"
+ path = /obj/item/clothing/gloves/black/tajara
+ whitelisted = "Tajara"
+ sort_category = "Xenowear"
+
+/datum/gear/gloves/tajara/New()
+ ..()
+ var/taj_gloves = list()
+ taj_gloves["black gloves"] = /obj/item/clothing/gloves/black/tajara
+ taj_gloves["red gloves"] = /obj/item/clothing/gloves/red/tajara
+ taj_gloves["blue gloves"] = /obj/item/clothing/gloves/blue/tajara
+ taj_gloves["orange gloves"] = /obj/item/clothing/gloves/orange/tajara
+ taj_gloves["purple gloves"] = /obj/item/clothing/gloves/purple/tajara
+ taj_gloves["brown gloves"] = /obj/item/clothing/gloves/brown/tajara
+ taj_gloves["white gloves"] = /obj/item/clothing/gloves/green/tajara
+ gear_tweaks += new/datum/gear_tweak/path(taj_gloves)
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index 237c4fa0a78..99af44e65eb 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -27,6 +27,11 @@
sort_order = 4
category_item_type = /datum/category_item/player_setup_item/antagonism
+/datum/category_group/player_setup_category/loadout_preferences
+ name = "Loadout"
+ sort_order = 5
+ category_item_type = /datum/category_item/player_setup_item/loadout
+
/datum/category_group/player_setup_category/global_preferences
name = "Global"
sort_order = 5
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
deleted file mode 100644
index d355926c873..00000000000
--- a/code/modules/client/preferences_gear.dm
+++ /dev/null
@@ -1,1546 +0,0 @@
-var/global/list/gear_datums = list()
-
-/hook/startup/proc/populate_gear_list()
- var/list/sort_categories = list(
- "[slot_head]" = list(),
- "ears" = list(),
- "[slot_glasses]" = list(),
- "[slot_wear_mask]" = list(),
- "[slot_w_uniform]" = list(),
- "[slot_tie]" = list(),
- "[slot_wear_suit]" = list(),
- "[slot_gloves]" = list(),
- "[slot_shoes]" = list(),
- "utility" = list(),
- "misc" = list(),
- "unknown" = list()
- )
-
- //create a list of gear datums to sort
- for(var/type in typesof(/datum/gear)-/datum/gear)
- var/datum/gear/G = type
- if(!initial(G.display_name))
- error("Loadout - Missing display name: [G]")
- continue
- if(!initial(G.cost))
- error("Loadout - Missing cost: [G]")
- continue
- if(!initial(G.path))
- error("Loadout - Missing path definition: [G]")
- continue
- G = new G()
-
- var/category = (G.sort_category in sort_categories)? G.sort_category : "unknown"
- sort_categories[category][G.display_name] = G
-
- for (var/category in sort_categories)
- gear_datums.Add(sortAssoc(sort_categories[category]))
-
- return 1
-
-/datum/gear
- var/display_name //Name/index. Must be unique.
- var/path //Path to item.
- var/cost //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
- var/slot //Slot to equip to.
- var/list/allowed_roles //Roles that can spawn with this item.
- var/whitelisted //Term to check the whitelist for..
- var/sort_category
-
-/datum/gear/New()
- ..()
- if (!sort_category)
- sort_category = "[slot]"
-
-// This is sorted both by slot and alphabetically! Don't fuck it up!
-// Headslot items
-
-/datum/gear/gbandana
- display_name = "bandana, green"
- path = /obj/item/clothing/head/greenbandana
- cost = 1
- slot = slot_head
-
-/datum/gear/obandana
- display_name = "bandana, orange"
- path = /obj/item/clothing/head/orangebandana
- cost = 1
- slot = slot_head
-
-/datum/gear/bandana
- display_name = "bandana, pirate-red"
- path = /obj/item/clothing/head/bandana
- cost = 1
- slot = slot_head
-
-/datum/gear/bsec_beret
- display_name = "beret, navy (officer)"
- path = /obj/item/clothing/head/beret/sec
- cost = 1
- slot = slot_head
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-/datum/gear/bsec_beret_warden
- display_name = "beret, navy (warden)"
- path = /obj/item/clothing/head/beret/sec/warden
- cost = 1
- slot = slot_head
- allowed_roles = list("Head of Security","Warden")
-
-/datum/gear/bsec_beret_hos
- display_name = "beret, navy (hos)"
- path = /obj/item/clothing/head/beret/sec/hos
- cost = 1
- slot = slot_head
- allowed_roles = list("Head of Security")
-
-/datum/gear/eng_beret
- display_name = "beret, engie-orange"
- path = /obj/item/clothing/head/beret/engineering
- cost = 1
- slot = slot_head
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/purp_beret
- display_name = "beret, purple"
- path = /obj/item/clothing/head/beret/purple
- cost = 1
- slot = slot_head
-
-/datum/gear/red_beret
- display_name = "beret, red"
- path = /obj/item/clothing/head/beret
- cost = 1
- slot = slot_head
-
-/datum/gear/sec_beret
- display_name = "beret, security"
- path = /obj/item/clothing/head/beret/sec
- cost = 1
- slot = slot_head
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-/datum/gear/bcap
- display_name = "cap, blue"
- path = /obj/item/clothing/head/soft/blue
- cost = 1
- slot = slot_head
-
-/datum/gear/mailman
- display_name = "cap, blue station"
- path = /obj/item/clothing/head/mailman
- cost = 1
- slot = slot_head
-
-/datum/gear/flatcap
- display_name = "cap, brown-flat"
- path = /obj/item/clothing/head/flatcap
- cost = 1
- slot = slot_head
-
-/datum/gear/corpcap
- display_name = "cap, corporate (Security)"
- path = /obj/item/clothing/head/soft/sec/corp
- cost = 1
- slot = slot_head
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-/datum/gear/gcap
- display_name = "cap, green"
- path = /obj/item/clothing/head/soft/green
- cost = 1
- slot = slot_head
-
-/datum/gear/grcap
- display_name = "cap, grey"
- path = /obj/item/clothing/head/soft/grey
- cost = 1
- slot = slot_head
-
-/datum/gear/ocap
- display_name = "cap, orange"
- path = /obj/item/clothing/head/soft/orange
- cost = 1
- slot = slot_head
-
-/datum/gear/purcap
- display_name = "cap, purple"
- path = /obj/item/clothing/head/soft/purple
- cost = 1
- slot = slot_head
-
-/datum/gear/raincap
- display_name = "cap, rainbow"
- path = /obj/item/clothing/head/soft/rainbow
- cost = 1
- slot = slot_head
-
-/datum/gear/rcap
- display_name = "cap, red"
- path = /obj/item/clothing/head/soft/red
- cost = 1
- slot = slot_head
-
-/datum/gear/ycap
- display_name = "cap, yellow"
- path = /obj/item/clothing/head/soft/yellow
- cost = 1
- slot = slot_head
-
-/datum/gear/wcap
- display_name = "cap, white"
- path = /obj/item/clothing/head/soft/mime
- cost = 1
- slot = slot_head
-
-/datum/gear/hairflower
- display_name = "hair flower pin"
- path = /obj/item/clothing/head/hairflower
- cost = 1
- slot = slot_head
-
-/datum/gear/dbhardhat
- display_name = "hardhat, blue"
- path = /obj/item/clothing/head/hardhat/dblue
- cost = 2
- slot = slot_head
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/ohardhat
- display_name = "hardhat, orange"
- path = /obj/item/clothing/head/hardhat/orange
- cost = 2
- slot = slot_head
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/rhardhat
- display_name = "hardhat, red"
- path = /obj/item/clothing/head/hardhat/red
- cost = 2
- slot = slot_head
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/yhardhat
- display_name = "hardhat, yellow"
- path = /obj/item/clothing/head/hardhat
- cost = 2
- slot = slot_head
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/boater
- display_name = "hat, boatsman"
- path = /obj/item/clothing/head/boaterhat
- cost = 1
- slot = slot_head
-
-/datum/gear/bowler
- display_name = "hat, bowler"
- path = /obj/item/clothing/head/bowler
- cost = 1
- slot = slot_head
-
-/datum/gear/fez
- display_name = "hat, fez"
- path = /obj/item/clothing/head/fez
- cost = 1
- slot = slot_head
-
-/datum/gear/tophat
- display_name = "hat, tophat"
- path = /obj/item/clothing/head/that
- cost = 1
- slot = slot_head
-
-// Wig by Earthcrusher, blame him.
-/datum/gear/philosopher_wig
- display_name = "natural philosopher's wig"
- path = /obj/item/clothing/head/philosopher_wig
- cost = 1
- slot = slot_head
-
-/datum/gear/ushanka
- display_name = "ushanka"
- path = /obj/item/clothing/head/ushanka
- cost = 1
- slot = slot_head
-
-//lol fuck bay ~LordFowl
-/datum/gear/zhan_scarf
- display_name = "Zhan headscarf"
- path = /obj/item/clothing/head/tajaran/scarf
- cost = 1
- slot = slot_head
- whitelisted = "Tajara"
-
-// Eyes
-
-/datum/gear/eyepatch
- display_name = "eyepatch"
- path = /obj/item/clothing/glasses/eyepatch
- cost = 1
- slot = slot_glasses
-
-/datum/gear/green_glasses
- display_name = "glasses, green"
- path = /obj/item/clothing/glasses/gglasses
- cost = 1
- slot = slot_glasses
-
-/datum/gear/prescriptionhipster
- display_name = "glasses, hipster"
- path = /obj/item/clothing/glasses/regular/hipster
- cost = 1
- slot = slot_glasses
-
-/datum/gear/prescription
- display_name = "glasses, prescription"
- path = /obj/item/clothing/glasses/regular
- cost = 1
- slot = slot_glasses
-
-/datum/gear/monocle
- display_name = "monocle"
- path = /obj/item/clothing/glasses/monocle
- cost = 1
- slot = slot_glasses
-
-/datum/gear/scanning_goggles
- display_name = "scanning goggles"
- path = /obj/item/clothing/glasses/regular/scanners
- cost = 1
- slot = slot_glasses
-
-/datum/gear/sciencegoggles
- display_name = "science Goggles"
- path = /obj/item/clothing/glasses/science
- cost = 1
- slot = slot_glasses
-
-/datum/gear/security
- display_name = "security HUD"
- path = /obj/item/clothing/glasses/hud/security
- cost = 1
- slot = slot_glasses
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-/datum/gear/thugshades
- display_name = "sunglasses, fat"
- path = /obj/item/clothing/glasses/sunglasses/big
- cost = 1
- slot = slot_glasses
- allowed_roles = list("Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain","Security Cadet")
-
-/datum/gear/prescriptionsun
- display_name = "sunglasses, presciption"
- path = /obj/item/clothing/glasses/sunglasses/prescription
- cost = 2
- slot = slot_glasses
- allowed_roles = list("Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain","Security Cadet")
-
-/datum/gear/blindfold
- display_name = "vaurca blindfold"
- path = /obj/item/clothing/glasses/sunglasses/blinders
- cost = 2
- slot = slot_glasses
- whitelisted = "Vaurca"
-
-// Mask
-
-/datum/gear/sterilemask
- display_name = "sterile mask"
- path = /obj/item/clothing/mask/surgical
- slot = slot_wear_mask
- cost = 2
-
-// Uniform slot
-
-/datum/gear/blazer_blue
- display_name = "blazer, blue"
- path = /obj/item/clothing/under/blazer
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/cheongsam
- display_name = "cheongsam, white"
- path = /obj/item/clothing/under/cheongsam
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/gearharness
- display_name = "gear harness"
- path = /obj/item/clothing/under/gearharness
- slot = slot_w_uniform
- cost = 2
-
-/datum/gear/kilt
- display_name = "kilt"
- path = /obj/item/clothing/under/kilt
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/track_pants
- display_name = "track pants"
- path = /obj/item/clothing/under/track
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/blackjumpskirt
- display_name = "jumpskirt, black"
- path = /obj/item/clothing/under/blackjumpskirt
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/blackfjumpsuit
- display_name = "jumpsuit, female-black"
- path = /obj/item/clothing/under/color/blackf
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/blackfjumpsuit
- display_name = "jumpsuit, rainbow"
- path = /obj/item/clothing/under/rainbow
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/skirt_blue
- display_name = "plaid skirt, blue"
- path = /obj/item/clothing/under/dress/plaid_blue
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/skirt_purple
- display_name = "plaid skirt, purple"
- path = /obj/item/clothing/under/dress/plaid_purple
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/skirt_red
- display_name = "plaid skirt, red"
- path = /obj/item/clothing/under/dress/plaid_red
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/skirt_black
- display_name = "skirt, black"
- path = /obj/item/clothing/under/blackskirt
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/amishsuit
- display_name = "suit, amish"
- path = /obj/item/clothing/under/sl_suit
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/blacksuit
- display_name = "suit, black"
- path = /obj/item/clothing/under/suit_jacket
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/shinyblacksuit
- display_name = "suit, shiny-black"
- path = /obj/item/clothing/under/lawyer/black
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/bluesuit
- display_name = "suit, blue"
- path = /obj/item/clothing/under/lawyer/blue
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/burgundysuit
- display_name = "suit, burgundy"
- path = /obj/item/clothing/under/suit_jacket/burgundy
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/checkeredsuit
- display_name = "suit, checkered"
- path = /obj/item/clothing/under/suit_jacket/checkered
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/charcoalsuit
- display_name = "suit, charcoal"
- path = /obj/item/clothing/under/suit_jacket/charcoal
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/execsuit
- display_name = "suit, executive"
- path = /obj/item/clothing/under/suit_jacket/really_black
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/femaleexecsuit
- display_name = "suit, female-executive"
- path = /obj/item/clothing/under/suit_jacket/female
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/gentlesuit
- display_name = "suit, gentlemen"
- path = /obj/item/clothing/under/gentlesuit
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/navysuit
- display_name = "suit, navy"
- path = /obj/item/clothing/under/suit_jacket/navy
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/redsuit
- display_name = "suit, red"
- path = /obj/item/clothing/under/suit_jacket/red
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/redlawyer
- display_name = "suit, lawyer-red"
- path = /obj/item/clothing/under/lawyer/red
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/oldmansuit
- display_name = "suit, old-man"
- path = /obj/item/clothing/under/lawyer/oldman
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/purplesuit
- display_name = "suit, purple"
- path = /obj/item/clothing/under/lawyer/purpsuit
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/tansuit
- display_name = "suit, tan"
- path = /obj/item/clothing/under/suit_jacket/tan
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/whitesuit
- display_name = "suit, white"
- path = /obj/item/clothing/under/scratch
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/whitebluesuit
- display_name = "suit, white-blue"
- path = /obj/item/clothing/under/lawyer/bluesuit
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/sundress
- display_name = "sundress"
- path = /obj/item/clothing/under/sundress
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/sundress_white
- display_name = "sundress, white"
- path = /obj/item/clothing/under/sundress_white
- slot = slot_w_uniform
- cost = 1
-
-/datum/gear/uniform_captain
- display_name = "uniform, captain's dress"
- path = /obj/item/clothing/under/dress/dress_cap
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Captain")
-
-/datum/gear/corpsecsuit
- display_name = "uniform, corporate (Security)"
- path = /obj/item/clothing/under/rank/security/corp
- cost = 1
- slot = slot_w_uniform
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-/datum/gear/uniform_hop
- display_name = "uniform, HoP's dress"
- path = /obj/item/clothing/under/dress/dress_hop
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Head of Personnel")
-
-/datum/gear/uniform_hr
- display_name = "uniform, HR director (HoP)"
- path = /obj/item/clothing/under/dress/dress_hr
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Head of Personnel")
-
-/datum/gear/navysecsuit
- display_name = "uniform, navyblue (Security)"
- path = /obj/item/clothing/under/rank/security/navyblue
- cost = 1
- slot = slot_w_uniform
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-//medical scrubs
-
-/datum/gear/bluescrub
- display_name = "medical scrubs, blue"
- path = /obj/item/clothing/under/rank/medical/blue
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Scientist","Chief Medical Officer","Medical Doctor","Geneticist","Paramedic","Nursing Intern","Xenobiologist","Roboticist","Research Director","Detective",)
-
-/datum/gear/greenscrub
- display_name = "medical scrubs, green"
- path = /obj/item/clothing/under/rank/medical/green
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Scientist","Chief Medical Officer","Medical Doctor","Geneticist","Paramedic","Nursing Intern","Xenobiologist","Roboticist","Research Director","Detective",)
-
-/datum/gear/purplescrub
- display_name = "medical scrubs, purple"
- path = /obj/item/clothing/under/rank/medical/purple
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Scientist","Chief Medical Officer","Medical Doctor","Geneticist","Paramedic","Nursing Intern","Xenobiologist","Roboticist","Research Director","Detective",)
-
-/datum/gear/blackscrub
- display_name = "medical scrubs, black"
- path = /obj/item/clothing/under/rank/medical/black
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Scientist","Chief Medical Officer","Medical Doctor","Geneticist","Paramedic","Nursing Intern","Xenobiologist","Roboticist","Research Director","Detective",)
-
-// Attachments
-/datum/gear/armband_cargo
- display_name = "armband, cargo"
- path = /obj/item/clothing/accessory/armband/cargo
- slot = slot_tie
- cost = 1
- allowed_roles = list("Cargo Technician","Quartermaster","Head of Personnel","Shaft Miner")
-
-/datum/gear/armband_emt
- display_name = "armband, EMT"
- path = /obj/item/clothing/accessory/armband/medgreen
- slot = slot_tie
- cost = 1
- allowed_roles = list("Paramedic","Chief Medical Officer")
-
-/datum/gear/armband_engineering
- display_name = "armband, engineering"
- path = /obj/item/clothing/accessory/armband/engine
- slot = slot_tie
- cost = 1
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/armband_hydroponics
- display_name = "armband, hydroponics"
- path = /obj/item/clothing/accessory/armband/hydro
- slot = slot_tie
- cost = 1
- allowed_roles = list("Head of Personnel","Gardener")
-
-/datum/gear/armband_medical
- display_name = "armband, medical"
- path = /obj/item/clothing/accessory/armband/med
- slot = slot_tie
- cost = 1
- allowed_roles = list("Chief Medical Officer","Medical Doctor","Paramedic","Nursing Intern","Psychiatrist","Chemist",)
-
-/datum/gear/armband
- display_name = "armband, red"
- path = /obj/item/clothing/accessory/armband
- slot = slot_tie
- cost = 1
-
-/datum/gear/armband_science
- display_name = "armband, science"
- path = /obj/item/clothing/accessory/armband/science
- slot = slot_tie
- cost = 1
- allowed_roles = list("Research Director","Scientist","Xenobiologist","Roboticist","Lab Assistant","Geneticist")
-
-/datum/gear/armband_movement
- display_name = "armband, synthetic intelligence movement"
- path = /obj/item/clothing/accessory/armband/movement
- slot = slot_tie
- cost = 1
-
-/datum/gear/atlas
- display_name = "armband, ATLAS"
- path = /obj/item/clothing/accessory/armband/atlas
- slot = slot_tie
- cost = 1
-
-/datum/gear/armpit
- display_name = "holster, armpit"
- path = /obj/item/clothing/accessory/holster/armpit
- slot = slot_tie
- cost = 1
- allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet")
-
-/datum/gear/hip
- display_name = "holster, hip"
- path = /obj/item/clothing/accessory/holster/hip
- slot = slot_tie
- cost = 1
- allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet")
-
-/datum/gear/waist
- display_name = "holster, waist"
- path = /obj/item/clothing/accessory/holster/waist
- slot = slot_tie
- cost = 1
- allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet")
-
-/datum/gear/thigh
- display_name = "holster, thigh"
- path = /obj/item/clothing/accessory/holster/thigh
- slot = slot_tie
- cost = 1
- allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet")
-
-/datum/gear/tie_blue
- display_name = "tie, blue"
- path = /obj/item/clothing/accessory/blue
- slot = slot_tie
- cost = 1
-
-/datum/gear/tie_red
- display_name = "tie, red"
- path = /obj/item/clothing/accessory/red
- slot = slot_tie
- cost = 1
-
-/datum/gear/tie_horrible
- display_name = "tie, socially disgraceful"
- path = /obj/item/clothing/accessory/horrible
- slot = slot_tie
- cost = 1
-
-/datum/gear/brown_vest
- display_name = "webbing, engineering"
- path = /obj/item/clothing/accessory/storage/brown_vest
- slot = slot_tie
- cost = 1
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/black_vest
- display_name = "webbing, security"
- path = /obj/item/clothing/accessory/storage/black_vest
- slot = slot_tie
- cost = 1
- allowed_roles = list("Security Officer","Head of Security","Warden","Security Cadet","Detective")
-
-/datum/gear/webbing
- display_name = "webbing, simple"
- path = /obj/item/clothing/accessory/storage/webbing
- slot = slot_tie
- cost = 2
-
-/datum/gear/suspenders
- display_name = "suspenders"
- path = /obj/item/clothing/accessory/suspenders
- cost = 1
- slot = slot_tie
-
-/datum/gear/wcoat
- display_name = "waistcoat"
- path = /obj/item/clothing/accessory/wcoat
- cost = 1
- slot = slot_tie
-
-// Suit slot
-
-/datum/gear/apron
- display_name = "apron, blue"
- path = /obj/item/clothing/suit/apron
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/bomber
- display_name = "bomber jacket"
- path = /obj/item/clothing/suit/storage/toggle/bomber
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/leather_jacket
- display_name = "leather jacket, black"
- path = /obj/item/clothing/suit/storage/leather_jacket
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/leather_jacket_nt
- display_name = "leather jacket, corporate, black"
- path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/brown_jacket
- display_name = "leather jacket, brown"
- path = /obj/item/clothing/suit/storage/toggle/brown_jacket
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/brown_jacket_nt
- display_name = "leather jacket, corporate, brown"
- path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/hazard_vest
- display_name = "hazard vest"
- path = /obj/item/clothing/suit/storage/hazardvest
- cost = 2
- slot = slot_wear_suit
- allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/hoodie
- display_name = "hoodie, grey"
- path = /obj/item/clothing/suit/storage/toggle/hoodie
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/hoodie/black
- display_name = "hoodie, black"
- path = /obj/item/clothing/suit/storage/toggle/hoodie/black
- cost = 2
-
-/datum/gear/unathi_mantle
- display_name = "hide mantle (Unathi)"
- path = /obj/item/clothing/suit/unathi/mantle
- cost = 1
- slot = slot_wear_suit
- whitelisted = "Unathi"
-
-/datum/gear/labcoat
- display_name = "labcoat"
- path = /obj/item/clothing/suit/storage/toggle/labcoat
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/bluelabcoat
- display_name = "labcoat, blue"
- path = /obj/item/clothing/suit/storage/toggle/labcoat/blue
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/greenlabcoat
- display_name = "labcoat, green"
- path = /obj/item/clothing/suit/storage/toggle/labcoat/green
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/orangelabcoat
- display_name = "labcoat, orange"
- path = /obj/item/clothing/suit/storage/toggle/labcoat/orange
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/purplelabcoat
- display_name = "labcoat, purple"
- path = /obj/item/clothing/suit/storage/toggle/labcoat/purple
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/redlabcoat
- display_name = "labcoat, red"
- path = /obj/item/clothing/suit/storage/toggle/labcoat/red
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/overalls
- display_name = "overalls"
- path = /obj/item/clothing/suit/apron/overalls
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/bponcho
- display_name = "poncho, blue"
- path = /obj/item/clothing/suit/poncho/blue
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/gponcho
- display_name = "poncho, green"
- path = /obj/item/clothing/suit/poncho/green
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/pponcho
- display_name = "poncho, purple"
- path = /obj/item/clothing/suit/poncho/purple
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/rponcho
- display_name = "poncho, red"
- path = /obj/item/clothing/suit/poncho/red
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/poncho
- display_name = "poncho, tan"
- path = /obj/item/clothing/suit/poncho
- cost = 1
- slot = slot_wear_suit
-
-/datum/gear/unathi_robe
- display_name = "roughspun robe (Unathi)"
- path = /obj/item/clothing/suit/unathi/robe
- cost = 1
- slot = slot_wear_suit
- whitelisted = "Unathi"
-
-/datum/gear/blue_lawyer_jacket
- display_name = "suit jacket, blue"
- path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/purple_lawyer_jacket
- display_name = "suit jacket, purple"
- path = /obj/item/clothing/suit/storage/lawyer/purpjacket
- cost = 2
- slot = slot_wear_suit
-
-/datum/gear/zhan_furs
- display_name = "zhan-Khazan furs"
- path = /obj/item/clothing/suit/tajaran/furs
- cost = 1
- slot = slot_wear_suit
- whitelisted = "Tajara"
-
-/datum/gear/track_jacket
- display_name = "track jacket"
- path = /obj/item/clothing/suit/storage/toggle/tracksuit
- cost = 1
- slot = slot_wear_suit
-
-// Gloves
-
-/datum/gear/black_gloves
- display_name = "gloves, black"
- path = /obj/item/clothing/gloves/black
- cost = 2
- slot = slot_gloves
-
-/datum/gear/blue_gloves
- display_name = "gloves, blue"
- path = /obj/item/clothing/gloves/blue
- cost = 2
- slot = slot_gloves
-
-/datum/gear/brown_gloves
- display_name = "gloves, brown"
- path = /obj/item/clothing/gloves/brown
- cost = 2
- slot = slot_gloves
-
-/datum/gear/light_brown_gloves
- display_name = "gloves, light-brown"
- path = /obj/item/clothing/gloves/light_brown
- cost = 2
- slot = slot_gloves
-
-/datum/gear/green_gloves
- display_name = "gloves, green"
- path = /obj/item/clothing/gloves/green
- cost = 2
- slot = slot_gloves
-
-/datum/gear/grey_gloves
- display_name = "gloves, grey"
- path = /obj/item/clothing/gloves/grey
- cost = 2
- slot = slot_gloves
-
-/datum/gear/latex_gloves
- display_name = "gloves, latex"
- path = /obj/item/clothing/gloves/latex
- cost = 2
- slot = slot_gloves
-
-
-/datum/gear/orange_gloves
- display_name = "gloves, orange"
- path = /obj/item/clothing/gloves/orange
- cost = 2
- slot = slot_gloves
-
-/datum/gear/purple_gloves
- display_name = "gloves, purple"
- path = /obj/item/clothing/gloves/purple
- cost = 2
- slot = slot_gloves
-
-/datum/gear/rainbow_gloves
- display_name = "gloves, rainbow"
- path = /obj/item/clothing/gloves/rainbow
- cost = 2
- slot = slot_gloves
-
-/datum/gear/red_gloves
- display_name = "gloves, red"
- path = /obj/item/clothing/gloves/red
- cost = 2
- slot = slot_gloves
-
-/datum/gear/white_gloves
- display_name = "gloves, white"
- path = /obj/item/clothing/gloves/white
- cost = 2
- slot = slot_gloves
-
-/datum/gear/black_gloves_unathi
- display_name = "black gloves, unathi"
- path = /obj/item/clothing/gloves/black/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/black_gloves_tajara
- display_name = "black gloves, tajaran"
- path = /obj/item/clothing/gloves/black/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/red_gloves_unathi
- display_name = "red gloves, unathi"
- path = /obj/item/clothing/gloves/red/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/red_gloves_tajaran
- display_name = "red gloves, tajaran"
- path = /obj/item/clothing/gloves/red/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/blue_gloves_unathi
- display_name = "blue gloves, unathi"
- path = /obj/item/clothing/gloves/blue/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/blue_gloves_tajaran
- display_name = "blue gloves, tajaran"
- path = /obj/item/clothing/gloves/blue/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/orange_gloves_unathi
- display_name = "orange gloves, unathi"
- path = /obj/item/clothing/gloves/orange/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/orange_gloves_tajaran
- display_name = "orange gloves, tajaran"
- path = /obj/item/clothing/gloves/orange/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/purple_gloves_unathi
- display_name = "purple gloves, unathi"
- path = /obj/item/clothing/gloves/purple/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/purple_gloves_tajaran
- display_name = "purple gloves, tajaran"
- path = /obj/item/clothing/gloves/purple/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/brown_gloves_unathi
- display_name = "brown gloves, unathi"
- path = /obj/item/clothing/gloves/brown/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/brown_gloves_tajaran
- display_name = "brown gloves, tajaran"
- path = /obj/item/clothing/gloves/brown/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/green_gloves_unathi
- display_name = "green gloves, unathi"
- path = /obj/item/clothing/gloves/green/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/green_gloves_tajaran
- display_name = "green gloves, tajaran"
- path = /obj/item/clothing/gloves/green/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/white_gloves_unathi
- display_name = "white gloves, unathi"
- path = /obj/item/clothing/gloves/white/unathi
- cost = 2
- slot = slot_gloves
-
-/datum/gear/white_gloves_tajaran
- display_name = "white gloves, tajaran"
- path = /obj/item/clothing/gloves/white/tajara
- cost = 2
- slot = slot_gloves
-
-/datum/gear/watch
- display_name = "watch"
- path = /obj/item/clothing/gloves/watch
- cost = 2
- slot = slot_gloves
-
-// Shoelocker
-
-/datum/gear/jackboots
- display_name = "jackboots"
- path = /obj/item/clothing/shoes/jackboots
- cost = 1
- slot = slot_shoes
-// allowed_roles = list("Security Cadet","Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain")
-
-/datum/gear/toeless_jackboots
- display_name = "toe-less jackboots"
- path = /obj/item/clothing/shoes/jackboots/unathi
- cost = 1
- slot = slot_shoes
-// allowed_roles = list("Security Cadet","Security Officer","Head of Security","Warden","Detective","Internal Affairs Agent","Quartermaster","Head of Personnel","Captain")
-
-/datum/gear/workboots
- display_name = "workboots"
- path = /obj/item/clothing/shoes/workboots
- cost = 1
- slot = slot_shoes
-// allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice")
-
-/datum/gear/sandal
- display_name = "sandals"
- path = /obj/item/clothing/shoes/sandal
- cost = 1
- slot = slot_shoes
-
-/datum/gear/black_shoes
- display_name = "shoes, black"
- path = /obj/item/clothing/shoes/black
- cost = 1
- slot = slot_shoes
-
-/datum/gear/blue_shoes
- display_name = "shoes, blue"
- path = /obj/item/clothing/shoes/blue
- cost = 1
- slot = slot_shoes
-
-/datum/gear/brown_shoes
- display_name = "shoes, brown"
- path = /obj/item/clothing/shoes/brown
- cost = 1
- slot = slot_shoes
-
-/datum/gear/laceyshoes
- display_name = "shoes, classy"
- path = /obj/item/clothing/shoes/laceup
- cost = 1
- slot = slot_shoes
-
-/datum/gear/dress_shoes
- display_name = "shoes, dress"
- path = /obj/item/clothing/shoes/laceup
- cost = 1
- slot = slot_shoes
-
-/datum/gear/green_shoes
- display_name = "shoes, green"
- path = /obj/item/clothing/shoes/green
- cost = 1
- slot = slot_shoes
-
-/datum/gear/leather
- display_name = "shoes, leather"
- path = /obj/item/clothing/shoes/leather
- cost = 1
- slot = slot_shoes
-
-/datum/gear/orange_shoes
- display_name = "shoes, orange"
- path = /obj/item/clothing/shoes/orange
- cost = 1
- slot = slot_shoes
-
-/datum/gear/purple_shoes
- display_name = "shoes, purple"
- path = /obj/item/clothing/shoes/purple
- cost = 1
- slot = slot_shoes
-
-/datum/gear/rainbow_shoes
- display_name = "shoes, rainbow"
- path = /obj/item/clothing/shoes/rainbow
- cost = 1
- slot = slot_shoes
-
-/datum/gear/red_shoes
- display_name = "shoes, red"
- path = /obj/item/clothing/shoes/red
- cost = 1
- slot = slot_shoes
-
-/datum/gear/white_shoes
- display_name = "shoes, white"
- path = /obj/item/clothing/shoes/white
- cost = 1
- slot = slot_shoes
-
-/datum/gear/yellow_shoes
- display_name = "shoes, yellow"
- path = /obj/item/clothing/shoes/yellow
- cost = 1
- slot = slot_shoes
-
-// "Useful" items - I'm guessing things that might be used at work?
-
-/datum/gear/briefcase
- display_name = "briefcase"
- path = /obj/item/weapon/storage/briefcase
- sort_category = "utility"
- cost = 2
-
-/datum/gear/clipboard
- display_name = "clipboard"
- path = /obj/item/weapon/clipboard
- sort_category = "utility"
- cost = 1
-
-/datum/gear/folder_blue
- display_name = "folder, blue"
- path = /obj/item/weapon/folder/blue
- sort_category = "utility"
- cost = 1
-
-/datum/gear/folder_grey
- display_name = "folder, grey"
- path = /obj/item/weapon/folder
- sort_category = "utility"
- cost = 1
-
-/datum/gear/folder_red
- display_name = "folder, red"
- path = /obj/item/weapon/folder/red
- sort_category = "utility"
- cost = 1
-
-/datum/gear/folder_white
- display_name = "folder, white"
- path = /obj/item/weapon/folder/white
- sort_category = "utility"
- cost = 1
-
-/datum/gear/folder_yellow
- display_name = "folder, yellow"
- path = /obj/item/weapon/folder/yellow
- sort_category = "utility"
- cost = 1
-
-/datum/gear/paicard
- display_name = "personal AI device"
- path = /obj/item/device/paicard
- sort_category = "utility"
- cost = 2
-
-/datum/gear/wallet
- display_name = "wallet"
- path = /obj/item/weapon/storage/wallet
- sort_category = "utility"
- cost = 1
-
-// Reserved for later use
-// /datum/gear/cheaptablet
-// display_name = "cheap tablet computer"
-// path = /obj/item/modular_computer/tablet/preset/custom_loadout/cheap
-// sort_category = "utility"
-// cost = 3
-//
-// /datum/gear/normaltablet
-// display_name = "tablet computer"
-// path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
-// sort_category = "utility"
-// cost = 4
-
-// The rest of the trash.
-
-/datum/gear/ashtray
- display_name = "ashtray, plastic"
- path = /obj/item/weapon/material/ashtray/plastic
- sort_category = "misc"
- cost = 1
-
-/datum/gear/boot_knife
- display_name = "boot knife"
- path = /obj/item/weapon/material/kitchen/utensil/knife/boot
- sort_category = "misc"
- cost = 3
-
-/datum/gear/cane
- display_name = "cane"
- path = /obj/item/weapon/cane
- sort_category = "misc"
- cost = 1
-
-/datum/gear/dice
- display_name = "d20"
- path = /obj/item/weapon/dice/d20
- sort_category = "misc"
- cost = 1
-
-/datum/gear/cards
- display_name = "deck of cards"
- path = /obj/item/weapon/deck/cards
- sort_category = "misc"
- cost = 1
-
-/datum/gear/tarot
- display_name = "deck of tarot cards"
- path = /obj/item/weapon/deck/tarot
- sort_category = "misc"
- cost = 1
-
-/datum/gear/holder
- display_name = "card holder"
- path = /obj/item/weapon/deck/holder
- sort_category = "misc"
- cost = 1
-
-/datum/gear/cardemon_pack
- display_name = "\improper cardemon booster pack"
- path = /obj/item/weapon/pack/cardemon
- sort_category = "misc"
- cost = 1
-
-/datum/gear/spaceball_pack
- display_name = "\improper spaceball booster pack"
- path = /obj/item/weapon/pack/spaceball
- sort_category = "misc"
- cost = 1
-
-/datum/gear/flask
- display_name = "flask"
- path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
- sort_category = "misc"
- cost = 1
-
-/datum/gear/vacflask
- display_name = "vacuum-flask"
- path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask
- sort_category = "misc"
- cost = 1
-/datum/gear/blipstick
- display_name = "lipstick, black"
- path = /obj/item/weapon/lipstick/black
- sort_category = "misc"
- cost = 1
-
-/datum/gear/jlipstick
- display_name = "lipstick, jade"
- path = /obj/item/weapon/lipstick/jade
- sort_category = "misc"
- cost = 1
-
-/datum/gear/plipstick
- display_name = "lipstick, purple"
- path = /obj/item/weapon/lipstick/purple
- sort_category = "misc"
- cost = 1
-
-/datum/gear/rlipstick
- display_name = "lipstick, red"
- path = /obj/item/weapon/lipstick
- sort_category = "misc"
- cost = 1
-
-/datum/gear/smokingpipe
- display_name = "pipe, smoking"
- path = /obj/item/clothing/mask/smokable/pipe
- sort_category = "misc"
- cost = 1
-
-/datum/gear/cornpipe
- display_name = "pipe, corn"
- path = /obj/item/clothing/mask/smokable/pipe/cobpipe
- sort_category = "misc"
- cost = 1
-
-/datum/gear/cigar_case
- display_name = "cigar case"
- path = /obj/item/weapon/storage/fancy/cigar
- sort_category = "misc"
- cost = 2
-
-/datum/gear/cigarettes
- display_name = "pack of DromedaryCo cigarettes"
- path = /obj/item/weapon/storage/fancy/cigarettes/dromedaryco
- sort_category = "misc"
- cost = 2
-
-/datum/gear/matchbook
- display_name = "matchbook"
- path = /obj/item/weapon/storage/box/matches
- sort_category = "misc"
- cost = 1
-
-/datum/gear/comb
- display_name = "purple comb"
- path = /obj/item/weapon/haircomb
- sort_category = "misc"
- cost = 1
-
-/datum/gear/cape
- display_name = "tunnel cloak"
- path = /obj/item/weapon/storage/backpack/cloak
- sort_category = "misc"
- cost = 1
-
-/datum/gear/mirror
- display_name = "handheld mirror"
- path = /obj/item/weapon/mirror
- sort_category = "misc"
- cost = 1
-
-/datum/gear/zippo
- display_name = "zippo"
- path = /obj/item/weapon/flame/lighter/zippo
- sort_category = "misc"
- cost = 1
-
-/datum/gear/recorder
- display_name = "universal recorder"
- path = /obj/item/device/taperecorder
- sort_category = "misc"
- cost = 1
-
-// Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use
-// the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset.
-/datum/gear/earmuffs
- display_name = "earmuffs"
- path = /obj/item/clothing/ears/earmuffs
- cost = 1
- sort_category = "ears"
-
-/datum/gear/skrell_chain
- display_name = "skrell headtail-wear, female, chain"
- path = /obj/item/clothing/ears/skrell/chain
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/skrell_plate
- display_name = "skrell headtail-wear, male, bands"
- path = /obj/item/clothing/ears/skrell/band
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/skrell_cloth_male
- display_name = "skrell headtail-wear, male, cloth"
- path = /obj/item/clothing/ears/skrell/cloth_male
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/skrell_cloth_female
- display_name = "skrell headtail-wear, female, cloth"
- path = /obj/item/clothing/ears/skrell/cloth_female
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/red_jeweled
- display_name = "skrell headtail-wear, female, red-jeweled chain"
- path = /obj/item/clothing/ears/skrell/redjewel_chain
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/ebony_chain
- display_name = "skrell headtail-wear, female, ebony chain"
- path = /obj/item/clothing/ears/skrell/ebony_chain
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/redjeweled_band
- display_name = "skrell headtail-wear, male, red-jeweled bands"
- path = /obj/item/clothing/ears/skrell/redjeweled_band
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/ebony_band
- display_name = "skrell headtail-wear, male, ebony bands"
- path = /obj/item/clothing/ears/skrell/ebony_band
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/bluejeweled_chain
- display_name = "skrell headtail-wear, female, blue-jeweled chain"
- path = /obj/item/clothing/ears/skrell/bluejeweled_chain
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/bluejeweled_band
- display_name = "skrell headtail-wear, male, blue-jeweled bands"
- path = /obj/item/clothing/ears/skrell/bluejeweled_band
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/silver_chain
- display_name = "skrell headtail-wear, female, silver chain"
- path = /obj/item/clothing/ears/skrell/silver_chain
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/silver_band
- display_name = "skrell headtail-wear, male, silver bands"
- path = /obj/item/clothing/ears/skrell/silver_band
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/blue_skrell_cloth_band_male
- display_name = "skrell headtail-wear, male, blue cloth"
- path = /obj/item/clothing/ears/skrell/blue_skrell_cloth_band_male
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/blue_skrell_cloth_band_female
- display_name = "skrell headtail-wear, female, blue cloth"
- path = /obj/item/clothing/ears/skrell/blue_skrell_cloth_band_female
- cost = 1
- sort_category = "ears"
- whitelisted = "Skrell"
-
-/datum/gear/bandanna_r
- display_name = "neck bandanna, red"
- path = /obj/item/clothing/ears/bandanna
- cost = 1
- sort_category = "ears"
-
-/datum/gear/bandanna_bl
- display_name = "neck bandanna, blue"
- path = /obj/item/clothing/ears/bandanna/blue
- cost = 1
- sort_category = "ears"
-
-/datum/gear/bandanna_bk
- display_name = "neck bandanna, black"
- path = /obj/item/clothing/ears/bandanna/black
- cost = 1
- sort_category = "ears"
diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm
new file mode 100644
index 00000000000..6392213adae
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/food/lunch.dm
@@ -0,0 +1,123 @@
+var/list/lunchables_lunches_ = list(/obj/item/weapon/reagent_containers/food/snacks/sandwich,
+ /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice,
+ /obj/item/weapon/reagent_containers/food/snacks/tofubreadslice,
+ /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice,
+ /obj/item/weapon/reagent_containers/food/snacks/margheritaslice,
+ /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice,
+ /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice,
+ /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice,
+ /obj/item/weapon/reagent_containers/food/snacks/tastybread,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood,
+ /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry,
+ /obj/item/weapon/reagent_containers/food/snacks/tossedsalad,
+ /obj/item/weapon/reagent_containers/food/snacks/koiswaffles)
+
+var/list/lunchables_snacks_ = list(/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+ /obj/item/weapon/reagent_containers/food/snacks/muffin,
+ /obj/item/weapon/reagent_containers/food/snacks/popcorn,
+ /obj/item/weapon/reagent_containers/food/snacks/sosjerky,
+ /obj/item/weapon/reagent_containers/food/snacks/no_raisin,
+ /obj/item/weapon/reagent_containers/food/snacks/spacetwinkie,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers,
+ /obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
+ /obj/item/weapon/reagent_containers/food/snacks/carrotfries,
+ /obj/item/weapon/reagent_containers/food/snacks/candiedapple,
+ /obj/item/weapon/reagent_containers/food/snacks/applepie,
+ /obj/item/weapon/reagent_containers/food/snacks/cherrypie,
+ /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit,
+ /obj/item/weapon/reagent_containers/food/snacks/appletart,
+ /obj/item/weapon/reagent_containers/food/snacks/carrotcakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/limecakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/birthdaycakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/watermelonslice,
+ /obj/item/weapon/reagent_containers/food/snacks/applecakeslice,
+ /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice,
+ /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks,
+ /obj/item/weapon/reagent_containers/food/snacks/friedkois,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsnack,
+ /obj/item/weapon/reagent_containers/food/snacks/maps,
+ /obj/item/weapon/reagent_containers/food/snacks/nathisnack)
+
+var/list/lunchables_drinks_ = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/starkist,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/space_up,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/tonic,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater)
+
+// This default list is a bit different, it contains items we don't want
+var/list/lunchables_drink_reagents_ = list(/datum/reagent/drink/nothing,
+ /datum/reagent/drink/doctor_delight,
+ /datum/reagent/drink/dry_ramen,
+ /datum/reagent/drink/hell_ramen,
+ /datum/reagent/drink/hot_ramen,
+ /datum/reagent/drink/nuka_cola,
+ /datum/reagent/drink/black_coffee,
+ /datum/reagent/drink/white_coffee,
+ /datum/reagent/drink/cafe_melange)
+
+// This default list is a bit different, it contains items we don't want
+var/list/lunchables_ethanol_reagents_ = list(/datum/reagent/ethanol/acid_spit,
+ /datum/reagent/ethanol/atomicbomb,
+ /datum/reagent/ethanol/beepsky_smash,
+ /datum/reagent/ethanol/coffee,
+ /datum/reagent/ethanol/hippies_delight,
+ /datum/reagent/ethanol/hooch,
+ /datum/reagent/ethanol/thirteenloko,
+ /datum/reagent/ethanol/manhattan_proj,
+ /datum/reagent/ethanol/neurotoxin,
+ /datum/reagent/ethanol/pwine,
+ /datum/reagent/ethanol/threemileisland,
+ /datum/reagent/ethanol/toxins_special)
+
+/proc/lunchables_lunches()
+ if(!(lunchables_lunches_[lunchables_lunches_[1]]))
+ lunchables_lunches_ = init_lunchable_list(lunchables_lunches_)
+ return lunchables_lunches_
+
+/proc/lunchables_snacks()
+ if(!(lunchables_snacks_[lunchables_snacks_[1]]))
+ lunchables_snacks_ = init_lunchable_list(lunchables_snacks_)
+ return lunchables_snacks_
+
+/proc/lunchables_drinks()
+ if(!(lunchables_drinks_[lunchables_drinks_[1]]))
+ lunchables_drinks_ = init_lunchable_list(lunchables_drinks_)
+ return lunchables_drinks_
+
+/proc/lunchables_drink_reagents()
+ if(!(lunchables_drink_reagents_[lunchables_drink_reagents_[1]]))
+ lunchables_drink_reagents_ = init_lunchable_reagent_list(lunchables_drink_reagents_, /datum/reagent/drink)
+ return lunchables_drink_reagents_
+
+/proc/lunchables_ethanol_reagents()
+ if(!(lunchables_ethanol_reagents_[lunchables_ethanol_reagents_[1]]))
+ lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /datum/reagent/ethanol)
+ return lunchables_ethanol_reagents_
+
+/proc/init_lunchable_list(var/list/lunches)
+ . = list()
+ for(var/lunch in lunches)
+ var/obj/O = lunch
+ .[initial(O.name)] = lunch
+ return sortAssoc(.)
+
+/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_types)
+ . = list()
+ for(var/reagent_type in subtypesof(reagent_types))
+ if(reagent_type in banned_reagents)
+ continue
+ var/datum/reagent/reagent = reagent_type
+ .[initial(reagent.name)] = initial(reagent.id)
+ return sortAssoc(.)
diff --git a/html/changelogs/alberky-PR-1648.yml b/html/changelogs/alberky-PR-1648.yml
new file mode 100644
index 00000000000..f4044d08745
--- /dev/null
+++ b/html/changelogs/alberky-PR-1648.yml
@@ -0,0 +1,9 @@
+author: Alberyk
+
+delete-after: True
+
+changes:
+ - rscadd: "Ported the newest custom loadout from baystation12."
+ - rscadd: "Loadout flask and vacuum-flask can now be prefilled."
+ - rscadd: "Added lunchboxes."
+ - rscadd: "Added more options to the custom loadout, like winter coats."
diff --git a/icons/obj/lunchbox.dmi b/icons/obj/lunchbox.dmi
new file mode 100644
index 00000000000..f75c3873721
Binary files /dev/null and b/icons/obj/lunchbox.dmi differ