diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index a2145e67ee..c6bb350929 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -58,6 +58,21 @@
new /obj/effect/abstract/DPtarget(get_turf(src), pod)
+/obj/item/choice_beacon/ingredients
+ name = "ingredient box delivery beacon"
+ desc = "Summon a box of ingredients from a wide selection!"
+ icon_state = "gangtool-red"
+
+/obj/item/choice_beacon/ingredients/generate_display_names()
+ var/static/list/ingredientboxes
+ if(!ingredientboxes)
+ ingredientboxes = list()
+ var/list/templist = typesof(/obj/item/storage/box/ingredients)
+ for(var/V in templist)
+ var/obj/item/storage/box/ingredients/A = V
+ ingredientboxes[initial(A.theme_name)] = A
+ return ingredientboxes
+
/obj/item/choice_beacon/hero
name = "heroic beacon"
desc = "To summon heroes from the past to protect the future."
@@ -72,7 +87,6 @@
hero_item_list[initial(A.name)] = A
return hero_item_list
-
/obj/item/storage/box/hero
name = "Courageous Tomb Raider - 1940's."
@@ -115,4 +129,5 @@
icon = 'icons/obj/supermatter.dmi'
icon_state = "supermatterspray"
w_class = WEIGHT_CLASS_SMALL
- var/usesleft = 2
\ No newline at end of file
+ var/usesleft = 2
+
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a54d126abb..b596e40e36 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -120,6 +120,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
)), \
null, \
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50), \
new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \
))
@@ -255,6 +256,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
null, \
new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
+ new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
))
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 489704dbd5..a67757a535 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -946,12 +946,47 @@
/obj/item/reagent_containers/food/snacks/grown/apple,
/obj/item/reagent_containers/food/snacks/chocolatebar,
/obj/item/reagent_containers/food/snacks/grown/cherries,
+ /obj/item/reagent_containers/food/snacks/grown/berries,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/cabbage,
/obj/item/reagent_containers/food/snacks/grown/soybeans,
/obj/item/reagent_containers/food/snacks/grown/corn,
/obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet,
- /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle)
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle,
+ /obj/item/reagent_containers/food/snacks/faggot,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/orange,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lime,
+ /obj/item/reagent_containers/food/snacks/grown/bluecherries,
+ /obj/item/reagent_containers/food/snacks/grown/cocoapod,
+ /obj/item/reagent_containers/food/snacks/grown/vanillapod,
+ /obj/item/reagent_containers/food/snacks/grown/grapes,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry,
+ /obj/item/reagent_containers/food/snacks/grown/whitebeet,
+ /obj/item/reagent_containers/food/snacks/meat/slab/bear,
+ /obj/item/reagent_containers/food/snacks/meat/slab/spider,
+ /obj/item/reagent_containers/food/snacks/spidereggs,
+ /obj/item/reagent_containers/food/snacks/carpmeat,
+ /obj/item/reagent_containers/food/snacks/meat/slab/xeno,
+ /obj/item/reagent_containers/food/snacks/meat/slab/corgi,
+ /obj/item/reagent_containers/food/snacks/grown/oat,
+ /obj/item/reagent_containers/food/snacks/grown/wheat,
+ /obj/item/reagent_containers/honeycomb,
+ /obj/item/reagent_containers/food/snacks/grown/watermelon,
+ /obj/item/reagent_containers/food/snacks/grown/onion,
+ /obj/item/reagent_containers/food/snacks/grown/peach,
+ /obj/item/reagent_containers/food/snacks/grown/peanut,
+ /obj/item/reagent_containers/food/snacks/grown/pineapple,
+ /obj/item/reagent_containers/food/snacks/grown/pumpkin,
+ /obj/item/reagent_containers/food/snacks/meat/rawcrab,
+ /obj/item/reagent_containers/food/snacks/meat/slab/goliath,
+ /obj/item/reagent_containers/food/snacks/meat/slab/chicken,
+ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime,
+ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem,
+ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
+ /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton,
+ /obj/item/reagent_containers/food/snacks/egg,
+ /obj/item/reagent_containers/food/snacks/grown/eggplant)
new randomFood(src)
/obj/item/storage/box/ingredients/fiesta
@@ -1061,6 +1096,15 @@
new /obj/item/reagent_containers/food/snacks/grown/cabbage(src)
new /obj/item/reagent_containers/food/snacks/grown/chili(src)
+/obj/item/storage/box/ingredients/sushi
+ theme_name = "sushi"
+
+/obj/item/storage/box/ingredients/sushi/PopulateContents()
+ for(var/i in 1 to 3)
+ new /obj/item/reagent_containers/food/snacks/sea_weed(src)
+ new /obj/item/reagent_containers/food/snacks/carpmeat(src)
+ new /obj/item/reagent_containers/food/snacks/meat/rawcrab(src)
+
/obj/item/storage/box/emptysandbags
name = "box of empty sandbags"
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index bfbd1d519b..f11c89d00c 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -24,6 +24,7 @@
w_class = WEIGHT_CLASS_SMALL
armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 30, "acid" = 30)
resistance_flags = FIRE_PROOF | ACID_PROOF
+ mutantrace_variation = STYLE_MUZZLE
var/voice_unknown = TRUE ///This makes it so that your name shows up as unknown when wearing the mask.
/obj/item/clothing/mask/luchador
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
index b18dfc7968..204e5ce455 100644
--- a/code/modules/food_and_drinks/food/snacks_bread.dm
+++ b/code/modules/food_and_drinks/food/snacks_bread.dm
@@ -189,12 +189,11 @@
GLOBAL_VAR_INIT(frying_hardmode, TRUE)
GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE)
GLOBAL_LIST_INIT(frying_bad_chems, list(
-/datum/reagent/toxin/bad_food = 10,
-/datum/reagent/clf3 = 2,
+/datum/reagent/toxin/bad_food = 3,
/datum/reagent/drug/aranesp = 2,
-/datum/reagent/blackpowder = 10,
-/datum/reagent/phlogiston = 3,
-/datum/reagent/toxin/cyanide = 3,
+/datum/reagent/toxin = 2,
+/datum/reagent/lithium = 2,
+/datum/reagent/mercury = 2,
))
/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried)
@@ -227,8 +226,10 @@ GLOBAL_LIST_INIT(frying_bad_chems, list(
var/bad_chem = GLOB.frying_bad_chems[R]
var/bad_chem_amount = GLOB.frying_bad_chems[bad_chem]
if(GLOB.frying_bad_chem_add_volume)
- reagents.maximum_volume += bad_chem_amount
+ reagents.maximum_volume += bad_chem_amount + 2 //Added room for condensed cooking oil
reagents.add_reagent(bad_chem, bad_chem_amount)
+ //All fried inedible items also get condensed cooking oil added, which induces minor vomiting and heart damage
+ reagents.add_reagent(/datum/reagent/toxin/condensed_cooking_oil, 2)
/obj/item/reagent_containers/food/snacks/deepfryholder/Destroy()
if(trash)
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index db76af4d32..b41c0d8505 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -27,7 +27,7 @@
suit = /obj/item/clothing/suit/toggle/chef
head = /obj/item/clothing/head/chefhat
mask = /obj/item/clothing/mask/fakemoustache/italian
- backpack_contents = list(/obj/item/sharpener = 1)
+ backpack_contents = list(/obj/item/sharpener = 1, /obj/item/choice_beacon/ingredients = 1)
/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
@@ -43,10 +43,6 @@
..()
if(visualsOnly)
return
- var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients)
- var/chosen_box = pick(possible_boxes)
- var/obj/item/storage/box/I = new chosen_box(src)
- H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK)
var/datum/martial_art/cqc/under_siege/justacook = new
justacook.teach(H)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 1309fae60c..103e8164f9 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -702,8 +702,8 @@
/mob/living/do_resist_grab(moving_resist, forced, silent = FALSE)
. = ..()
- if(pulledby.grab_state)
- if(CHECK_MOBILITY(src, MOBILITY_STAND) && prob(30/pulledby.grab_state))
+ if(pulledby.grab_state > GRAB_PASSIVE)
+ if(CHECK_MOBILITY(src, MOBILITY_RESIST) && prob(30/pulledby.grab_state))
visible_message("[src] has broken free of [pulledby]'s grip!")
pulledby.stop_pulling()
return TRUE
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index cfb0588f8f..305d12b3c5 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -495,6 +495,24 @@
toxpwr = 0.5
taste_description = "bad cooking"
+/datum/reagent/toxin/condensed_cooking_oil
+ name = "Condensed Cooking Oil"
+ description = "Taste the consequences of your mistakes."
+ reagent_state = LIQUID
+ color = "#d6d6d8"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ toxpwr = 0
+ taste_mult = -2
+ taste_description = "awful cooking"
+
+/datum/reagent/toxin/condensed_cooking_oil/on_mob_life(mob/living/carbon/M)
+ if(prob(15))
+ M.vomit()
+ else
+ if(prob(40))
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5) //For reference, bungotoxin does 3
+ ..()
+
/datum/reagent/toxin/itching_powder
name = "Itching Powder"
description = "A powder that induces itching upon contact with the skin. Causes the victim to scratch at their itches and has a very low chance to decay into Histamine."
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 74e99cc326..800d66969d 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -388,3 +388,67 @@
/obj/item/reagent_containers/glass/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "bottle")
+
+//Mortar & Pestle
+
+/obj/item/pestle
+ name = "pestle"
+ desc = "An ancient, simple tool used in conjunction with a mortar to grind or juice items."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "pestle"
+ force = 4
+
+/obj/item/reagent_containers/glass/mortar
+ name = "mortar"
+ desc = "A specially formed bowl of ancient design. It is possible to crush or juice items placed in it using a pestle; however the process, unlike modern methods, is slow and physically exhausting. Alt click to eject the item."
+ icon_state = "mortar"
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
+ item_flags = NO_MAT_REDEMPTION
+ reagent_flags = OPENCONTAINER
+ spillable = TRUE
+ var/obj/item/grinded
+
+/obj/item/reagent_containers/glass/mortar/AltClick(mob/user)
+ . = ..()
+ if(grinded)
+ grinded.forceMove(drop_location())
+ grinded = null
+ to_chat(user, "You eject the item inside.")
+ return TRUE
+
+/obj/item/reagent_containers/glass/mortar/attackby(obj/item/I, mob/living/carbon/human/user)
+ ..()
+ if(istype(I,/obj/item/pestle))
+ if(grinded)
+ if(IS_STAMCRIT(user))
+ to_chat(user, "You are too tired to work!")
+ return
+ to_chat(user, "You start grinding...")
+ if((do_after(user, 25, target = src)) && grinded)
+ user.adjustStaminaLoss(20)
+ if(grinded.juice_results) //prioritize juicing
+ grinded.on_juice()
+ reagents.add_reagent_list(grinded.juice_results)
+ to_chat(user, "You juice [grinded] into a fine liquid.")
+ QDEL_NULL(grinded)
+ return
+ grinded.on_grind()
+ reagents.add_reagent_list(grinded.grind_results)
+ if(grinded.reagents) //food and pills
+ grinded.reagents.trans_to(src, grinded.reagents.total_volume)
+ to_chat(user, "You break [grinded] into powder.")
+ QDEL_NULL(grinded)
+ return
+ return
+ else
+ to_chat(user, "There is nothing to grind!")
+ return
+ if(grinded)
+ to_chat(user, "There is something inside already!")
+ return
+ if(I.juice_results || I.grind_results)
+ I.forceMove(src)
+ grinded = I
+ return
+ to_chat(user, "You can't grind this!")
diff --git a/html/changelogs/AutoChangeLog-pr-11546.yml b/html/changelogs/AutoChangeLog-pr-11546.yml
new file mode 100644
index 0000000000..260204e8e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11546.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Ports over TG's Mortars and Pestles."
diff --git a/html/changelogs/AutoChangeLog-pr-11580.yml b/html/changelogs/AutoChangeLog-pr-11580.yml
new file mode 100644
index 0000000000..4dd8e6daf3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11580.yml
@@ -0,0 +1,5 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "new reagent 'Condensed Cooking Oil'"
+ - tweak: "list of chems that can go into fried non-food items was changed"
diff --git a/html/changelogs/AutoChangeLog-pr-11590.yml b/html/changelogs/AutoChangeLog-pr-11590.yml
new file mode 100644
index 0000000000..e8241cb0ec
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11590.yml
@@ -0,0 +1,6 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "added beacon for cooks to choose an ingredient box, which replaces the random box they used to receive"
+ - rscadd: "added a new sushi ingredients box"
+ - rscadd: "added more items to the wildcard box's possible contents"
diff --git a/html/changelogs/AutoChangeLog-pr-11591.yml b/html/changelogs/AutoChangeLog-pr-11591.yml
new file mode 100644
index 0000000000..f2c06035f1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11591.yml
@@ -0,0 +1,4 @@
+author: "zeroisthebiggay"
+delete-after: True
+changes:
+ - bugfix: "insidious balaclava muzzlepsprite works"
diff --git a/html/changelogs/AutoChangeLog-pr-11601.yml b/html/changelogs/AutoChangeLog-pr-11601.yml
new file mode 100644
index 0000000000..d327045d12
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11601.yml
@@ -0,0 +1,4 @@
+author: "Kraseo"
+delete-after: True
+changes:
+ - bugfix: "You can break out of neckgrabs once more."
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index b13e06e824..76094938e8 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ