diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm
index 0a7493fb63d..5436a1ef32d 100644
--- a/code/datums/recipe.dm
+++ b/code/datums/recipe.dm
@@ -38,6 +38,8 @@
var/list/items // example: =list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo
var/result //example: = /obj/item/reagent_containers/food/snacks/donut
var/time = 100 // 1/10 part of second
+ /// Whether or not an upgraded kitchen machine will create more products using the same amount of ingredients
+ var/duplicate = TRUE
var/byproduct // example: = /obj/item/kitchen/mould // byproduct to return, such as a mould or trash
/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index a5cf04a9b9a..62932faf19d 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -358,17 +358,26 @@
/obj/item/storage/box/donkpockets
name = "box of donk-pockets"
- desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes."
+ desc = "A heavy, insulated box that reads, Instructions: Heat in microwave. Product will cool if not eaten within seven minutes. Store product in box to keep warm."
+ storage_slots = 6
+ can_hold = list(
+ /obj/item/reagent_containers/food/snacks/donkpocket,
+ /obj/item/reagent_containers/food/snacks/warmdonkpocket,
+ /obj/item/reagent_containers/food/snacks/warmdonkpocket_weak,
+ /obj/item/reagent_containers/food/snacks/syndidonkpocket)
icon_state = "donk_kit"
/obj/item/storage/box/donkpockets/populate_contents()
for(var/I in 1 to 6)
new /obj/item/reagent_containers/food/snacks/donkpocket(src)
+/obj/item/storage/box/donkpockets/empty/populate_contents()
+ return
+
/obj/item/storage/box/syndidonkpockets
name = "box of donk-pockets"
desc = "This box feels slightly warm"
- icon_state = "donk_kit"
+ icon_state = "donk_kit_synd"
/obj/item/storage/box/syndidonkpockets/populate_contents()
for(var/I in 1 to 6)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index fbb8076acd3..38d908a7b58 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -468,6 +468,14 @@
reqs = list(/obj/item/paper = 5)
category = CAT_MISC
+/datum/crafting_recipe/donk_box
+ name = "Donk Pocket Box"
+ result = list(/obj/item/storage/box/donkpockets/empty)
+ time = 10
+ reqs = list(/obj/item/storage/box,
+ /obj/item/stack/sheet/plastic,
+ /obj/item/stack/sheet/metal)
+
/datum/crafting_recipe/flashlight_eyes
name = "Flashlight Eyes"
result = list(/obj/item/organ/internal/eyes/cybernetic/flashlight)
diff --git a/code/modules/food_and_drinks/food/foods/misc_food.dm b/code/modules/food_and_drinks/food/foods/misc_food.dm
index 0b65f5d2234..22ec624f7cf 100644
--- a/code/modules/food_and_drinks/food/foods/misc_food.dm
+++ b/code/modules/food_and_drinks/food/foods/misc_food.dm
@@ -114,9 +114,47 @@
filling_color = "#DEDEAB"
list_reagents = list("nutriment" = 4)
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
+ /// Is the donk pocket warm or has it cooled - this affects what chemicals it yields when consumed
+ var/warm = TRUE
+ /// This stores the timer for how long the donk pocket takes to cool, seven minutes, that is paused inside of a donk pocket box
+ var/cool_timer
+ /// This is used to check the world time when the donk pocket was heated or last removed from a donk pocket box, for restarting the timer
+ var/heated_at
+ /// This tracks how much time the donk pocket has already been cooling for when its timer is paused
+ var/subtracted_time = 0
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket/Initialize(mapload)
+ . = ..()
+ donk_heat()
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket/proc/donk_heat()
+ heated_at = world.time
+ cool_timer = addtimer(CALLBACK(src, PROC_REF(donk_cool)), 7 MINUTES - subtracted_time, TIMER_UNIQUE|TIMER_STOPPABLE)
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket/proc/donk_cool()
+ name = "cold Donk-pocket"
+ desc = "The food of choice for the seasoned traitor. This one is cold."
+ warm = FALSE
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket/on_enter_storage(obj/item/storage/S)
+ . = ..()
+ if(!cool_timer)
+ return
+ if(istype(S, /obj/item/storage/box/donkpockets))
+ deltimer(cool_timer)
+ subtracted_time += (world.time - heated_at)
+ cool_timer = null
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket/on_exit_storage(obj/item/storage/S)
+ . = ..()
+ if(warm)
+ donk_heat()
/obj/item/reagent_containers/food/snacks/warmdonkpocket/Post_Consume(mob/living/M)
- M.reagents.add_reagent("omnizine", 15)
+ if(warm)
+ M.reagents.add_reagent("omnizine", 15)
+ return
+ M.reagents.add_reagent("weak_omnizine", 5)
/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak
name = "lukewarm Donk-pocket"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index 28298addbb6..8a1131b8d23 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -334,9 +334,9 @@
qdel(O)
source.reagents.clear_reagents()
-
- var/reagents_per_serving = temp_reagents.total_volume / efficiency
- for(var/i in 1 to efficiency) // Extra servings when upgraded, ingredient reagents split equally
+ var/portions = recipe.duplicate ? efficiency : 1
+ var/reagents_per_serving = temp_reagents.total_volume / portions
+ for(var/i in 1 to portions) // Extra servings when upgraded, ingredient reagents split equally
var/obj/cooked = new recipe.result(loc)
temp_reagents.trans_to(cooked, reagents_per_serving, no_react = TRUE) // Don't react with the abstract holder please
temp_reagents.clear_reagents()
@@ -347,7 +347,7 @@
if(istype(source, /obj/item/mixing_bowl)) // Cooking in mixing bowls returns them dirtier
var/obj/item/mixing_bowl/mb = source
- mb.make_dirty(5 * efficiency)
+ mb.make_dirty(5 * portions)
mb.forceMove(loc)
stop()
diff --git a/code/modules/food_and_drinks/recipes/recipes_microwave.dm b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
index 9cb483de4f0..c69ee225984 100644
--- a/code/modules/food_and_drinks/recipes/recipes_microwave.dm
+++ b/code/modules/food_and_drinks/recipes/recipes_microwave.dm
@@ -155,11 +155,19 @@
result = /obj/item/reagent_containers/food/snacks/donkpocket
/datum/recipe/microwave/warmdonkpocket
+ duplicate = FALSE
items = list(
/obj/item/reagent_containers/food/snacks/donkpocket
)
result = /obj/item/reagent_containers/food/snacks/warmdonkpocket
+/datum/recipe/microwave/reheatwarmdonkpocket
+ duplicate = FALSE
+ items = list(
+ /obj/item/reagent_containers/food/snacks/warmdonkpocket
+ )
+ result = /obj/item/reagent_containers/food/snacks/warmdonkpocket
+
/datum/recipe/microwave/eggplantparm
items = list(
/obj/item/reagent_containers/food/snacks/cheesewedge,
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 51fd591f132..820095b2e07 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ