Kitchen rework part 1: machines and recipes. (#28277)

* Kitchen rework part 1: machines and recipes.

* update oldstation

* update updatepaths script number

* fix blank icon test

* remove old deep fryer completely

* fix duped recipes and recipe datum names

* add chef PDA cart to chefdrobe

* nerf grill wood consumption rate

* multiply food for cooking machine rating

* fix runtime

* add cookware to syndie base and oldstation

* remove dupe burger recipe, update syndie/oldstation setups

* nerf potency quality award

* buff burn/ignite times, remove pointless on_fire flag

* more grill woodburn nerf

* meh

* try and unfuck timing issues

* more fixes and icon updates

* more fixes

* more review changes

* fix linter

* disable pcwj debug

* fix grill and deep fryer overlays

* fix timers with no containers

* attempt to fix reagent adding issues

* more cleanups

* allow rped usage

* grammar, null checks, reagent display

* PDA updates, map updates

* fix mats values

* new panel sprites

* recipe fixes, add prep bowl

* revert unused icon file changes

* move this to mesh with smith TM

* remove food quality for now

* New sprites, autochef.

* fix examine text

* reduce oven cook times

* lots of fixes

* fix autochef recipes that start with reagents

* prevent shenanigans

* megapatch 1

* block ingredients behind oven door

* PDA app improvements

* remove unused proc

* fixes for cookbook, descontructions, completed steps

* allow empty containers with a tracker to be claimed

* allow reclaiming

* autochef reliability fixes

* autochef reliability fixes

* fix quality product count

* update updatepaths script

* better stack handling

* more fixes for stacks and reagents

* timers no longer turn off burners automatically

* autochef turn offs and make sure we can see output storage

* add microwave recipe for roundremoving player brains

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: warriorstar-orion <orion@snowfrost.garden>

* burza review 1

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: warriorstar-orion <orion@snowfrost.garden>

* fix berry muffin name while i'm here

* grill -> microwave in new tests

* grill -> microwave in new tests, but actually for realsies

* i definitely know what i'm doing

* redundant attack chain setting

* add examine text about clearing buffer

* remove unused vars and start improving docs

---------

Signed-off-by: warriorstar-orion <orion@snowfrost.garden>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
warriorstar-orion
2025-03-23 04:59:08 +00:00
committed by GitHub
co-authored by Burzah
parent 9a3ce4e549
commit f9ade844c9
114 changed files with 11403 additions and 6986 deletions
@@ -48,7 +48,6 @@
/obj/item/book/manual/ripley_build_and_repair,
/obj/item/book/manual/supermatter_engine,
/obj/item/book/manual/wiki/botanist,
/obj/item/book/manual/wiki/chef_recipes,
/obj/item/book/manual/wiki/engineering_construction,
/obj/item/book/manual/wiki/engineering_guide,
/obj/item/book/manual/wiki/faxes,
@@ -0,0 +1,46 @@
RESTRICT_TYPE(/obj/item/autochef_remote)
/obj/item/autochef_remote
name = "autochef remote"
icon = 'icons/obj/cooking/misc.dmi'
icon_state = "autochef_remote"
w_class = WEIGHT_CLASS_SMALL
new_attack_chain = TRUE
var/list/linkable_machine_uids = list()
VAR_PRIVATE/static/list/valid_machines = list(
/obj/item/reagent_containers/cooking,
/obj/machinery/cooking,
/obj/machinery/smartfridge,
)
/obj/item/autochef_remote/examine(mob/user)
. = ..()
. += "<span class='notice'>Use [src] on cooking utensils and machines to store them in the buffer.</span>"
. += "<span class='notice'>Use [src] on an autochef to register all the stored utensils and machines to the autochef.</span>"
. += "<span class='notice'>Register food and drink carts and smart fridges to give the autochef access to ingredients.</span>"
. += "<span class='notice'>Use [src] in-hand to clear its buffer, which can then be used to unlink everything from autochefs.</span>"
/obj/item/autochef_remote/activate_self(mob/user)
if(..())
return FINISH_ATTACK
linkable_machine_uids.Cut()
to_chat(user, "<span class='notice'>You clear all items stored in [src]'s buffer.</span>")
/obj/item/autochef_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
var/target_uid = interacting_with.UID()
if(is_type_in_list(interacting_with, valid_machines))
linkable_machine_uids |= target_uid
else
return
var/obj/machinery/cooking/cooking_machine = interacting_with
if(istype(cooking_machine))
for(var/datum/cooking_surface/surface in cooking_machine.surfaces)
if(surface.container)
interact_with_atom(surface.container, user)
to_chat(user, "<span class='notice'>You add [interacting_with] to [src]'s buffer.</span>")
return ITEM_INTERACT_COMPLETE
-171
View File
@@ -1,171 +0,0 @@
/obj/item/mixing_bowl
name = "mixing bowl"
desc = "Mixing it up in the kitchen."
container_type = OPENCONTAINER
icon = 'icons/obj/kitchen.dmi'
icon_state = "mixing_bowl"
var/max_n_of_items = 25
var/dirty = FALSE
var/clean_icon = "mixing_bowl"
var/dirty_icon = "mixing_bowl_dirty"
/obj/item/mixing_bowl/New()
..()
create_reagents(100)
/obj/item/mixing_bowl/attackby__legacy__attackchain(obj/item/I, mob/user, params)
if(dirty)
if(istype(I, /obj/item/soap))
user.visible_message("<span class='notice'>[user] starts to scrub [src].</span>", "<span class='notice'>You start to scrub [src].</span>")
if(do_after(user, 20 * I.toolspeed, target = src))
clean()
user.visible_message("<span class='notice'>[user] has scrubbed [src] clean.</span>", "<span class='notice'>You have scrubbed [src] clean.</span>")
return 1
else
to_chat(user, "<span class='warning'>You should clean [src] before you use it for food prep.</span>")
return 0
if(is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_MICROWAVE]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_GRILL]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_OVEN]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_CANDY]))
if(length(contents)>=max_n_of_items)
to_chat(user, "<span class='alert'>This [src] is full of ingredients, you cannot put more.</span>")
return 1
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
if(S.get_amount() > 1)
var/obj/item/stack/to_add = S.split(user, 1)
to_add.forceMove(src)
user.visible_message("<span class='notice'>[user] adds one of [S] to [src].</span>", "<span class='notice'>You add one of [S] to [src].</span>")
else
return add_item(S, user)
else
return add_item(I, user)
else if(is_type_in_list(I, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/drinks, /obj/item/reagent_containers/condiment)))
if(!I.reagents)
return 1
for(var/datum/reagent/R in I.reagents.reagent_list)
if(!(R.id in GLOB.cooking_reagents[RECIPE_MICROWAVE]) && !(R.id in GLOB.cooking_reagents[RECIPE_GRILL]) && !(R.id in GLOB.cooking_reagents[RECIPE_OVEN]) && !(R.id in GLOB.cooking_reagents[RECIPE_CANDY]))
to_chat(user, "<span class='alert'>Your [I] contains components unsuitable for cookery.</span>")
return 1
else
to_chat(user, "<span class='alert'>You have no idea what you can cook with [I].</span>")
return 1
/obj/item/mixing_bowl/proc/add_item(obj/item/I, mob/user)
if(!user.drop_item())
to_chat(user, "<span class='notice'>\The [I] is stuck to your hand, you cannot put it in [src]</span>")
//return 0
else
I.forceMove(src)
user.visible_message("<span class='notice'>[user] adds [I] to [src].</span>", "<span class='notice'>You add [I] to [src].</span>")
/obj/item/mixing_bowl/attack_self__legacy__attackchain(mob/user)
var/dat = ""
if(dirty)
dat = {"<code>This [src] is dirty!<BR>Please clean it before use!</code>"}
else
var/list/items_counts = list()
var/list/items_measures = list()
var/list/items_measures_p = list()
for(var/obj/O in contents)
var/display_name = O.name
if(istype(O,/obj/item/food/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
if(istype(O,/obj/item/food/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
if(istype(O,/obj/item/food/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
if(istype(O,/obj/item/food/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
if(istype(O,/obj/item/food/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
for(var/O in items_counts)
var/N = items_counts[O]
if(!(O in items_measures))
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
else
if(N==1)
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
else
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
for(var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
if(R.id == "capsaicin")
display_name = "Hotsauce"
if(R.id == "frostoil")
display_name = "Coldsauce"
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
if(length(items_counts)==0 && length(reagents.reagent_list)==0)
dat = {"<B>[src] is empty</B><BR>"}
else
dat = {"<b>Ingredients:</b><br>[dat]"}
dat += {"<hr><br> <a href='byond://?src=[UID()];action=dispose'>Dispose ingredients!</a><br>"}
var/datum/browser/popup = new(user, name, name, 400, 400)
popup.set_content(dat)
popup.open(0)
onclose(user, "[name]")
return
/obj/item/mixing_bowl/Topic(href, href_list)
if(..())
return
switch(href_list["action"])
if("dispose")
dispose()
return
/obj/item/mixing_bowl/proc/dispose()
for(var/obj/O in contents)
O.forceMove(loc)
if(reagents.total_volume)
make_dirty(5)
reagents.clear_reagents()
to_chat(usr, "<span class='notice'>You dispose of [src]'s contents.</span>")
updateUsrDialog()
/obj/item/mixing_bowl/proc/make_dirty(chance)
if(!chance)
return
if(prob(chance))
dirty = TRUE
container_type = null
icon_state = dirty_icon
/obj/item/mixing_bowl/proc/clean()
dirty = FALSE
container_type = OPENCONTAINER
icon_state = clean_icon
/obj/item/mixing_bowl/wash(mob/user, atom/source)
if(..())
clean()
/obj/item/mixing_bowl/proc/fail(obj/source)
if(!source)
source = src
var/amount = 0
for(var/obj/O in contents)
amount++
if(O.reagents)
var/id = O.reagents.get_master_reagent_id()
if(id)
amount+=O.reagents.get_reagent_amount(id)
qdel(O)
if(reagents && reagents.total_volume)
var/id = reagents.get_master_reagent_id()
if(id)
amount += reagents.get_reagent_amount(id)
reagents.clear_reagents()
var/obj/item/food/badrecipe/mysteryfood = new(get_turf(source))
mysteryfood.reagents.add_reagent("carbon", amount)
mysteryfood.reagents.add_reagent("????", amount / 10)
make_dirty(75)
@@ -727,14 +727,14 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic knife", /obj/item/kitchen/knife/plastic, 1, on_floor = TRUE),
)),
new /datum/stack_recipe_list("plastic moulds", list(
new /datum/stack_recipe("bear mould", /obj/item/kitchen/mould/bear, 1, on_floor = TRUE),
new /datum/stack_recipe("worm mould", /obj/item/kitchen/mould/worm, 1, on_floor = TRUE),
new /datum/stack_recipe("bean mould", /obj/item/kitchen/mould/bean, 1, on_floor = TRUE),
new /datum/stack_recipe("ball mould", /obj/item/kitchen/mould/ball, 1, on_floor = TRUE),
new /datum/stack_recipe("cane mould", /obj/item/kitchen/mould/cane, 1, on_floor = TRUE),
new /datum/stack_recipe("cash mould", /obj/item/kitchen/mould/cash, 1, on_floor = TRUE),
new /datum/stack_recipe("coin mould", /obj/item/kitchen/mould/coin, 1, on_floor = TRUE),
new /datum/stack_recipe("sucker mould", /obj/item/kitchen/mould/loli, 1, on_floor = TRUE),
new /datum/stack_recipe("bear mould", /obj/item/reagent_containers/cooking/mould/bear, 1, on_floor = TRUE),
new /datum/stack_recipe("worm mould", /obj/item/reagent_containers/cooking/mould/worm, 1, on_floor = TRUE),
new /datum/stack_recipe("bean mould", /obj/item/reagent_containers/cooking/mould/bean, 1, on_floor = TRUE),
new /datum/stack_recipe("ball mould", /obj/item/reagent_containers/cooking/mould/ball, 1, on_floor = TRUE),
new /datum/stack_recipe("cane mould", /obj/item/reagent_containers/cooking/mould/cane, 1, on_floor = TRUE),
new /datum/stack_recipe("cash mould", /obj/item/reagent_containers/cooking/mould/cash, 1, on_floor = TRUE),
new /datum/stack_recipe("coin mould", /obj/item/reagent_containers/cooking/mould/coin, 1, on_floor = TRUE),
new /datum/stack_recipe("sucker mould", /obj/item/reagent_containers/cooking/mould/loli, 1, on_floor = TRUE),
)),
))
+16 -25
View File
@@ -252,9 +252,10 @@
* Candy Moulds
*/
/obj/item/kitchen/mould
/obj/item/reagent_containers/cooking/mould
name = "generic candy mould"
desc = "You aren't sure what it's supposed to be."
icon = 'icons/obj/kitchen.dmi'
icon_state = "mould"
force = 5
throwforce = 5
@@ -263,62 +264,52 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
/obj/item/kitchen/mould/bear
/obj/item/reagent_containers/cooking/mould/make_mini()
transform *= 0.5
/obj/item/reagent_containers/cooking/mould/unmake_mini()
transform = null
/obj/item/reagent_containers/cooking/mould/bear
name = "bear-shaped candy mould"
desc = "It has the shape of a small bear imprinted into it."
icon_state = "mould_bear"
/obj/item/kitchen/mould/worm
/obj/item/reagent_containers/cooking/mould/worm
name = "worm-shaped candy mould"
desc = "It has the shape of a worm imprinted into it."
icon_state = "mould_worm"
/obj/item/kitchen/mould/bean
/obj/item/reagent_containers/cooking/mould/bean
name = "bean-shaped candy mould"
desc = "It has the shape of a bean imprinted into it."
icon_state = "mould_bean"
/obj/item/kitchen/mould/ball
/obj/item/reagent_containers/cooking/mould/ball
name = "ball-shaped candy mould"
desc = "It has a small sphere imprinted into it."
icon_state = "mould_ball"
/obj/item/kitchen/mould/cane
/obj/item/reagent_containers/cooking/mould/cane
name = "cane-shaped candy mould"
desc = "It has the shape of a cane imprinted into it."
icon_state = "mould_cane"
/obj/item/kitchen/mould/cash
/obj/item/reagent_containers/cooking/mould/cash
name = "cash-shaped candy mould"
desc = "It has the shape and design of fake money imprinted into it."
icon_state = "mould_cash"
/obj/item/kitchen/mould/coin
/obj/item/reagent_containers/cooking/mould/coin
name = "coin-shaped candy mould"
desc = "It has the shape of a coin imprinted into it."
icon_state = "mould_coin"
/obj/item/kitchen/mould/loli
/obj/item/reagent_containers/cooking/mould/loli
name = "sucker mould"
desc = "It has the shape of a sucker imprinted into it."
icon_state = "mould_loli"
/*
* Sushi Mat
*/
/obj/item/kitchen/sushimat
name = "Sushi Mat"
desc = "A wooden mat used for efficient sushi crafting."
icon_state = "sushi_mat"
force = 5
throwforce = 5
throw_speed = 3
throw_range = 3
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("rolled", "cracked", "battered", "thrashed")
/// circular cutter by Ume
/obj/item/kitchen/cutter
@@ -881,15 +881,6 @@
title = "Cyborgs for Dummies"
wiki_article_title = "Guide_to_Robotics"
/obj/item/book/manual/wiki/chef_recipes
name = "Chef Recipes"
desc = "Knives, Ovens, and You: A guide to cooking."
summary = "A comprehensive guide to the production of all manner of foods and drinks."
icon_state = "cook_book"
author = "Nanotrasen"
title = "Chef Recipes"
wiki_article_title = "Guide_to_Food_and_Drinks#Food"
/obj/item/book/manual/wiki/engineering_construction
name = "Station Repairs and Construction"
desc = "A guide on how to fix things without duct tape."
@@ -1065,8 +1065,8 @@
/obj/item/kitchen/utensil,
/obj/item/kitchen/knife,
/obj/item/kitchen/rollingpin,
/obj/item/kitchen/mould,
/obj/item/kitchen/sushimat,
/obj/item/reagent_containers/cooking/mould,
/obj/item/reagent_containers/cooking/sushimat,
/obj/item/kitchen/cutter,
/obj/item/assembly/mousetrap,
/obj/item/reagent_containers/spray/pestspray,
@@ -1336,6 +1336,22 @@
new /obj/item/clothing/under/plasmaman/tacticool(src)
new /obj/item/clothing/head/helmet/space/plasmaman/tacticool(src)
/obj/item/storage/box/autochef
name = "autochef starter kit"
desc = "Contains everything you need to build and use an autochef."
/obj/item/storage/box/autochef/populate_contents()
new /obj/item/circuitboard/autochef(src)
new /obj/item/stack/sheet/metal(src, 5)
new /obj/item/stack/cable_coil/five(src)
new /obj/item/stock_parts/matter_bin(src)
new /obj/item/stock_parts/matter_bin(src)
new /obj/item/stock_parts/micro_laser(src)
new /obj/item/stock_parts/manipulator(src)
new /obj/item/autochef_remote(src)
new /obj/item/screwdriver(src)
new /obj/item/paper/autochef_quickstart(src)
#undef NODESIGN
#undef NANOTRASEN
#undef SYNDI
@@ -589,6 +589,34 @@
if(prob(10))
new /obj/item/bikehorn/rubberducky(src)
/obj/structure/closet/crate/cookware
name = "cookware crate"
icon_state = "cookware"
icon_opened = "cookware_open"
icon_closed = "cookware"
/obj/structure/closet/crate/cookware/populate_contents()
// Ice cream mixer containers
new /obj/item/reagent_containers/cooking/icecream_bowl(src)
// Oven containers
new /obj/item/reagent_containers/cooking/oven(src)
// Stovetop containers
new /obj/item/reagent_containers/cooking/pan(src)
new /obj/item/reagent_containers/cooking/pan(src)
new /obj/item/reagent_containers/cooking/pot(src)
new /obj/item/reagent_containers/cooking/pot(src)
// Deepfryer containers
new /obj/item/reagent_containers/cooking/deep_basket(src)
new /obj/item/reagent_containers/cooking/deep_basket(src)
// Cutting board
new /obj/item/reagent_containers/cooking/board(src)
// Grill containers
new /obj/item/reagent_containers/cooking/grill_grate(src)
new /obj/item/reagent_containers/cooking/grill_grate(src)
// Prep bowls
new /obj/item/reagent_containers/cooking/bowl(src)
new /obj/item/reagent_containers/cooking/bowl(src)
//crates of gear in the free golem ship
/obj/structure/closet/crate/golemgear/populate_contents()
new /obj/item/storage/backpack/industrial(src)