From 1d258388c94f62d494ce7bcb3b94e3f3496d801b Mon Sep 17 00:00:00 2001
From: Casper3667 <8396443+Casper3667@users.noreply.github.com>
Date: Sat, 22 Aug 2026 13:19:45 +0000
Subject: [PATCH] The takeout box (#23068)
This adds a takeout box that can be crafted from cardboard and found in
the kitchen dinnerware vending machine.
Food (made and grown) can be put into it as well as liquid reagents to
create a meal. It cannot be taken out once put in it.
When all food in it has been eaten, it is turned into a trash item.
The box itself can be eaten from with any utensil and can be opened and
closed with alt-click or using it in-hand.
### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:
- Takeout boxes
| Path | Original Author | License |
| --- | --- | --- |
| icons/obj/kitchen.dmi | Tomixcomics (Aurora Station) | CC-BY |
---
.../structures/machinery/vending/service.dm | 1 +
code/modules/cooking/plates.dm | 164 +++++++++++++++++-
code/modules/materials/material_recipes.dm | 1 +
html/changelogs/KitchenTakeout.yml | 6 +
icons/obj/kitchen.dmi | Bin 5453 -> 12501 bytes
5 files changed, 167 insertions(+), 5 deletions(-)
create mode 100644 html/changelogs/KitchenTakeout.yml
diff --git a/code/game/objects/structures/machinery/vending/service.dm b/code/game/objects/structures/machinery/vending/service.dm
index 77771bdcd75..86a44ffe512 100644
--- a/code/game/objects/structures/machinery/vending/service.dm
+++ b/code/game/objects/structures/machinery/vending/service.dm
@@ -38,6 +38,7 @@
/obj/item/reagent_containers/ladle = 4,
/obj/item/storage/toolbox/lunchbox/nt = 6,
/obj/item/storage/toolbox/lunchbox/idris = 6,
+ /obj/item/reagent_containers/bowl/takeout_box = 6,
/obj/item/reagent_containers/glass/rag = 8,
/obj/item/evidencebag/plasticbag = 20,
/obj/item/tray = 12,
diff --git a/code/modules/cooking/plates.dm b/code/modules/cooking/plates.dm
index b125e4f3f4e..7ca5d7d42d8 100644
--- a/code/modules/cooking/plates.dm
+++ b/code/modules/cooking/plates.dm
@@ -15,6 +15,10 @@ Plates that can hold your cooking stuff
can_be_placed_into = list()
atom_flags = ATOM_FLAG_OPEN_CONTAINER
var/grease = FALSE
+ /// What utensil, if any, can't take food from the object
+ var/useless_utensil = /obj/item/material/kitchen/utensil/fork
+ /// Is the content liquid?
+ var/is_liquid_content = TRUE
/obj/item/reagent_containers/bowl/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
@@ -30,9 +34,7 @@ Plates that can hold your cooking stuff
/obj/item/reagent_containers/bowl/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/material/kitchen/utensil))
var/obj/item/material/kitchen/utensil/U = attacking_item
- if(istype(attacking_item,/obj/item/material/kitchen/utensil/fork))
- to_chat(user, SPAN_NOTICE("You uselessly pass \the [U] through \the [src]'s contents."))
- playsound(user.loc, SFX_POUR, 50, 1)
+ if(!can_scoop_with_utensil(U, user))
return
else
if(U.scoop_food)
@@ -40,7 +42,7 @@ Plates that can hold your cooking stuff
U.create_reagents(5)
if(U.reagents.total_volume > 0)
- to_chat(user, SPAN_WARNING("You already have liquid on \the [U]."))
+ to_chat(user, SPAN_WARNING("You already have food on \the [U]."))
return
user.visible_message(
@@ -54,9 +56,18 @@ Plates that can hold your cooking stuff
I.color = reagents.get_color()
U.AddOverlays(I)
reagents.trans_to_obj(U, min(reagents.total_volume,U.transfer_amt))
- U.is_liquid = TRUE
+ U.is_liquid = is_liquid_content
return
+/// Does the utensil work with this object?
+/obj/item/reagent_containers/bowl/proc/can_scoop_with_utensil(obj/item/material/kitchen/utensil/U, mob/user)
+ if(useless_utensil && istype(U, useless_utensil))
+ to_chat(user, SPAN_NOTICE("You uselessly pass \the [U] through \the [src]'s contents."))
+ playsound(user.loc, SFX_POUR, 50, 1)
+ return FALSE
+ else
+ return TRUE
+
/obj/item/reagent_containers/bowl/on_reagent_change()
if(!reagents.total_volume && !grease)
grease = TRUE
@@ -109,6 +120,8 @@ Plates that can hold your cooking stuff
desc = "A plate for dishing up the finest of cuisine."
atom_flags = 0
icon_state = "plate"
+ useless_utensil = null
+ is_liquid_content = FALSE
var/obj/item/holding
/obj/item/reagent_containers/bowl/plate/feedback_hints(mob/user, distance, is_adjacent)
@@ -228,3 +241,144 @@ Plates that can hold your cooking stuff
var/image/over = image(icon, "gravy_over")
over.color = reagents.get_color()
AddOverlays(over)
+
+/*
+ * Takeout boxes
+ * Food is converted into reagents when put into them.
+ * This avoids needing to track the individual food and lets it mix easier with other reagents.
+*/
+/obj/item/reagent_containers/bowl/takeout_box
+ name = "takeout box"
+ desc = "A disposable takeout box for packing away a meal."
+ icon_state = "takeout_box"
+ item_state = "takeout_box"
+ fragile = 0
+ shatter_material = MATERIAL_CARDBOARD
+ // A bit overkill but it lets the chefs have plenty of space for creativity
+ volume = 60
+ useless_utensil = null
+ contained_sprite = TRUE
+ drop_sound = 'sound/items/drop/cardboard_sheet.ogg'
+ pickup_sound = 'sound/items/pickup/cardboard_sheet.ogg'
+ is_liquid_content = FALSE
+ /// Has it been filled with food
+ var/has_been_used = FALSE
+ /// Is the box currently closed
+ var/closed = FALSE
+ /// Can it be folded? If so, into what?
+ var/foldable = /obj/item/stack/material/cardboard
+
+/obj/item/reagent_containers/bowl/takeout_box/mechanics_hints(mob/user, distance, is_adjacent)
+ . = list()
+ . += "Click with food to put food into it."
+ . += "If it has food on it, click with cutlery to scoop some food up."
+ . += "Use the box in-hand or alt-click it to open or close it."
+
+/obj/item/reagent_containers/bowl/takeout_box/feedback_hints(mob/user, distance, is_adjacent)
+ . = ..()
+ if(reagents && reagents.total_volume)
+ . += SPAN_INFO("It contains [reagents.total_volume] units of food.")
+
+/obj/item/reagent_containers/bowl/takeout_box/attackby(obj/item/attacking_item, mob/user)
+ if(closed)
+ to_chat(user, SPAN_WARNING("\The [src] is closed."))
+ return
+
+ if(istype(attacking_item, /obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/food = attacking_item
+
+ if(!food.reagents || !food.reagents.total_volume)
+ to_chat(user, SPAN_WARNING("There is nothing edible left in \the [food]."))
+ return
+
+ if(food.reagents.total_volume > REAGENTS_FREE_SPACE(reagents))
+ to_chat(user, SPAN_WARNING("There isn't enough room in \the [src] for \the [food]."))
+ return
+
+ user.visible_message("\The [user] puts \the [food] into \the [src].", SPAN_NOTICE("You put \the [food] into \the [src]."))
+
+ has_been_used = TRUE
+ food.reagents.trans_to(src, food.reagents.total_volume)
+ user.unEquip(food)
+ qdel(food)
+ update_icon()
+ return
+
+ ..()
+
+/obj/item/reagent_containers/bowl/takeout_box/attack_self(mob/user)
+ close_box(user)
+
+/obj/item/reagent_containers/bowl/takeout_box/AltClick(mob/user)
+ . = ..()
+ close_box(user)
+
+/obj/item/reagent_containers/bowl/takeout_box/proc/close_box(mob/user)
+ closed = !closed
+
+ if(closed)
+ atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER
+ to_chat(user, SPAN_NOTICE("You close \the [src]."))
+ else
+ atom_flags |= ATOM_FLAG_OPEN_CONTAINER
+ to_chat(user, SPAN_NOTICE("You open \the [src]."))
+
+ playsound(src.loc, 'sound/items/storage/boxfold.ogg', 30, 1)
+ update_icon()
+
+/obj/item/reagent_containers/bowl/takeout_box/on_reagent_change()
+ if(reagents && reagents.total_volume)
+ has_been_used = TRUE
+ update_icon()
+ else if(has_been_used)
+ turn_into_trash()
+
+/obj/item/reagent_containers/bowl/takeout_box/update_icon()
+ if(closed)
+ icon_state = "takeout_box_closed"
+ else if(reagents && reagents.total_volume)
+ icon_state = "takeout_box_full"
+ else
+ icon_state = "takeout_box"
+
+/obj/item/reagent_containers/bowl/takeout_box/proc/turn_into_trash()
+ var/mob/holder
+ if(ismob(loc))
+ holder = loc
+
+ var/obj/item/trash/takeout_box/dirty_box = new(loc)
+ if(holder)
+ holder.drop_from_inventory(src)
+ holder.put_in_hands(dirty_box)
+ else
+ dirty_box.pixel_x = src.pixel_x
+ dirty_box.pixel_y = src.pixel_y
+ qdel(src)
+
+/obj/item/reagent_containers/bowl/takeout_box/verb/fold_box()
+ set name = "Fold takeout box"
+ set category = "Object.Held"
+ set src in usr
+
+ if(has_been_used)
+ to_chat(usr, SPAN_NOTICE("\The [src] is too dirty to be folded."))
+ return
+
+ if(ispath(src.foldable))
+ if(contents.len)
+ return
+ to_chat(usr, SPAN_NOTICE("You fold \the [src] flat."))
+ playsound(src.loc, 'sound/items/storage/boxfold.ogg', 30, 1)
+ var/obj/item/foldable = new src.foldable()
+ usr.put_in_hands(foldable)
+ qdel(src)
+
+/obj/item/trash/takeout_box
+ name = "dirty takeout box"
+ desc = "A greasy, empty takeout box. It should probably be thrown away."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "takeout_box_dirty"
+ item_state = "takeout_box"
+ drop_sound = 'sound/items/drop/cardboard_sheet.ogg'
+ pickup_sound = 'sound/items/pickup/cardboard_sheet.ogg'
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 9067572b516..0f84a5a2a37 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -191,6 +191,7 @@
list(
new /datum/stack_recipe("box", /obj/item/storage/box/blank),
new /datum/stack_recipe("large box", /obj/item/storage/box/large/blank, 2),
+ new /datum/stack_recipe("takeout box", /obj/item/reagent_containers/bowl/takeout_box, 1),
new /datum/stack_recipe("donut box", /obj/item/storage/box/fancy/donut/empty),
new /datum/stack_recipe("egg carton", /obj/item/storage/box/fancy/egg_box),
new /datum/stack_recipe("candle pack", /obj/item/storage/box/fancy/candle_box/empty),
diff --git a/html/changelogs/KitchenTakeout.yml b/html/changelogs/KitchenTakeout.yml
new file mode 100644
index 00000000000..d41c64325eb
--- /dev/null
+++ b/html/changelogs/KitchenTakeout.yml
@@ -0,0 +1,6 @@
+author: TheGreyWolf
+
+delete-after: True
+
+changes:
+ - rscadd: "Takeout boxes now exist. They can be crafted from cardboard and found in the kitchen dinnerware vending machine."
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 5efdf6223cb0c8a4f76e245ea30fc388ba7af4c5..36041caa71bc16360c0fe4d6630a91a84eb626d0 100644
GIT binary patch
literal 12501
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
BV5R^7