diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index a5e8e31cd8..3d01682e49 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -60,7 +60,7 @@
if(prob(5))
new /obj/item/clothing/gloves/yellow(src)
else
- new /obj/item/stack/cable_coil(src,30,color)
+ new /obj/item/stack/cable_coil/random(src,30)
/obj/item/weapon/storage/toolbox/syndicate
name = "black and red toolbox"
@@ -71,11 +71,11 @@
/obj/item/weapon/storage/toolbox/syndicate/New()
..()
+ new /obj/item/clothing/gloves/yellow(src)
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
- new /obj/item/stack/cable_coil/random(src,30,color)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
@@ -86,41 +86,21 @@
item_state = "toolbox_pink"
desc = "A little lunchbox. This one is the colors of the rainbow!"
var/filled = FALSE
+ attack_verb = list("lunched")
/obj/item/weapon/storage/toolbox/lunchbox/New()
..()
if(filled)
- var/lunch = pick(/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)
-
- var/snack = pick(/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)
-
- var/drink = pick(/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)
-
+ 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
@@ -154,7 +134,7 @@
filled = TRUE
/obj/item/weapon/storage/toolbox/lunchbox/mars
- name = "Mars university lunchbox"
+ name = "\improper Mars university lunchbox"
icon_state = "lunchbox_marsuniversity"
item_state = "toolbox_red"
desc = "A little lunchbox. This one is branded with the Mars university logo!"
@@ -163,7 +143,7 @@
filled = TRUE
/obj/item/weapon/storage/toolbox/lunchbox/cti
- name = "CTI lunchbox"
+ name = "\improper CTI lunchbox"
icon_state = "lunchbox_cti"
item_state = "toolbox_blue"
desc = "A little lunchbox. This one is branded with the CTI logo!"
@@ -172,7 +152,7 @@
filled = TRUE
/obj/item/weapon/storage/toolbox/lunchbox/nymph
- name = "Diona nymph lunchbox"
+ name = "\improper Diona nymph lunchbox"
icon_state = "lunchbox_dionanymph"
item_state = "toolbox_yellow"
desc = "A little lunchbox. This one is an adorable Diona nymph on the side!"
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index eb25cb24e8..db9fa5227d 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -409,7 +409,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
choice_options = list("Normal","Prosthesis")
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in choice_options
- if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION
+ if(!new_state || !CanUseTopic(user)) return TOPIC_NOACTION
switch(new_state)
if("Normal")
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
index ead0c2e738..27d71f9e55 100644
--- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
@@ -27,7 +27,7 @@ var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
..()
/datum/gear_tweak/color/get_contents(var/metadata)
- return "(Color⚫)"
+ return "Color: ⚫"
/datum/gear_tweak/color/get_default()
return valid_colors ? valid_colors[1] : COLOR_GRAY
@@ -54,7 +54,7 @@ var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
..()
/datum/gear_tweak/path/get_contents(var/metadata)
- return "(Type: [metadata])"
+ return "Type: [metadata]"
/datum/gear_tweak/path/get_default()
return valid_paths[1]
@@ -75,20 +75,21 @@ var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
var/list/valid_contents
/datum/gear_tweak/contents/New()
- valid_contents = args
+ valid_contents = args.Copy()
..()
/datum/gear_tweak/contents/get_contents(var/metadata)
- return "(Contents)"
+ return "Contents: [english_list(metadata, and_text = ", ")]"
/datum/gear_tweak/contents/get_default()
. = list()
for(var/i = 1 to valid_contents.len)
- var/list/contents = valid_contents[i]
- . += contents[1]
+ . += "Random"
/datum/gear_tweak/contents/get_metadata(var/user, var/list/metadata)
. = list()
+ for(var/i = metadata.len to valid_contents.len)
+ 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)
@@ -100,12 +101,13 @@ var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
if(metadata.len != valid_contents.len)
return
for(var/i = 1 to valid_contents.len)
+ var/path
var/list/contents = valid_contents[i]
- var/path = contents[metadata[i]]
- if(path)
- if(path == "Random")
- path = pick(contents)
- path = contents[path]
- else if(path == "None")
- continue
- new path(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)
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
index 09ab09d3db..4244cd0037 100644
--- a/code/modules/client/preference_setup/loadout/loadout.dm
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -123,25 +123,34 @@ var/list/gear_datums = list()
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
var/ticked = (G.display_name in pref.gear)
- var/obj/item/temp = G.path
- . += "
| [G.display_name]"
+ . += " |
| [G.display_name] | "
+ . += "[G.cost] | "
+ . += "[G.description] |
"
if(ticked)
- var/metadata = pref.gear[G.display_name]
- if(!metadata)
- metadata = list()
- pref.gear[G.display_name] = metadata
+ . += "| "
for(var/datum/gear_tweak/tweak in G.gear_tweaks)
- var/tweak_input = metadata["[tweak]"]
- if(!tweak_input)
- tweak_input = tweak.get_default()
- metadata["[tweak]"] = tweak_input
- . += " [tweak.get_contents(tweak_input)]"
- . += " | "
- . += "[G.cost] | "
- . += "[initial(temp.desc)] |
"
+ . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]"
+ . += ""
. += ""
. = jointext(.)
+/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"]]
@@ -160,11 +169,10 @@ var/list/gear_datums = list()
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)
- if(!metadata && !CanUseTopic(user))
+ var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak))
+ if(!metadata || !CanUseTopic(user))
return TOPIC_NOACTION
- var/gear_metadata = pref.gear[gear.display_name]
- gear_metadata["[tweak]"] = metadata
+ set_tweak_metadata(gear, tweak, metadata)
return TOPIC_REFRESH
else if(href_list["select_category"])
current_tab = href_list["select_category"]
@@ -176,6 +184,7 @@ var/list/gear_datums = list()
/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.
@@ -184,6 +193,12 @@ var/list/gear_datums = list()
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
diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm
index e51d299d75..89aaa0a8d1 100644
--- a/code/modules/client/preference_setup/loadout/loadout_general.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_general.dm
@@ -39,34 +39,17 @@
path = /obj/item/weapon/haircomb
/datum/gear/lunchbox
- display_name = "lunchbox, rainbow"
+ display_name = "lunchbox"
+ description = "A little lunchbox."
cost = 2
- path = /obj/item/weapon/storage/toolbox/lunchbox/filled
+ path = /obj/item/weapon/storage/toolbox/lunchbox
-/datum/gear/lunchbox/heartlunchbox
- display_name = "lunchbox, heart"
- path = /obj/item/weapon/storage/toolbox/lunchbox/heart/filled
-
-/datum/gear/lunchbox/catlunchbox
- display_name = "lunchbox, cat"
- path = /obj/item/weapon/storage/toolbox/lunchbox/cat/filled
-
-/datum/gear/lunchbox/ntlunchbox
- display_name = "lunchbox, Nanotrasen"
- path = /obj/item/weapon/storage/toolbox/lunchbox/nt/filled
-
-/datum/gear/lunchbox/marslunchbox
- display_name = "lunchbox, Mars university"
- path = /obj/item/weapon/storage/toolbox/lunchbox/mars/filled
-
-/datum/gear/lunchbox/ctilunchbox
- display_name = "lunchbox, CTI"
- path = /obj/item/weapon/storage/toolbox/lunchbox/cti/filled
-
-/datum/gear/lunchbox/nymphlunchbox
- display_name = "lunchbox, Diona nymph"
- path = /obj/item/weapon/storage/toolbox/lunchbox/nymph/filled
-
-/datum/gear/lunchbox/syndicatelunchbox
- display_name = "lunchbox, black and red"
- path = /obj/item/weapon/storage/toolbox/lunchbox/syndicate/filled
+/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())
diff --git a/code/modules/client/preference_setup/skills/skills.dm b/code/modules/client/preference_setup/skills/skills.dm
index 1f60cd3bb7..8370f35668 100644
--- a/code/modules/client/preference_setup/skills/skills.dm
+++ b/code/modules/client/preference_setup/skills/skills.dm
@@ -57,7 +57,7 @@
else if(href_list["preconfigured"])
var/selected = input(user, "Select a skillset", "Skillset") as null|anything in SKILL_PRE
- if(!selected && !CanUseTopic(user)) return
+ if(!selected || !CanUseTopic(user)) return
pref.ZeroSkills(1)
for(var/V in SKILL_PRE[selected])
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 0000000000..f2b114d62c
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/food/lunch.dm
@@ -0,0 +1,74 @@
+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)
+
+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)
+
+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)
+
+/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/init_lunchable_list(var/list/lunches)
+ var/list/unsorted_lunches = list()
+ for(var/lunch in lunches)
+ var/obj/O = lunch
+ unsorted_lunches[initial(O.name)] = lunch
+ return sortAssoc(unsorted_lunches)
diff --git a/polaris.dme b/polaris.dme
index c19f3b95ea..ce495611f6 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1677,6 +1677,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"