diff --git a/modular_skyrat/modules/black_mesa/code/armaments/armament_miscellaneous.dm b/modular_skyrat/modules/black_mesa/code/armaments/armament_miscellaneous.dm
index 1916b4e90fc..896cb212fac 100644
--- a/modular_skyrat/modules/black_mesa/code/armaments/armament_miscellaneous.dm
+++ b/modular_skyrat/modules/black_mesa/code/armaments/armament_miscellaneous.dm
@@ -22,6 +22,11 @@
max_purchase = 6
cost = 1
+/datum/armament_entry/hecu/misc/pizza
+ item_type = /obj/item/pizzabox/random
+ max_purchase = 3
+ cost = 2
+
/datum/armament_entry/hecu/misc/guitar
item_type = /obj/item/instrument/guitar
max_purchase = 1
diff --git a/modular_skyrat/modules/black_mesa/code/rationpacks.dm b/modular_skyrat/modules/black_mesa/code/rationpacks.dm
index 839c3c20f64..9965858d07a 100644
--- a/modular_skyrat/modules/black_mesa/code/rationpacks.dm
+++ b/modular_skyrat/modules/black_mesa/code/rationpacks.dm
@@ -1,3 +1,27 @@
+/// Handpicked list of various pizzas and "pizzas" to make sure it's both 'safe' (human-edible) and doesn't spawn the base type like the bomb pizza can.
+#define EDIBLE_PIZZA_LIST list( \
+ /obj/item/food/pizza/margherita, \
+ /obj/item/food/pizza/meat, \
+ /obj/item/food/pizza/mushroom, \
+ /obj/item/food/pizza/vegetable, \
+ /obj/item/food/pizza/donkpocket, \
+ /obj/item/food/pizza/dank, \
+ /obj/item/food/pizza/sassysage, \
+ /obj/item/food/pizza/pineapple, \
+ /obj/item/food/pizza/mothic_margherita, \
+ /obj/item/food/pizza/mothic_firecracker, \
+ /obj/item/food/pizza/mothic_five_cheese, \
+ /obj/item/food/pizza/mothic_white_pie, \
+ /obj/item/food/pizza/mothic_pesto, \
+ /obj/item/food/pizza/mothic_garlic, \
+ /obj/item/food/pizza/flatbread/rustic, \
+ /obj/item/food/pizza/flatbread/italic, \
+ /obj/item/food/pizza/flatbread/zmorgast, \
+ /obj/item/food/pizza/flatbread/fish, \
+ /obj/item/food/pizza/flatbread/mushroom, \
+ /obj/item/food/pizza/flatbread/nutty, \
+)
+
/obj/item/food/mre_course
name = "undefined MRE course"
desc = "Something you shouldn't see. But it's edible."
@@ -97,3 +121,13 @@
new dessert(src)
new /obj/item/storage/box/gum(src)
new /obj/item/food/spacers_sidekick(src)
+
+/obj/item/pizzabox/random
+ boxtag = "Randy's Surprise"
+ boxtag_set = TRUE
+
+/obj/item/pizzabox/random/Initialize(mapload)
+ . = ..()
+ if(!pizza)
+ var/random_pizza = pick(EDIBLE_PIZZA_LIST)
+ pizza = new random_pizza(src)
diff --git a/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm b/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm
index f762b569922..8057753b143 100644
--- a/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm
+++ b/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm
@@ -50,6 +50,8 @@ GLOBAL_LIST_EMPTY(all_loadout_datums)
var/list/ckeywhitelist
/// If set, is a list of job names of which can get the loadout item
var/list/restricted_roles
+ /// If set, is a list of job names of which can't get the loadout item
+ var/list/blacklisted_roles
/// If set, is a list of species which can get the loadout item
var/list/restricted_species
/// Whether the item is restricted to supporters
diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm
index 02cf23705f1..246219c6d7e 100644
--- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm
+++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm
@@ -51,6 +51,11 @@ GLOBAL_LIST_INIT(loadout_inhand_items, generate_loadout_items(/datum/loadout_ite
name = "Skateboard"
item_path = /obj/item/melee/skateboard
+/datum/loadout_item/inhand/toolbox
+ name = "Full Toolbox"
+ item_path = /obj/item/storage/toolbox/mechanical
+ blacklisted_roles = list(JOB_PRISONER)
+
/datum/loadout_item/inhand/bouquet_mixed
name = "Mixed Bouquet"
item_path = /obj/item/bouquet
diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm
index a08577bf58b..2cde9b61b82 100644
--- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm
+++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_pocket.dm
@@ -172,7 +172,74 @@ GLOBAL_LIST_INIT(loadout_pocket_items, generate_loadout_items(/datum/loadout_ite
/datum/loadout_item/pocket_items/cross
name = "Ornate Cross"
item_path = /obj/item/crucifix
- restricted_roles = list(JOB_CHAPLAIN)
+
+/*
+* UTILITY
+*/
+
+/datum/loadout_item/pocket_items/moth_mre
+ name = "Mothic Rations Pack"
+ item_path = /obj/item/storage/box/mothic_rations
+
+/datum/loadout_item/pocket_items/cloth_ten
+ name = "Ten Cloth Sheets"
+ item_path = /obj/item/stack/sheet/cloth/ten
+
+/datum/loadout_item/pocket_items/random_pizza
+ name = "Random Pizza Box"
+ item_path = /obj/item/pizzabox/random
+
+/datum/loadout_item/pocket_items/medkit
+ name = "First-Aid Kit"
+ item_path = /obj/item/storage/medkit/regular
+
+/datum/loadout_item/pocket_items/ingredients
+ name = "Wildcard Ingredient Box"
+ item_path = /obj/item/storage/box/ingredients/wildcard
+
+/datum/loadout_item/pocket_items/six_beer
+ name = "Beer Six-Pack"
+ item_path = /obj/item/storage/cans/sixbeer
+
+/datum/loadout_item/pocket_items/six_soda
+ name = "Soda Six-Pack"
+ item_path = /obj/item/storage/cans/sixsoda
+
+/datum/loadout_item/pocket_items/power_cell
+ name = "Standard Power Cell"
+ item_path = /obj/item/stock_parts/cell
+
+/datum/loadout_item/pocket_items/soap
+ name = "Bar of Soap"
+ item_path = /obj/item/soap
+
+/datum/loadout_item/pocket_items/mini_extinguisher
+ name = "Mini Fire Extinguisher"
+ item_path = /obj/item/extinguisher/mini
+
+/datum/loadout_item/pocket_items/binoculars
+ name = "Pair of Binoculars"
+ item_path = /obj/item/binoculars
+
+/datum/loadout_item/pocket_items/drugs_happy
+ name = "Happy Pills"
+ item_path = /obj/item/storage/pill_bottle/happy
+
+/datum/loadout_item/pocket_items/drugs_lsd
+ name = "Mindbreaker Pills"
+ item_path = /obj/item/storage/pill_bottle/lsd
+
+/datum/loadout_item/pocket_items/drugs_weed
+ name = "Cannabis Seeds"
+ item_path = /obj/item/seeds/cannabis
+
+/datum/loadout_item/pocket_items/drugs_reishi
+ name = "Reishi Seeds"
+ item_path = /obj/item/seeds/reishi
+
+/datum/loadout_item/pocket_items/drugs_liberty
+ name = "Liberty Cap Seeds"
+ item_path = /obj/item/seeds/liberty
/*
* FRAGRANCES
diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm
index 1ac2cfcb6b4..a0189f038fc 100644
--- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm
+++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_shoes.dm
@@ -211,6 +211,10 @@ GLOBAL_LIST_INIT(loadout_shoes, generate_loadout_items(/datum/loadout_item/shoes
name = "Sport Shoes"
item_path = /obj/item/clothing/shoes/sports
+/datum/loadout_item/shoes/rollerskates
+ name = "Roller Skates"
+ item_path = /obj/item/clothing/shoes/wheelys/rollerskates
+
/*
* SEASONAL
*/
diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm
index b205d4f55d5..b689901dbd2 100644
--- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm
+++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm
@@ -392,6 +392,10 @@ GLOBAL_LIST_INIT(loadout_toys, generate_loadout_items(/datum/loadout_item/toys))
name = "Box of Crayons"
item_path = /obj/item/storage/crayons
+/datum/loadout_item/toys/spray_can
+ name = "Spray Can"
+ item_path = /obj/item/toy/crayon/spraycan
+
/datum/loadout_item/toys/eightball
name = "Magic Eightball"
item_path = /obj/item/toy/eightball
diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm
index 7710108bac0..b3187589972 100644
--- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm
+++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm
@@ -96,6 +96,7 @@
if("display_restrictions")
display_job_restrictions(interacted_item)
+ display_job_blacklists(interacted_item)
display_species_restrictions(interacted_item)
// Clears the loadout list entirely.
@@ -234,22 +235,33 @@
if(INFO_DESCRIBED in owner.prefs.loadout_list[item.item_path])
owner.prefs.loadout_list[item.item_path] -= INFO_DESCRIBED
+/// If only certain jobs are allowed to equip this loadout item, display which
/datum/loadout_manager/proc/display_job_restrictions(datum/loadout_item/item)
if(!length(item.restricted_roles))
return
- var/composed_message = span_boldnotice("The [initial(item.item_path.name)] is restricted to the following roles:
")
+ var/composed_message = span_boldnotice("The [initial(item.item_path.name)] is whitelisted to the following roles:
")
for(var/job_type in item.restricted_roles)
composed_message += span_green("[job_type]
")
to_chat(owner, examine_block(composed_message))
+/// If certain jobs aren't allowed to equip this loadout item, display which
+/datum/loadout_manager/proc/display_job_blacklists(datum/loadout_item/item)
+ if(!length(item.blacklisted_roles))
+ return
+ var/composed_message = span_boldnotice("The [initial(item.item_path.name)] is blacklisted from the following roles:
")
+ for(var/job_type in item.blacklisted_roles)
+ composed_message += span_red("[job_type]
")
+
+ to_chat(owner, examine_block(composed_message))
+
/// If only a certain species is allowed to equip this loadout item, display which
/datum/loadout_manager/proc/display_species_restrictions(datum/loadout_item/item)
if(!length(item.restricted_species))
return
var/composed_message = span_boldnotice("\The [initial(item.item_path.name)] is restricted to the following species:
")
for(var/species_type in item.restricted_species)
- composed_message += span_green("[species_type]
")
+ composed_message += span_grey("[species_type]
")
to_chat(owner, examine_block(composed_message))
@@ -351,6 +363,7 @@
formatted_item["is_greyscale"] = !!(initial(loadout_atom.greyscale_config) && initial(loadout_atom.greyscale_colors) && (initial(loadout_atom.flags_1) & IS_PLAYER_COLORABLE_1))
formatted_item["is_renamable"] = item.can_be_named
formatted_item["is_job_restricted"] = !isnull(item.restricted_roles)
+ formatted_item["is_job_blacklisted"] = !isnull(item.blacklisted_roles)
formatted_item["is_species_restricted"] = !isnull(item.restricted_species)
formatted_item["is_donator_only"] = !isnull(item.donator_only)
formatted_item["is_ckey_whitelisted"] = !isnull(item.ckeywhitelist)
diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm
index 9c5b53ebada..afbb54a68b2 100644
--- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm
+++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm
@@ -48,6 +48,11 @@
to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job restrictions!"))
continue
+ if(item.blacklisted_roles && equipping_job && (equipping_job.title in item.blacklisted_roles))
+ if(client)
+ to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job blacklists!"))
+ continue
+
if(item.restricted_species && !(dna.species.id in item.restricted_species))
if(client)
to_chat(src, span_warning("You were unable to get a loadout item ([initial(item.item_path.name)]) due to species restrictions!"))
@@ -65,6 +70,11 @@
to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job restrictions!"))
continue
+ if(item.blacklisted_roles && equipping_job && (equipping_job.title in item.blacklisted_roles))
+ if(client)
+ to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job blacklists!"))
+ continue
+
if(item.restricted_species && !(dna.species.id in item.restricted_species))
if(client)
to_chat(src, span_warning("You were unable to get a loadout item ([initial(item.item_path.name)]) due to species restrictions!"))
diff --git a/modular_skyrat/modules/modular_items/code/cross.dm b/modular_skyrat/modules/modular_items/code/cross.dm
index 2d3b1bf3d4e..20ce2d86325 100644
--- a/modular_skyrat/modules/modular_items/code/cross.dm
+++ b/modular_skyrat/modules/modular_items/code/cross.dm
@@ -5,10 +5,10 @@
icon_state = "cross_ornate"
lefthand_file = 'modular_skyrat/modules/modular_items/icons/cross_left.dmi'
righthand_file = 'modular_skyrat/modules/modular_items/icons/cross_right.dmi'
- force = 10 //Gem-encrusted and reinforced with GOD
+ force = 5 //Gem-encrusted and reinforced with GOD
throw_speed = 3
throw_range = 4
- throwforce = 15
+ throwforce = 10
w_class = WEIGHT_CLASS_TINY
/datum/crafting_recipe/cross
diff --git a/tgui/packages/tgui/interfaces/LoadoutManager.js b/tgui/packages/tgui/interfaces/LoadoutManager.js
index 01118b0414a..abcc83ebbd6 100644
--- a/tgui/packages/tgui/interfaces/LoadoutManager.js
+++ b/tgui/packages/tgui/interfaces/LoadoutManager.js
@@ -101,6 +101,18 @@ export const LoadoutManager = (props, context) => {
)}
{!!item.is_job_restricted && (
+
+
+ )}
+ {!!item.is_job_blacklisted && (
)}
+ {!!item.is_species_restricted && (
+
+
+ )}
{!!item.is_donator_only && (