diff --git a/baystation12.dme b/baystation12.dme index 2827ded638c..f0265828530 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -18,6 +18,7 @@ #include "code\stylesheet.dm" #include "code\world.dm" #include "code\__datastructures\globals.dm" +#include "code\__defines\__cooking.dm" #include "code\__defines\__initialization.dm" #include "code\__defines\__qdel.dm" #include "code\__defines\__renderer.dm" @@ -134,6 +135,7 @@ #include "code\_global_vars\sensitive.dm" #include "code\_global_vars\sfx.dm" #include "code\_global_vars\lists\areas.dm" +#include "code\_global_vars\lists\cooking.dm" #include "code\_global_vars\lists\flavor.dm" #include "code\_global_vars\lists\locations.dm" #include "code\_global_vars\lists\logs.dm" @@ -915,17 +917,6 @@ #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" #include "code\game\machinery\embedded_controller\embedded_program_base.dm" #include "code\game\machinery\embedded_controller\simple_docking_controller.dm" -#include "code\game\machinery\kitchen\gibber.dm" -#include "code\game\machinery\kitchen\icecream.dm" -#include "code\game\machinery\kitchen\microwave.dm" -#include "code\game\machinery\kitchen\smartfridge.dm" -#include "code\game\machinery\kitchen\cooking_machines\_cooker.dm" -#include "code\game\machinery\kitchen\cooking_machines\_cooker_output.dm" -#include "code\game\machinery\kitchen\cooking_machines\candy.dm" -#include "code\game\machinery\kitchen\cooking_machines\cereal.dm" -#include "code\game\machinery\kitchen\cooking_machines\fryer.dm" -#include "code\game\machinery\kitchen\cooking_machines\grill.dm" -#include "code\game\machinery\kitchen\cooking_machines\oven.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\dispenser_recipes.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" @@ -1842,6 +1833,44 @@ #include "code\modules\clothing\under\jobs\security.dm" #include "code\modules\clothing\underwear\base.dm" #include "code\modules\clothing\~custom_clothing\custom_clothing.dm" +#include "code\modules\cooking\cooking.dm" +#include "code\modules\cooking\cooking_catalog.dm" +#include "code\modules\cooking\cooking_init.dm" +#include "code\modules\cooking\cooking_tracker.dm" +#include "code\modules\cooking\food_overrides.dm" +#include "code\modules\cooking\step_defines.dm" +#include "code\modules\cooking\coocking_appliances\appliance_defines.dm" +#include "code\modules\cooking\coocking_appliances\candy.dm" +#include "code\modules\cooking\coocking_appliances\cooking_circuits.dm" +#include "code\modules\cooking\coocking_appliances\gibber.dm" +#include "code\modules\cooking\coocking_appliances\grill.dm" +#include "code\modules\cooking\coocking_appliances\icecream.dm" +#include "code\modules\cooking\coocking_appliances\machinery.dm" +#include "code\modules\cooking\coocking_appliances\microwave.dm" +#include "code\modules\cooking\coocking_appliances\oven.dm" +#include "code\modules\cooking\coocking_appliances\smartfridge.dm" +#include "code\modules\cooking\coocking_appliances\stove.dm" +#include "code\modules\cooking\cooking_items\cooking_containers.dm" +#include "code\modules\cooking\cooking_items\dollop.dm" +#include "code\modules\cooking\cooking_items\frosting.dm" +#include "code\modules\cooking\cooking_items\spatula.dm" +#include "code\modules\cooking\recipes\_read_me.dm" +#include "code\modules\cooking\recipes\example_recipes.dm" +#include "code\modules\cooking\recipes\recipe_burgers.dm" +#include "code\modules\cooking\recipes\recipe_donuts.dm" +#include "code\modules\cooking\recipes\recipe_hotdogs.dm" +#include "code\modules\cooking\recipes\recipe_pastry.dm" +#include "code\modules\cooking\recipes\recipe_unsorted.dm" +#include "code\modules\cooking\recipes\recipes_to_covert.dm" +#include "code\modules\cooking\step_types\add_item.dm" +#include "code\modules\cooking\step_types\add_produce.dm" +#include "code\modules\cooking\step_types\add_reagent.dm" +#include "code\modules\cooking\step_types\recipe_start.dm" +#include "code\modules\cooking\step_types\use_grill.dm" +#include "code\modules\cooking\step_types\use_item.dm" +#include "code\modules\cooking\step_types\use_oven.dm" +#include "code\modules\cooking\step_types\use_stove.dm" +#include "code\modules\cooking\step_types\use_tool.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\detectivework\footprints.dm" #include "code\modules\detectivework\forensics.dm" diff --git a/code/__defines/__cooking.dm b/code/__defines/__cooking.dm new file mode 100644 index 00000000000..b1728ca89a2 --- /dev/null +++ b/code/__defines/__cooking.dm @@ -0,0 +1,103 @@ +#define CWJ_DEBUG 1 + + +//Step classifications, for easy reference later. +//If something falls outside these classifications, why would it? +#define CWJ_START 1 //Default step to construct the list. +#define CWJ_ADD_ITEM 2 //Adding an item to a recipe (Ex- adding a slice of bread) +#define CWJ_ADD_REAGENT 3 //Adding a reagent to a recipe (Ex- Adding salt) +#define CWJ_USE_ITEM 4 //Using an item in a recipe (Ex- cutting bread with a knife) +#define CWJ_USE_TOOL 5 +#define CWJ_ADD_PRODUCE 6 //Adding Produce to a recipe +#define CWJ_USE_STOVE 7 //Using a stove in a recipe +#define CWJ_USE_GRILL 8 //Using a grill in a recipe +#define CWJ_USE_OVEN 9 //Using a oven in a recipe +#define CWJ_USE_OTHER 10 //Custom Command flag, will take in argument lists. + + +//Optional flags +#define CWJ_ADD_ITEM_OPTIONAL 200 +#define CWJ_ADD_REAGENT_OPTIONAL 300 +#define CWJ_USE_ITEM_OPTIONAL 400 +#define CWJ_USE_TOOL_OPTIONAL 500 +#define CWJ_ADD_PRODUCE_OPTIONAL 600 +#define CWJ_USE_STOVE_OPTIONAL 700 +#define CWJ_USE_GRILL_OPTIONAL 800 +#define CWJ_USE_OVEN_OPTIONAL 900 +#define CWJ_OTHER_OPTIONAL 1000 + + +#define CWJ_BEGIN_EXCLUSIVE_OPTIONS 10000 //Beginning an exclusive option list +#define CWJ_END_EXCLUSIVE_OPTIONS 20000 //Ending an exclusive option list +#define CWJ_BEGIN_OPTION_CHAIN 30000 //Beginning an option chain +#define CWJ_END_OPTION_CHAIN 40000 //Ending an option chain + +//Recipe state flags +#define CWJ_IS_LAST_STEP 1 //If the step in the recipe is marked as the last step +#define CWJ_IS_OPTIONAL 2 //If the step in the recipe is marked as 'Optional' +#define CWJ_IS_OPTION_CHAIN 4 //If the step in the recipe is marked to be part of an option chain. +#define CWJ_IS_EXCLUSIVE 8 //If the step in the recipe is marked to exclude other options when followed. +#define CWJ_BASE_QUALITY_ENABLED 16 +#define CWJ_MAX_QUALITY_ENABLED 32 + +//Check item use flags +#define CWJ_NO_STEPS 1 //The used object has no valid recipe uses +#define CWJ_CHOICE_CANCEL 2 //The user opted to cancel when given a choice +#define CWJ_SUCCESS 3 //The user decided to use the item and the step was followed +#define CWJ_PARTIAL_SUCCESS 4 //The user decided to use the item but the qualifications for the step was not fulfilled +#define CWJ_COMPLETE 5 //The meal has been completed! +#define CWJ_LOCKOUT 6 //Someone tried starting the function while a prompt was running. Jerk. +#define CWJ_BURNT 7 //The meal was ruined by burning the food somehow. + +#define CWJ_CHECK_INVALID 0 +#define CWJ_CHECK_VALID 1 +#define CWJ_CHECK_FULL 2 //For reagents, nothing can be added to + +//Cooking container types +#define PLATE "plate" +#define CUTTING_BOARD "cutting board" +#define PAN "pan" +#define POT "pot" +#define BOWL "bowl" +#define DF_BASKET "deep fryer basket" +#define AF_BASKET "air fryer basket" +#define OVEN "oven" +#define GRILL "grill grate" + +//Tools qualities +#define QUALITY_CUTTING "cutting" +#define QUALITY_HAMMERING "hammering" + +//Stove temp settings. +#define J_LO "Low" +#define J_MED "Medium" +#define J_HI "High" + +//Just a catalog for the cooking catalog +#define CATALOG_COOKING "cooking" + +//Burn times for cooking things on a stove. +//Anything put on a stove for this long becomes a burned mess. +#define CWJ_BURN_TIME_LOW 15 MINUTES +#define CWJ_BURN_TIME_MEDIUM 10 MINUTES +#define CWJ_BURN_TIME_HIGH 5 MINUTES + +//Ignite times for reagents interacting with a stove. +//The stove will catch fire if left on too long with flammable reagents in any of its holders. +#define CWJ_IGNITE_TIME_LOW 1 HOUR +#define CWJ_IGNITE_TIME_MEDIUM 30 MINUTES +#define CWJ_IGNITE_TIME_HIGH 15 MINUTES + +//Determines how much quality is taken from a food each tick when a 'no recipe' response is made. +#define CWJ_BASE_QUAL_REDUCTION 5 + +//Food Quality Tiers +#define CWJ_QUALITY_GARBAGE -2 +#define CWJ_QUALITY_GROSS -1.5 +#define CWJ_QUALITY_MEH 0.5 +#define CWJ_QUALITY_NORMAL 1 +#define CWJ_QUALITY_GOOD 1.2 +#define CWJ_QUALITY_VERY_GOOD 1.4 +#define CWJ_QUALITY_CUISINE 1.6 +#define CWJ_QUALITY_LEGENDARY 1.8 +#define CWJ_QUALITY_ELDRITCH 2.0 diff --git a/code/_global_vars/lists/cooking.dm b/code/_global_vars/lists/cooking.dm new file mode 100644 index 00000000000..e498655841a --- /dev/null +++ b/code/_global_vars/lists/cooking.dm @@ -0,0 +1,19 @@ +//Cooking +//A dictionary of unique step ids that point to other step IDs that should be EXCLUDED if it is present in a recipe_pointer's list of possible steps. +GLOBAL_LIST_EMPTY(cwj_optional_step_exclusion_dictionary) + +//A dictionary of all recipes by the basic ingredient +//Format: {base_ingedient_type:{unique_id:recipe}} +GLOBAL_LIST_EMPTY(cwj_recipe_dictionary) + +//A dictionary of all recipes full_stop. Used later for assembling the HTML list. +//Format: {recipe_type:{unique_id:recipe}} +GLOBAL_LIST_EMPTY(cwj_recipe_list) + +//A dictionary of all steps held within all recipes +//Format: {unique_id:step} +GLOBAL_LIST_EMPTY(cwj_step_dictionary) + +//An organized heap of recipes by class and grouping. +//Format: {class_of_step:{step_group_identifier:{unique_id:step}}} +GLOBAL_LIST_EMPTY(cwj_step_dictionary_ordered) diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 39ab1072b76..f6f27140439 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -42,6 +42,36 @@ var/next_station_date_change = 1 DAY /proc/time_stamp() return time2text(world.timeofday, "hh:mm:ss") +/proc/ticks_to_text(var/ticks) + if(ticks%1 != 0) + return "ERROR" + var/response = "" + var/counter = 0 + while(ticks >= 1 DAYS) + ticks -= 1 DAYS + counter++ + if(counter) + response += "[counter] Day[counter>1 ? "s" : ""][ticks ? ", " : ""]" + counter=0 + while(ticks >= 1 HOURS) + ticks -= 1 HOURS + counter++ + if(counter) + response += "[counter] Hour[counter>1 ? "s" : ""][ticks?", ":""]" + counter=0 + while(ticks >= 1 MINUTES) + ticks -= 1 MINUTES + counter++ + if(counter) + response += "[counter] Minute[counter>1 ? "s" : ""][ticks?", ":""]" + counter=0 + while(ticks >= 1 SECONDS) + ticks -= 1 SECONDS + counter++ + if(counter) + response += "[counter][ticks?".[ticks]" : ""] Second[counter>1 ? "s" : ""]" + return response + /* Returns 1 if it is the selected month and day */ /proc/isDay(month, day) if(isnum(month) && isnum(day)) @@ -127,12 +157,12 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) Example: /datum/foo var/last_action = 0 - + /datum/foo/proc/do() THROTTLE_SHARED(cooldown, 1 SECOND, last_action) if(cooldown) do_something() - + /datum/foo/proc/do2() THROTTLE_SHARED(cooldown, 1 SECOND, last_action) if(cooldown) diff --git a/code/datums/trading/food.dm b/code/datums/trading/food.dm index 01e1c3499e2..ef052c826c9 100644 --- a/code/datums/trading/food.dm +++ b/code/datums/trading/food.dm @@ -127,8 +127,7 @@ /obj/item/reagent_containers/food/grown = TRADER_BLACKLIST_ALL, /obj/item/reagent_containers/food/human = TRADER_BLACKLIST_ALL, /obj/item/reagent_containers/food/sliceable/braincake = TRADER_BLACKLIST, - /obj/item/reagent_containers/food/meat/human = TRADER_BLACKLIST, - /obj/item/reagent_containers/food/variable = TRADER_BLACKLIST_ALL + /obj/item/reagent_containers/food/meat/human = TRADER_BLACKLIST ) /datum/trader/ship/bakery diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker.dm b/code/game/machinery/kitchen/cooking_machines/_cooker.dm deleted file mode 100644 index 7ffec2fc4a4..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/_cooker.dm +++ /dev/null @@ -1,313 +0,0 @@ -// This folder contains code that was originally ported from Apollo Station and then refactored/optimized/changed. Twice -//Product status -#define NO_PRODUCT 0 -#define COOKING 1 -#define COOKED 2 -#define BURNED 3 - -// Tracks precooked food to stop deep fried baked grilled grilled grilled diona nymph cereal. -/obj/item/reagent_containers/food - drop_sound = SFX_DROP_FOOD - pickup_sound = SFX_PICKUP_FOOD - var/list/cooked_types = list() - -// Root type for cooking machines. See following files for specific implementations. -/obj/machinery/cooker - name = "cooker" - desc = "You shouldn't be seeing this!" - icon = 'icons/obj/cooking_machines.dmi' - density = 1 - anchored = 1 - idle_power_usage = 5 WATTS - - var/on_icon // Icon state used when cooking. - var/off_icon // Icon state used when not cooking. - var/is_cooking = FALSE // Whether or not the machine is currently operating. - var/cook_type // A string value used to track what kind of food this machine makes. - var/cook_time = 200 // How many ticks the cooking will take. - var/mob_fitting_size = MOB_SMALL// Maximum size of a mob can be cooked (humans are MOB_MEDIUM) - var/food_color // Colour of resulting food item. - var/cooked_sound // Sound played when cooking completes. - var/can_burn_food = FALSE // Can the object burn food that is left inside? - var/burn_chance = 10 // How likely is the food to burn? - var/atom/movable/thing_inside // Holder for the currently cooking object. - - // If the machine has multiple output modes, define them here. - var/selected_option - var/list/output_options = list() - - // Variables for internal usage - var/cooking_done_time - var/next_burn_time - var/cooking_is_done = FALSE - - -/obj/machinery/cooker/Destroy() - if(thing_inside) - qdel(thing_inside) - thing_inside = null - if(is_cooking) - stop() - return ..() - -/obj/machinery/cooker/examine(mob/user, infix) - . = ..() - - if(Adjacent(user)) - switch(product_status()) - //if NO_PRODUCT, say no more - if(COOKING) - . += "You can see \a [thing_inside] inside." - if(COOKED) - var/smell = "good" - if(istype(thing_inside, /obj/item/reagent_containers/food)) - var/obj/item/reagent_containers/food/S = thing_inside - if(islist(S.nutriment_desc) && length(S.nutriment_desc)) - smell = pick(S.nutriment_desc) - . += "You can see \a [thing_inside] inside. It smells [smell]." - if(BURNED) - . += "[SPAN_WARNING("Inside is covered by dirt, and it smells smoke!")]" - -/obj/machinery/cooker/attackby(obj/item/I, mob/user) - set waitfor = 0 //So that any remaining parts of calling proc don't have to wait for the long cooking time ahead. - - if(!cook_type || (stat & (NOPOWER|BROKEN))) - to_chat(user, SPAN_WARNING("\The [src] is not working.")) - return 0 - - if(product_status() != NO_PRODUCT) - to_chat(user, SPAN_WARNING("There is no more space in \the [src]. \A [thing_inside] is already there!")) - return 0 - - var/mob/living/inserted_mob - var/obj/item/reagent_containers/food/check - if(istype(I, /obj/item/reagent_containers/food/badrecipe)) - to_chat(user, SPAN_WARNING("Making [I] [cook_type] shouldn't help.")) - return 0 - else if(istype(I, /obj/item/reagent_containers/food/slice) && cook_type == "baked") - to_chat(user, SPAN_WARNING("\The [I] too small to get [cook_type].")) - return 0 - else if(istype(I.return_item(), /obj/item/reagent_containers/food)) - check = I.return_item() - if(cook_type in check.cooked_types) - to_chat(user, SPAN_WARNING("\The [I] has already been [cook_type].")) - return 0 - else if(istype(I, /obj/item/reagent_containers/vessel/condiment)) - to_chat(user, SPAN_WARNING("You can't make \the [I] [cook_type].")) - return 0 - else if(istype(I, /obj/item/reagent_containers/vessel)) - to_chat(user, SPAN_WARNING("That would probably break [src].")) - return 0 - else if(istype(I, /obj/item/holder)) - for(var/mob/living/M in I.contents) - inserted_mob = M - break - else if(istype(I, /obj/item/grab)) - var/obj/item/grab/G = I - inserted_mob = G.affecting - G.delete_self() - else - to_chat(user, SPAN_WARNING("That's not edible.")) - return 0 - - if(inserted_mob && (!isliving(inserted_mob) || isbot(inserted_mob) || issilicon(inserted_mob))) - to_chat(user, SPAN_WARNING("You can't cook that.")) - return 0 - - if(inserted_mob && inserted_mob.mob_size > mob_fitting_size) - hurt_big_mob(inserted_mob, user) - return 0 - - // Not sure why a food item that passed the previous checks would fail to drop, but safety first. - if(!istype(I, /obj/item/grab) && !user.drop(I)) - return - - if(inserted_mob) - thing_inside = inserted_mob - else - thing_inside = I - user.visible_message(SPAN_NOTICE("\The [user] puts \the [thing_inside] into \the [src].")) - thing_inside.forceMove(src) - is_cooking = 1 - cooking_is_done = FALSE - icon_state = on_icon - - if(inserted_mob) - inserted_mob.apply_damage(rand(30,40), BURN, BP_CHEST) - - // Doop de doo. Jeopardy theme goes here. - cooking_done_time = world.time + cook_time - if(can_burn_food) - next_burn_time = cooking_done_time + max(Floor(cook_time/5),1) - START_PROCESSING(SSmachines, src) - return 1 - -/obj/machinery/cooker/proc/return_item_data() - var/list/data = list() // contents: reagents, total_volume, the value from return_item if item, or src if something else. - if(istype(thing_inside, /obj/item)) - var/obj/item/I = thing_inside - data["item"] = I.return_item() - else - data["item"] = src - - data["reagents"] = data["item"]?.reagents - data["total_volume"] = data["reagents"]?.total_volume - - return data - -/obj/machinery/cooker/Process() - if(!is_cooking || !cook_type || (stat & (NOPOWER|BROKEN))) - stop() - return - switch(product_status()) - if(NO_PRODUCT) - stop() - if(COOKING) - ASSERT(cooking_done_time) - if(world.time > cooking_done_time) - var/list/product_data = return_item_data() - if(isliving(thing_inside)) - var/mob/living/L = thing_inside - L.death() - - if(selected_option && output_options.len) - var/cook_path = output_options[selected_option] - var/obj/item/reagent_containers/food/result = new cook_path(src) - - result = change_product_strings(result, product_data["item"]) - result = change_product_appearance(result, product_data["item"]) - - if(product_data["reagents"] && product_data["total_volume"]) - product_data["reagents"].trans_to(result, product_data["total_volume"]) - if(istype(product_data["item"], /obj/item/reagent_containers/food)) - var/obj/item/reagent_containers/food/I = product_data["item"] - result.cooked_types = I.cooked_types.Copy() - - qdel(thing_inside) - thing_inside = result - else - thing_inside = change_product_strings(thing_inside) - thing_inside = change_product_appearance(thing_inside) - - if(istype(product_data["item"], /obj/item/reagent_containers/food)) - var/obj/item/reagent_containers/food/I = product_data["item"] - I.cooked_types |= cook_type - cooking_is_done = TRUE - - src.visible_message(SPAN_NOTICE("\The [src] pings!")) - if(cooked_sound) - playsound(src, cooked_sound, 50, 1) - if(COOKED) - if(!can_burn_food) - eject() - else - ASSERT(next_burn_time) - if(world.time > next_burn_time) - next_burn_time += max(Floor(cook_time/5),1) - if(prob(burn_chance)) - qdel(thing_inside) - thing_inside = new /obj/item/reagent_containers/food/badrecipe(src) - visible_message(SPAN_DANGER("\The [src] vomits a gout of rancid smoke!")) - var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad() - smoke.attach(src) - smoke.set_up(10, 0, loc) - smoke.start() - if(BURNED) - pass() - else - stop() - CRASH("Something weird happened during product_status() check in [src].") - -/obj/machinery/cooker/proc/product_status() - if(!thing_inside || thing_inside.loc != src) - return NO_PRODUCT - if(istype(thing_inside, /obj/item/reagent_containers/food/badrecipe)) - return BURNED - if(cooking_is_done) - return COOKED - return COOKING - -/obj/machinery/cooker/proc/eject(mob/receiver) - if(!thing_inside) - if(is_cooking) - stop() - return - - if(receiver && Adjacent(receiver)) - if(isliving(thing_inside)) - var/mob/living/L = thing_inside - L.get_scooped(receiver, self_grab = FALSE) - else - to_chat(receiver, SPAN_NOTICE("You grab \the [thing_inside] from \the [src].")) - receiver.pick_or_drop(thing_inside) - else - thing_inside.forceMove(get_turf(src)) - - thing_inside = null - cooking_is_done = FALSE - if(is_cooking) - stop() - -/obj/machinery/cooker/proc/stop() - is_cooking = FALSE - icon_state = off_icon - STOP_PROCESSING(SSmachines, src) - -/obj/machinery/cooker/attack_hand(mob/user) - - if(product_status() != NO_PRODUCT) - eject(user) - return - - if(output_options.len > 1) - - var/choice = input("What specific food do you wish to make with \the [src]?") as null|anything in output_options+"Default" - if(!choice) - return - if(choice == "Default") - selected_option = null - to_chat(user, SPAN_NOTICE("You decide not to make anything specific with \the [src].")) - else - selected_option = choice - to_chat(user, SPAN_NOTICE("You prepare \the [src] to make \a [selected_option].")) - - ..() - -/obj/machinery/cooker/proc/hurt_big_mob(mob/living/victim, mob/user) - to_chat(user, SPAN_WARNING("That's not going to fit.")) - return - -/obj/machinery/cooker/proc/change_product_strings(atom/movable/product, atom/movable/origin) - if(!origin) - product.SetName("[cook_type] [product.name]") - product.desc = "[product.desc] It has been [cook_type]." - else - var/origin_name = origin.name - if(isliving(origin)) - var/open_bkt = findtext(origin.name, "(") - var/close_bkt = findtext(origin.name, "(") - if(open_bkt && close_bkt) - origin_name = copytext(origin.name, 1, open_bkt - 1) + copytext(origin.name, close_bkt + 1) - product.SetName("[origin_name] [product.name]") - return product - -/obj/machinery/cooker/proc/change_product_appearance(atom/movable/product, atom/movable/origin) - if(!origin) - product.color = food_color - if(istype(product, /obj/item/reagent_containers/food)) - var/obj/item/reagent_containers/food/food_item = product - food_item.filling_color = food_color - else - var/image/I = image(product.icon, "[product.icon_state]_filling") - if(istype(origin, /obj/item/reagent_containers/food)) - var/obj/item/reagent_containers/food/S = origin - I.color = S.filling_color - if(!I.color) - I.color = food_color - product.AddOverlays(I) - return product - -#undef NO_PRODUCT -#undef COOKING -#undef COOKED -#undef BURNED diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm b/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm deleted file mode 100644 index 8593a4b2dfb..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/_cooker_output.dm +++ /dev/null @@ -1,99 +0,0 @@ -// Wrapper obj for cooked food. Appearance is set in the cooking code, not on spawn. -/obj/item/reagent_containers/food/variable - name = "cooked food" - icon = 'icons/obj/food_custom.dmi' - desc = "If you can see this description then something is wrong. Please report the bug on the tracker." - nutriment_amt = 5 - bitesize = 2 - -/obj/item/reagent_containers/food/variable/pizza - name = "personal pizza" - desc = "A personalized pan pizza meant for only one person." - icon_state = "personal_pizza" - -/obj/item/reagent_containers/food/sliceable/bread/variable - icon = 'icons/obj/food_custom.dmi' - name = "bread" - desc = "Tasty bread." - icon_state = "breadcustom" - -/obj/item/reagent_containers/food/pie/variable - icon = 'icons/obj/food_custom.dmi' - name = "pie" - desc = "Tasty pie." - icon_state = "piecustom" - -/obj/item/reagent_containers/food/sliceable/plaincake/variable - icon = 'icons/obj/food_custom.dmi' - name = "cake" - desc = "A popular band." - icon_state = "cakecustom" - -/obj/item/reagent_containers/food/donkpocket/variable - icon = 'icons/obj/food_custom.dmi' - name = "hot pocket" - desc = "You wanna put a bangin- oh, nevermind." - icon_state = "donk" - -/obj/item/reagent_containers/food/donkpocket/variable/Initialize() - . = ..() - heat() - -/obj/item/reagent_containers/food/tofukabob/variable - icon = 'icons/obj/food_custom.dmi' - name = "kebab" - desc = "Remove this!" - icon_state = "kabob" - nutriment_desc = list("metal" = 1) - -/obj/item/reagent_containers/food/waffles/variable - icon = 'icons/obj/food_custom.dmi' - name = "waffles" - desc = "Made with love." - icon_state = "waffles" - gender = PLURAL - -/obj/item/reagent_containers/food/pancakes/variable - icon = 'icons/obj/food_custom.dmi' - name = "pancakes" - desc = "How does an oven make pancakes?" - icon_state = "pancakescustom" - gender = PLURAL - -/obj/item/reagent_containers/food/cookie/variable - icon = 'icons/obj/food_custom.dmi' - name = "cookie" - desc = "Sugar snap!" - icon_state = "cookie" - -/obj/item/reagent_containers/food/donut/variable - icon = 'icons/obj/food_custom.dmi' - name = "filled donut" - desc = "Donut eat this!" // kill me - icon_state = "donut" - -/obj/item/reagent_containers/food/variable/jawbreaker - name = "flavored jawbreaker" - desc = "It's like cracking a molar on a rainbow." - icon_state = "jawbreaker" - -/obj/item/reagent_containers/food/candy/variable - icon = 'icons/obj/food_custom.dmi' - name = "flavored chocolate bar" - desc = "Made in a factory downtown." - icon_state = "bar" - -/obj/item/reagent_containers/food/variable/sucker - name = "flavored sucker" - desc = "Suck, suck, suck." - icon_state = "sucker" - -/obj/item/reagent_containers/food/variable/jelly - name = "jelly" - desc = "All your friends will be jelly." - icon_state = "jellycustom" - -/obj/item/reagent_containers/food/variable/cereal - name = "cereal" - desc = "Eat to become a cereal killer" - icon_state = "cerealcustom" diff --git a/code/game/machinery/kitchen/cooking_machines/cereal.dm b/code/game/machinery/kitchen/cooking_machines/cereal.dm deleted file mode 100644 index 60344bb3c46..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/cereal.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/machinery/cooker/cereal - name = "cereal maker" - desc = "Now with Dann O's available!" - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "cereal_off" - cook_type = "cerealized" - on_icon = "cereal_on" - off_icon = "cereal_off" - output_options = list("Cereal" = /obj/item/reagent_containers/food/variable/cereal) - selected_option = "Cereal" - -/obj/machinery/cooker/cereal/change_product_strings(atom/movable/product, atom/movable/origin) - . = ..() - product.SetName("box of [product.name]") - return product - -/obj/machinery/cooker/cereal/change_product_appearance(obj/item/reagent_containers/food/variable/cereal/product, atom/movable/origin) - ClearOverlays() - var/icon/background = icon(product.icon, "[product.icon_state]_filling") - var/origin_color - if(istype(origin, /obj/item/reagent_containers/food)) - var/obj/item/reagent_containers/food/S = origin - origin_color = S.filling_color - else - origin_color = origin.color - if(origin_color) - background.Blend(origin_color, ICON_SUBTRACT) // Invert - product.filling_color = origin_color - - product.AddOverlays(background) - - var/image/food_image = image(origin.icon, origin.icon_state) - food_image.color = origin.color - food_image.CopyOverlays(origin) - food_image.SetTransform(scale = 0.5) - food_image.pixel_y = 2 - product.AddOverlays(food_image) - return product diff --git a/code/game/machinery/kitchen/cooking_machines/fryer.dm b/code/game/machinery/kitchen/cooking_machines/fryer.dm deleted file mode 100644 index dd83d135ca6..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/fryer.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/machinery/cooker/fryer - name = "deep fryer" - desc = "Deep fried everything." - icon_state = "fryer_off" - cook_type = "deep fried" - on_icon = "fryer_on" - off_icon = "fryer_off" - food_color = "#ffad33" - -/obj/machinery/cooker/fryer/hurt_big_mob(mob/living/victim, mob/user) - - if(!istype(victim)) - return - - user.visible_message("\The [user] starts pushing \the [victim] into \the [src]!") - icon_state = on_icon - is_cooking = 1 - - if(!do_mob(user, victim, 20)) - is_cooking = 0 - icon_state = off_icon - return - - if(!victim || !victim.Adjacent(user)) - to_chat(user, "Your victim slipped free!") - is_cooking = 0 - icon_state = off_icon - return - - var/target_zone = user.zone_sel.selecting - if(ishuman(victim) && !(target_zone in list(BP_GROIN, BP_CHEST))) - var/mob/living/carbon/human/H = victim - var/obj/item/organ/external/E = H.get_organ(target_zone) - if(!E) - to_chat(user, "They are missing that body part!") - else - visible_message("\The [user] shoves \the [victim][E ? "'s [E.name]" : ""] into \the [src]!") - var/blocked = H.run_armor_check(target_zone, "energy") - H.apply_damage(rand(20,30), BURN, target_zone, blocked) - - else - var/blocked = victim.run_armor_check(null, "energy") - victim.apply_damage(rand(30,40), BURN, null, blocked) - - if(victim) - admin_attack_log(user, victim, "Has [cook_type] their victim in \a [src]", "Has been [cook_type] in \a [src] by the attacker.", "[cook_type], in \a [src], ") - - icon_state = off_icon - is_cooking = 0 - return diff --git a/code/game/machinery/kitchen/cooking_machines/grill.dm b/code/game/machinery/kitchen/cooking_machines/grill.dm deleted file mode 100644 index 730bc59e96c..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/grill.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/machinery/cooker/grill - name = "griddle" - desc = "A flat, wide, and smooth cooking surface." - icon_state = "grill_off" - cook_type = "grilled" - cook_time = 100 - food_color = "#a34719" - on_icon = "grill_on" - off_icon = "grill_off" - can_burn_food = 1 - cooked_sound = 'sound/machines/ding.ogg' diff --git a/code/game/machinery/kitchen/cooking_machines/oven.dm b/code/game/machinery/kitchen/cooking_machines/oven.dm deleted file mode 100644 index b4e6c4d001c..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/oven.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/machinery/cooker/oven - name = "oven" - desc = "Cookies are ready, dear." - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "oven_off" - cooked_sound = 'sound/machines/ding.ogg' - on_icon = "oven_on" - off_icon = "oven_off" - cook_type = "baked" - cook_time = 300 - food_color = "#a34719" - can_burn_food = 1 - - output_options = list( - "Personal Pizza" = /obj/item/reagent_containers/food/variable/pizza, - "Bread" = /obj/item/reagent_containers/food/sliceable/bread/variable, - "Pie" = /obj/item/reagent_containers/food/pie/variable, - "Small Cake" = /obj/item/reagent_containers/food/sliceable/plaincake/variable, - "Hot Pocket" = /obj/item/reagent_containers/food/donkpocket/variable, - "Kebab" = /obj/item/reagent_containers/food/tofukabob/variable, - "Waffles" = /obj/item/reagent_containers/food/waffles/variable, - "Pancakes" = /obj/item/reagent_containers/food/pancakes/variable, - "Cookie" = /obj/item/reagent_containers/food/cookie/variable, - "Donut" = /obj/item/reagent_containers/food/donut/variable, - ) diff --git a/code/game/objects/items/smokables/cigarettes.dm b/code/game/objects/items/smokables/cigarettes.dm index 99373b79f58..19ff5dda681 100644 --- a/code/game/objects/items/smokables/cigarettes.dm +++ b/code/game/objects/items/smokables/cigarettes.dm @@ -62,8 +62,8 @@ if(istype(W, /obj/item/gun) && !istype(W, /obj/item/gun/flamer) && !istype(W, /obj/item/gun/energy/plasmacutter)) var/obj/item/gun/gun = W return gun.combustion && gun.loc == src.loc - if(istype(W, /obj/machinery/cooker/grill)) - var/obj/machinery/cooker/grill/grill = W + if(istype(W, /obj/machinery/kitchen/grill)) + var/obj/machinery/kitchen/grill/grill = W return !(grill.stat & (NOPOWER|BROKEN)) if(istype(W, /obj/machinery/light)) var/obj/machinery/light/mounted = W diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 5a5740e73a3..77130987a01 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -14,6 +14,10 @@ var/list/stack = list() var/max_stack = 5 +/obj/item/trash/waffles + name = "waffles" + icon_state = "waffles" + /obj/item/trash/dish/baking_sheet name = "baking sheet" icon_state = "baking_sheet" diff --git a/code/game/world.dm b/code/game/world.dm index f62f5713541..1c0f0f34e54 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -187,7 +187,7 @@ var/server_name = "OnyxBay" //Emergency Fix load_mods() //end-emergency fix - + initialize_cooking_recipes() . = ..() Master.Initialize(10, FALSE) diff --git a/code/modules/cooking/coocking_appliances/appliance_defines.dm b/code/modules/cooking/coocking_appliances/appliance_defines.dm new file mode 100644 index 00000000000..b2fcfa6daef --- /dev/null +++ b/code/modules/cooking/coocking_appliances/appliance_defines.dm @@ -0,0 +1,9 @@ +/obj/machinery/kitchen + name = "Default Cooking Appliance" + desc = "Lookit me, I'm a cool machinery-doo. Hex didn't take his focus pills today." + icon = 'icons/obj/kitchen.dmi' + icon_state = "processor" + density = TRUE + anchored = TRUE + layer = BELOW_OBJ_LAYER + var/cooking = FALSE diff --git a/code/game/machinery/kitchen/cooking_machines/candy.dm b/code/modules/cooking/coocking_appliances/candy.dm similarity index 84% rename from code/game/machinery/kitchen/cooking_machines/candy.dm rename to code/modules/cooking/coocking_appliances/candy.dm index 866af6857da..0691805390a 100644 --- a/code/game/machinery/kitchen/cooking_machines/candy.dm +++ b/code/modules/cooking/coocking_appliances/candy.dm @@ -1,7 +1,8 @@ -/obj/machinery/cooker/candy +/obj/machinery/kitchen/candy name = "candy machine" desc = "Get yer candied cheese wheels here!" icon_state = "mixer_off" +/* off_icon = "mixer_off" on_icon = "mixer_on" cook_type = "candied" @@ -13,6 +14,7 @@ "Jelly" = /obj/item/reagent_containers/food/variable/jelly ) -/obj/machinery/cooker/candy/change_product_appearance() +/obj/machinery/kitchen/candy/change_product_appearance() food_color = get_random_colour(1) . = ..() +*/ diff --git a/code/modules/cooking/coocking_appliances/cooking_circuits.dm b/code/modules/cooking/coocking_appliances/cooking_circuits.dm new file mode 100644 index 00000000000..33eeb2d1b17 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/cooking_circuits.dm @@ -0,0 +1,27 @@ +/obj/item/circuitboard/stove + name = "Circuit board (Stovetop)" + build_path = /obj/machinery/kitchen/stove + board_type = "machine" + origin_tech = list(TECH_BIO = 1) + req_components = list( + /obj/item/stock_parts/manipulator = 2, //Affects the food quality + ) + +/obj/item/circuitboard/oven + name = "Circuit board (Convection Oven)" + build_path = /obj/machinery/kitchen/oven + board_type = "machine" + origin_tech = list(TECH_BIO = 1) + req_components = list( + /obj/item/stock_parts/micro_laser = 2, //Affects the food quality + ) + +/obj/item/circuitboard/grill + name = "Circuit board (Charcoal Grill)" + build_path = /obj/machinery/kitchen/grill + board_type = "machine" + origin_tech = list(TECH_BIO = 1) + req_components = list( + /obj/item/stock_parts/micro_laser = 2, //Affects the food quality + /obj/item/stock_parts/matter_bin = 2, //Affects wood hopper size + ) diff --git a/code/game/machinery/kitchen/gibber.dm b/code/modules/cooking/coocking_appliances/gibber.dm similarity index 100% rename from code/game/machinery/kitchen/gibber.dm rename to code/modules/cooking/coocking_appliances/gibber.dm diff --git a/code/modules/cooking/coocking_appliances/grill.dm b/code/modules/cooking/coocking_appliances/grill.dm new file mode 100644 index 00000000000..91a627817fd --- /dev/null +++ b/code/modules/cooking/coocking_appliances/grill.dm @@ -0,0 +1,499 @@ +#define ICON_SPLIT_X 16 + +/obj/machinery/kitchen/grill + name = "Grill" + desc = "A deep pit of charcoal for cooking food. A slot on the side of the machine takes wood and converts it into charcoal." + description_info = "Ctrl+Click: Set Temperatures / Timers. \nShift+Ctrl+Click: Turn on a burner.\nAlt+Click: Empty container of physical food." + icon = 'icons/obj/cooking/grill.dmi' + icon_state = "grill" + density = FALSE + anchored = TRUE + layer = BELOW_OBJ_LAYER + cooking = FALSE + var/list/temperature= list(J_LO, J_LO) + var/list/timer = list(0, 0) + var/list/timerstamp = list(0, 0) + var/list/switches = list(0, 0) + var/list/cooking_timestamp = list(0, 0) //Timestamp of when cooking initialized so we know if the prep was disturbed at any point. + var/list/items[2] + + use_power = 0 + interact_offline = TRUE + + var/stored_wood = 0 + var/wood_maximum = 30 + + var/reference_time = 0 //The exact moment when we call the process routine, just to account for lag. + + var/check_on_10 = 0 + + var/on_fire = FALSE //if the grill has caught fire or not. + + var/obj/effect/flick_light_overlay/hopper_insert //flick_light_overlay found in machinery/autolathe/autolathe.dm + +/obj/machinery/kitchen/grill/Initialize() + . = ..() + hopper_insert = new(src) + component_parts = list( + new /obj/item/circuitboard/grill(src)) + for(var/comp in component_parts[1].req_components) + if(comp == /obj/item/stack/cable_coil) + var/obj/item/stack/cable_coil/CC = new comp(src) + component_parts += CC + CC.amount = component_parts[1].req_components[comp] + continue + for(var/i = 1 to max(1, component_parts[1].req_components[comp])) + component_parts += new comp(src) + +//Did not want to use this... +/obj/machinery/kitchen/grill/Process() + + //if(on_fire) + //Do bad things if it is on fire. + + for(var/i=1, i<=2, i++) + if(switches[i]) + handle_cooking(null, i, FALSE) + + //Under normal circumstances, Only process the rest of this 10 process calls; it doesn't need to be hyper-accurate. + if(check_on_10 != 10) + check_on_10++ + return + else + check_on_10 = 0 + + if(switches[1] == 1) + if(!stored_wood) + handle_switch(null, 1) + else + stored_wood -= 1 + + if(switches[2] == 1) + if(!stored_wood) + handle_switch(null, 1) + else + stored_wood -= 1 + +/obj/machinery/kitchen/grill/RefreshParts() + ..() + + var/man_rating = 0 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + man_rating += M.rating + quality_mod = man_rating - 2 + + var/bin_rating = 0 + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + bin_rating += M.rating + wood_maximum = 15 * bin_rating + +/obj/machinery/kitchen/grill/examine(mob/user) + if(!..(user, 1)) + return FALSE + if(contents) + to_chat(user, SPAN_NOTICE("Charcoal: [stored_wood]/[wood_maximum]")) + +//Process how a specific grill is interacting with material +/obj/machinery/kitchen/grill/proc/cook_checkin(input) + + if(items[input]) + #ifdef CWJ_DEBUG + log_debug("/grill/proc/cook_checkin called on burner [input]") + #endif + var/old_timestamp = cooking_timestamp[input] + switch(temperature[input]) + if("Low") + spawn(CWJ_BURN_TIME_LOW) + if(cooking_timestamp[input] == old_timestamp) + handle_burning(input) + spawn(CWJ_IGNITE_TIME_LOW) + if(cooking_timestamp[input] == old_timestamp) + handle_ignition(input) + + if("Medium") + spawn(CWJ_BURN_TIME_MEDIUM) + if(cooking_timestamp[input] == old_timestamp) + handle_burning(input) + spawn(CWJ_IGNITE_TIME_MEDIUM) + if(cooking_timestamp[input] == old_timestamp) + handle_ignition(input) + + if("High") + spawn(CWJ_BURN_TIME_HIGH) + if(cooking_timestamp[input] == old_timestamp) + handle_burning(input) + spawn(CWJ_IGNITE_TIME_HIGH) + if(cooking_timestamp[input] == old_timestamp) + handle_ignition(input) + +/obj/machinery/kitchen/grill/proc/handle_burning(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + container.handle_burning() + +/obj/machinery/kitchen/grill/proc/handle_ignition(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + if(container.handle_ignition()) + on_fire = TRUE + +//Retrieve which half of the baking pan is being used. +/obj/machinery/kitchen/grill/proc/getInput(params) + var/list/click_params = params2list(params) + var/input + var/icon_x = text2num(click_params["icon-x"]) + if(icon_x <= ICON_SPLIT_X) + input = 1 + else if(icon_x > ICON_SPLIT_X) + input = 2 + #ifdef CWJ_DEBUG + log_debug("cooking_with_jane/grill/proc/getInput returned burner [input]. icon-x: [click_params["icon-x"]], icon-y: [click_params["icon-y"]]") + #endif + return input + +/obj/machinery/kitchen/grill/attackby(obj/item/used_item, mob/user, params) + if(default_deconstruction_screwdriver(user, used_item)) + return + + if(default_deconstruction_crowbar(user, used_item)) + return + + if(panel_open) //Can't insert objects when its screwed open + return + + if(istype(used_item, /obj/item/stack/material/wood)) + var/obj/item/stack/material/wood/stack = used_item + var/used_sheets = min(stack.get_amount(), (wood_maximum - stored_wood)) + if(!used_sheets) + to_chat(user, SPAN_NOTICE("The grill's hopper is full.")) + return + to_chat(user, SPAN_NOTICE("You add [used_sheets] wood plank[used_sheets>1?"s":""] into the grill's hopper.")) + if(!stack.use(used_sheets)) + qdel(stack) // Protects against weirdness + stored_wood += used_sheets + if(prob(5)) + src.visible_message(SPAN_DANGER("The Grill exclaims: \"OM NOM NOM~! YUMMIE~~!\"")) + + flick("wood_load", hopper_insert) + + return + + + var/input = getInput(params) + + if(items[input] != null) + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + container.process_item(used_item, params) + + else if(istype(used_item, /obj/item/reagent_containers/vessel/cooking_container/grill_grate)) + to_chat(usr, SPAN_NOTICE("You put a [used_item] on the grill.")) + if(usr.can_unequip(used_item)) + usr.drop(used_item, src) + else + used_item.forceMove(src) + items[input] = used_item + if(switches[input] == 1) + cooking_timestamp[input] = world.time + update_icon() + + +/obj/machinery/kitchen/grill/attack_hand(mob/user as mob, params) + var/input = getInput(params) + if(items[input] != null) + if(switches[input] == 1) + handle_cooking(user, input) + cooking_timestamp[input] = world.time + if(ishuman(user) && (temperature[input] == "High" || temperature[input] == "Medium" )) + var/mob/living/carbon/human/burn_victim = user + if(!burn_victim.gloves) + switch(temperature[input]) + if("High") + burn_victim.adjustFireLoss(5) + if("Medium") + burn_victim.adjustFireLoss(2) + to_chat(burn_victim, SPAN_DANGER("You burn your hand a little taking the [items[input]] off of the grill.")) + user.put_in_hands(items[input]) + items[input] = null + update_icon() + +/obj/machinery/kitchen/grill/CtrlClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + var/input = getInput(params) + #ifdef CWJ_DEBUG + log_debug("/grill/CtrlClick called on burner [input]") + #endif + var/choice = alert(user,"Select an action for burner #[input]","Select One:","Set temperature","Set timer","Cancel") + switch(choice) + if("Set temperature") + handle_temperature(user, input) + if("Set timer") + handle_timer(user, input) + +//Switch the cooking device on or off +/obj/machinery/kitchen/grill/CtrlShiftClick(mob/user, params) + + if(user.stat || user.restrained() || (!in_range(src, user))) + return + var/input = getInput(params) + + #ifdef CWJ_DEBUG + log_debug("/grill/CtrlClick called on burner [input]") + #endif + handle_switch(user, input) + +//Empty a container without a tool +/obj/machinery/kitchen/grill/AltClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + var/input = getInput(params) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + + #ifdef CWJ_DEBUG + log_debug("/grill/AltClick called on burner [input] [container]") + #endif + container.do_empty(user) + +/obj/machinery/kitchen/grill/proc/handle_temperature(user, input) + var/old_temp = temperature[input] + var/choice = input(user,"Select a heat setting for burner #[input].\nCurrent temp :[old_temp]","Select Temperature",old_temp) in list("High","Medium","Low","Cancel") + if(choice && choice != "Cancel" && choice != old_temp) + temperature[input] = choice + if(switches[input] == 1) + handle_cooking(user, input) + cooking_timestamp[input] = world.time + timerstamp[input]=world.time + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. [input] set! New timerstamp: [timerstamp[input]]") + #endif + + +/obj/machinery/kitchen/grill/proc/handle_timer(user, input) + var/old_time = timer[input]? round((timer[input]/(1 SECONDS)), 1 SECONDS): 1 + timer[input] = (input(user, "Enter a timer for burner #[input] (In Seconds, 0 Stays On) ","Set Timer", old_time) as num) SECONDS + if(timer[input] != 0 && switches[input] == 1) + timer_act(user, input) + update_icon() + +//input: 1 thru 4, depends on which burner was selected +/obj/machinery/kitchen/grill/proc/timer_act(mob/user, input) + + timerstamp[input]=round(world.time) + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. [input] set! New timerstamp: [timerstamp[input]]") + #endif + var/old_timerstamp = timerstamp[input] + spawn(timer[input]) + #ifdef CWJ_DEBUG + log_debug("Comparimg timerstamp([input]) of [timerstamp[input]] to old_timerstamp [old_timerstamp]") + #endif + if(old_timerstamp == timerstamp[input]) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + + handle_cooking(user, input, TRUE) //Do a check in the cooking interface + switches[input] = 0 + timerstamp[input]=world.time + cooking_timestamp[input] = world.time + update_icon() + update_icon() + +/obj/machinery/kitchen/grill/proc/handle_switch(user, input) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + if(switches[input] == 1) + handle_cooking(user, input) + switches[input] = 0 + timerstamp[input]=world.time + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. [input] set! New timerstamp: [timerstamp[input]]") + #endif + cooking_timestamp[input] = world.time + else if(stored_wood) + switches[input] = 1 + cooking_timestamp[input] = world.time + cook_checkin(input) + if(timer[input] != 0) + timer_act(user, input) + update_icon() + + + +/obj/machinery/kitchen/grill/proc/handle_cooking(mob/user, input, set_timer=FALSE) + + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + if(set_timer) + reference_time = timer[input] + else + reference_time = world.time - cooking_timestamp[input] + + #ifdef CWJ_DEBUG + log_debug("grill/proc/handle_cooking data:") + log_debug(" temperature: [temperature[input]]") + log_debug(" reference_time: [reference_time]") + log_debug(" world.time: [world.time]") + log_debug(" cooking_timestamp: [cooking_timestamp[input]]") + log_debug(" grill_data: [container.grill_data]") + #endif + + + if(container.grill_data[temperature[input]]) + container.grill_data[temperature[input]] += reference_time + else + container.grill_data[temperature[input]] = reference_time + + + if(user && user.Adjacent(src)) + container.process_item(src, user, send_message=TRUE) + else + container.process_item(src, user) + + + +/obj/machinery/kitchen/grill/update_icon() + overlays.Cut() + + for(var/obj/item/our_item in vis_contents) + src.remove_from_visible(our_item) + + icon_state="grill" + + var/grill_on = FALSE + for(var/i=1, i<=2, i++) + if(switches[i] == TRUE) + if(!grill_on) + grill_on = TRUE + AddOverlays(image(src.icon, icon_state="fire_[i]")) + + for(var/i=1, i<=2, i++) + if(!(items[i])) + continue + var/obj/item/our_item = items[i] + switch(i) + if(1) + our_item.pixel_x = -7 + our_item.pixel_y = 0 + if(2) + our_item.pixel_x = 7 + our_item.pixel_y = 0 + src.add_to_visible(our_item, i) + +/obj/machinery/kitchen/grill/proc/add_to_visible(obj/item/our_item, input) + our_item.vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID + src.vis_contents += our_item + if(input == 2 || input == 4) + var/matrix/M = matrix() + M.Scale(-1,1) + our_item.transform = M + our_item.transform *= 0.8 + +/obj/machinery/kitchen/grill/proc/remove_from_visible(obj/item/our_item, input) + our_item.vis_flags = 0 + our_item.blend_mode = 0 + our_item.transform = null + src.vis_contents.Remove(our_item) + +/obj/machinery/kitchen/grill/verb/toggle_burner_1() + set src in view(1) + set name = "Grill burner 1 - Toggle" + set category = "Object" + set desc = "Turn on a burner on the grill" + #ifdef CWJ_DEBUG + log_debug("/grill/verb/toggle_burner_1() called to toggle burner 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 1) + +/obj/machinery/kitchen/grill/verb/toggle_burner_2() + set src in view(1) + set name = "Grill burner 2 - Toggle" + set category = "Object" + set desc = "Turn on a burner on the grill" + #ifdef CWJ_DEBUG + log_debug("/grill/verb/toggle_burner_2() called to toggle burner 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 2) + +/obj/machinery/kitchen/grill/verb/change_temperature_1() + set src in view(1) + set name = "Grill burner 1 - Set Temp" + set category = "Object" + set desc = "Set a temperature for a burner." + #ifdef CWJ_DEBUG + log_debug("/grill/verb/change_temperature_1() called to change temperature on 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 1) + +/obj/machinery/kitchen/grill/verb/change_temperature_2() + set src in view(1) + set name = "Grill burner 2 - Set Temp" + set category = "Object" + set desc = "Set a temperature for a burner." + #ifdef CWJ_DEBUG + log_debug("/grill/verb/change_temperature_2() called to change temperature on 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 2) + +/obj/machinery/kitchen/grill/verb/change_timer_1() + set src in view(1) + set name = "Grill burner 1 - Set Timer" + set category = "Object" + set desc = "Set a timer for a burner." + #ifdef CWJ_DEBUG + log_debug("/grill/verb/change_timer_1() called to change timer on 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 1) + +/obj/machinery/kitchen/grill/verb/change_timer_2() + set src in view(1) + set name = "Grill burner 2 - Set Timer" + set category = "Object" + set desc = "Set a timer for a burner." + #ifdef CWJ_DEBUG + log_debug("/grill/verb/change_timer_2() called to change timer on 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 2) + + +#undef ICON_SPLIT_X + +// You (still) can't flick_light overlays in BYOND, and this is a vis_contents hack to provide the same functionality. +// Used for materials loading animation. +/obj/effect/flick_light_overlay + name = "" + icon_state = "" + // Acts like a part of the object it's created for when in vis_contents + // Inherits everything but the icon_state + vis_flags = VIS_INHERIT_ICON | VIS_INHERIT_DIR | VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID + +/obj/effect/flick_light_overlay/New(atom/movable/loc) + ..() + // Just VIS_INHERIT_ICON isn't enough: flick_light() needs an actual icon to be set + icon = loc.icon + loc.vis_contents += src + +/obj/effect/flick_light_overlay/Destroy() + if(istype(loc, /atom/movable)) + var/atom/movable/A = loc + A.vis_contents -= src + return ..() diff --git a/code/game/machinery/kitchen/icecream.dm b/code/modules/cooking/coocking_appliances/icecream.dm similarity index 100% rename from code/game/machinery/kitchen/icecream.dm rename to code/modules/cooking/coocking_appliances/icecream.dm diff --git a/code/modules/cooking/coocking_appliances/machinery.dm b/code/modules/cooking/coocking_appliances/machinery.dm new file mode 100644 index 00000000000..028778a22f9 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/machinery.dm @@ -0,0 +1,3 @@ +/obj/machinery/kitchen + var/list/scan_types = list() + var/quality_mod = 1 diff --git a/code/game/machinery/kitchen/microwave.dm b/code/modules/cooking/coocking_appliances/microwave.dm similarity index 100% rename from code/game/machinery/kitchen/microwave.dm rename to code/modules/cooking/coocking_appliances/microwave.dm diff --git a/code/modules/cooking/coocking_appliances/oven.dm b/code/modules/cooking/coocking_appliances/oven.dm new file mode 100644 index 00000000000..cd590ce7bdd --- /dev/null +++ b/code/modules/cooking/coocking_appliances/oven.dm @@ -0,0 +1,424 @@ + + +/obj/machinery/kitchen/oven + name = "Convection Oven" + desc = "A cozy oven for baking food." + description_info = "Ctrl+Click: Set Temperatures / Timers. \nShift+Ctrl+Click: Turn on the oven.\nAlt+Click: Empty container of physical food." + icon = 'icons/obj/cooking/oven.dmi' + icon_state = "oven" + density = TRUE + anchored = TRUE + layer = BELOW_OBJ_LAYER + cooking = FALSE + var/temperature= J_LO + var/timer = 0 + var/timerstamp = 0 + var/switches = 0 + var/opened = FALSE + var/cooking_timestamp = 0 //Timestamp of when cooking initialized so we know if the prep was disturbed at any point. + var/items = null + + var/reference_time = 0 //The exact moment when we call the process routine, just to account for lag. + + var/power_cost = 3000 //Power cost per process step for a particular burner + var/check_on_10 = 0 + + var/on_fire = FALSE //if the oven has caught fire or not. + +/obj/machinery/kitchen/oven/Initialize() + . = ..() + component_parts = list( + new /obj/item/circuitboard/oven(src)) + for(var/comp in component_parts[1].req_components) + if(comp == /obj/item/stack/cable_coil) + var/obj/item/stack/cable_coil/CC = new comp(src) + component_parts += CC + CC.amount = component_parts[1].req_components[comp] + continue + for(var/i = 1 to max(1, component_parts[1].req_components[comp])) + component_parts += new comp(src) + +//Did not want to use this... +/obj/machinery/kitchen/oven/Process() + + //if(on_fire) + //Do bad things if it is on fire. + + if(switches) + handle_cooking(null, FALSE) + + //Under normal circumstances, Only process the rest of this 10 process calls; it doesn't need to be hyper-accurate. + if(check_on_10 != 10) + check_on_10++ + return + else + check_on_10 = 0 + + if(switches) + use_power_oneoff(power_cost) + +/obj/machinery/kitchen/oven/RefreshParts() + ..() + + var/las_rating = 0 + for(var/obj/item/stock_parts/micro_laser/M in component_parts) + las_rating += M.rating + quality_mod = round(las_rating/2) + +//Process how a specific oven is interacting with material +/obj/machinery/kitchen/oven/proc/cook_checkin() + if(items) + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/proc/cook_checkin called on burner ") + #endif + var/old_timestamp = cooking_timestamp + switch(temperature) + if("Low") + spawn(CWJ_BURN_TIME_LOW) + if(cooking_timestamp == old_timestamp) + handle_burning() + spawn(CWJ_IGNITE_TIME_LOW) + if(cooking_timestamp == old_timestamp) + handle_ignition() + + if("Medium") + spawn(CWJ_BURN_TIME_MEDIUM) + if(cooking_timestamp == old_timestamp) + handle_burning() + spawn(CWJ_IGNITE_TIME_MEDIUM) + if(cooking_timestamp == old_timestamp) + handle_ignition() + + if("High") + spawn(CWJ_BURN_TIME_HIGH) + if(cooking_timestamp == old_timestamp) + handle_burning() + spawn(CWJ_IGNITE_TIME_HIGH) + if(cooking_timestamp == old_timestamp) + handle_ignition() + +/obj/machinery/kitchen/oven/proc/handle_burning() + if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items + container.handle_burning() + +/obj/machinery/kitchen/oven/proc/handle_ignition() + if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items + if(container.handle_ignition()) + on_fire = TRUE + +/obj/machinery/kitchen/oven/attackby(obj/item/used_item, mob/user, params) + if(default_deconstruction_screwdriver(user, used_item)) + return + + if(default_deconstruction_crowbar(user, used_item)) + return + + if(panel_open) //Can't insert objects when its screwed open + return + + var/center_selected = getInput(params) + + if(opened && center_selected) + if(items != null) + var/obj/item/reagent_containers/vessel/cooking_container/container = items + container.process_item(used_item, params) + + else if(istype(used_item, /obj/item/reagent_containers/vessel/cooking_container)) + to_chat(usr, SPAN_NOTICE("You put a [used_item] on the oven.")) + if(usr.can_unequip(used_item)) + usr.drop(used_item, src) + else + used_item.forceMove(src) + items = used_item + if(switches == 1) + cooking_timestamp = world.time + else + handle_open(user) + update_icon() + +//Retrieve whether or not the oven door has been clicked. +#define ICON_SPLIT_X_1 5 +#define ICON_SPLIT_X_2 28 +#define ICON_SPLIT_Y_1 5 +#define ICON_SPLIT_Y_2 20 + +/obj/machinery/kitchen/oven/proc/getInput(params) + var/list/click_params = params2list(params) + var/input + var/icon_x = text2num(click_params["icon-x"]) + var/icon_y = text2num(click_params["icon-y"]) + if(icon_x >= ICON_SPLIT_X_1 && icon_x <= ICON_SPLIT_X_2 && icon_y >= ICON_SPLIT_Y_1 && icon_y <= ICON_SPLIT_Y_2) + input = TRUE + else + input = FALSE + #ifdef CWJ_DEBUG + log_debug("cooking_with_jane/oven/proc/getInput returned area [input]. icon-x: [click_params["icon-x"]], icon-y: [click_params["icon-y"]]") + #endif + return input +#undef ICON_SPLIT_X_1 +#undef ICON_SPLIT_X_2 +#undef ICON_SPLIT_Y_1 +#undef ICON_SPLIT_Y_2 + + +/obj/machinery/kitchen/oven/attack_hand(mob/user as mob, params) + var/center_selected = getInput(params) + + switch(center_selected) + if(TRUE) + if(!opened) + handle_open(user) + else + if(items != null) + if(switches == 1) + handle_cooking(user) + cooking_timestamp = world.time + if(ishuman(user) && (temperature == "High" || temperature == "Medium" )) + var/mob/living/carbon/human/burn_victim = user + if(!burn_victim.gloves) + switch(temperature) + if("High") + burn_victim.adjustFireLoss(5) + if("Medium") + burn_victim.adjustFireLoss(2) + to_chat(burn_victim, SPAN_DANGER("You burn your hand a little taking the [items] off of the oven.")) + user.put_in_hands(items) + items = null + else + handle_open(user) + if(FALSE) + handle_open(user) + update_icon() + +/obj/machinery/kitchen/oven/CtrlClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/CtrlClick called ") + #endif + var/choice = alert(user,"Select an action","Select One:","Set temperature","Set timer","Cancel") + switch(choice) + if("Set temperature") + handle_temperature(user) + if("Set timer") + handle_timer(user) + +//Switch the cooking device on or off +/obj/machinery/kitchen/oven/CtrlShiftClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/CtrlShiftClick called") + #endif + handle_switch(user) + +//Empty a container without a tool +/obj/machinery/kitchen/oven/AltClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + var/center_selected = getInput(params) + switch(center_selected) + if(TRUE) + if(!opened) + to_chat(user, SPAN_NOTICE("The oven must be open to retrieve the food.")) + else + if((items != null && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) + var/obj/item/reagent_containers/vessel/cooking_container/container = items + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/AltClick called on [container]") + #endif + container.do_empty(user) + +/obj/machinery/kitchen/oven/proc/handle_open(mob/user) + if(opened) + opened = FALSE + else + opened = TRUE + if(switches == 1) + handle_switch(user) + +/obj/machinery/kitchen/oven/proc/handle_temperature(mob/user) + var/old_temp = temperature + var/choice = input(user,"Select a heat setting for burner #.\nCurrent temp :[old_temp]","Select Temperature",old_temp) in list("High","Medium","Low","Cancel") + if(choice && choice != "Cancel" && choice != old_temp) + temperature = choice + if(switches == 1) + handle_cooking(user) + cooking_timestamp = world.time + timerstamp=world.time + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. set! New timerstamp: [timerstamp]") + #endif + + +/obj/machinery/kitchen/oven/proc/handle_timer(mob/user) + var/old_time = timer? round((timer/(1 SECONDS)), 1 SECONDS): 1 + timer = (input(user, "Enter a timer for burner # (In Seconds, 0 Stays On)","Set Timer", old_time) as num) SECONDS + if(timer != 0 && switches == 1) + timer_act(user) + update_icon() + +/obj/machinery/kitchen/oven/proc/timer_act(mob/user) + + timerstamp=round(world.time) + #ifdef CWJ_DEBUG + log_debug("Timerstamp set! New timerstamp: [timerstamp]") + #endif + var/old_timerstamp = timerstamp + spawn(timer) + #ifdef CWJ_DEBUG + log_debug("Comparimg timerstamp() of [timerstamp] to old_timerstamp [old_timerstamp]") + #endif + if(old_timerstamp == timerstamp) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + + handle_cooking(user, TRUE) //Do a check in the cooking interface + switches = 0 + timerstamp=world.time + cooking_timestamp = world.time + update_icon() + update_icon() + +/obj/machinery/kitchen/oven/proc/handle_switch(user) + + if(switches == 1) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + handle_cooking(user) + switches = 0 + timerstamp=world.time + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. set! New timerstamp: [timerstamp]") + #endif + cooking_timestamp = world.time + else + if(opened) + to_chat(user, SPAN_NOTICE("The oven must be closed in order to turn it on.")) + return + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + switches = 1 + cooking_timestamp = world.time + cook_checkin(user) + if(timer != 0) + timer_act(user) + update_icon() + + + +/obj/machinery/kitchen/oven/proc/handle_cooking(mob/user, set_timer=FALSE) + + if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items + if(set_timer) + reference_time = timer + else + reference_time = world.time - cooking_timestamp + + + #ifdef CWJ_DEBUG + log_debug("oven/proc/handle_cooking data:") + log_debug(" temperature: [temperature]") + log_debug(" reference_time: [reference_time]") + log_debug(" world.time: [world.time]") + log_debug(" cooking_timestamp: [cooking_timestamp]") + log_debug(" oven_data: [container.oven_data]") + #endif + + + if(container.oven_data[temperature]) + container.oven_data[temperature] += reference_time + else + container.oven_data[temperature] = reference_time + + + if(user && user.Adjacent(src)) + container.process_item(src, user, send_message=TRUE) + else + container.process_item(src, user) + + + +/obj/machinery/kitchen/oven/update_icon() + overlays.Cut() + icon_state = "oven_base" + for(var/obj/item/our_item in vis_contents) + src.remove_from_visible(our_item) + + if(items) + var/obj/item/our_item = items + our_item.pixel_x = 0 + our_item.pixel_y = -5 + src.add_to_visible(our_item) + if(!opened) + AddOverlays(image(src.icon, icon_state="oven_hatch[switches?"_on":""]", layer=ABOVE_OBJ_LAYER)) + +/obj/machinery/kitchen/oven/proc/add_to_visible(obj/item/our_item) + our_item.vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID + src.vis_contents += our_item + our_item.transform *= 0.8 + +/obj/machinery/kitchen/oven/proc/remove_from_visible(obj/item/our_item) + our_item.vis_flags = 0 + our_item.blend_mode = 0 + our_item.transform = null + src.vis_contents.Remove(our_item) + +/obj/machinery/kitchen/oven/verb/toggle_burner() + set src in view(1) + set name = "Oven - Toggle" + set category = "Object" + set desc = "Turn on the oven" + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/verb/toggle_burner_1() called") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr) + + +/obj/machinery/kitchen/oven/verb/change_temperature() + set src in view(1) + set name = "Oven - Set Temp" + set category = "Object" + set desc = "Set a temperature for the oven." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/verb/change_temperature_1() called") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr) + +/obj/machinery/kitchen/oven/verb/change_timer() + set src in view(1) + set name = "Oven - Set Timer" + set category = "Object" + set desc = "Set a timer for the oven." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/verb/change_timer() called") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr) + +/obj/machinery/kitchen/oven/verb/toggle_door() + set src in view(1) + set name = "Oven - Open/Close door" + set category = "Object" + set desc = "Open/Close the door of the oven." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/verb/toggle_door() called") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_open(usr) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/modules/cooking/coocking_appliances/smartfridge.dm similarity index 100% rename from code/game/machinery/kitchen/smartfridge.dm rename to code/modules/cooking/coocking_appliances/smartfridge.dm diff --git a/code/modules/cooking/coocking_appliances/stove.dm b/code/modules/cooking/coocking_appliances/stove.dm new file mode 100644 index 00000000000..b659445efc4 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/stove.dm @@ -0,0 +1,527 @@ +#define ICON_SPLIT_X 16 +#define ICON_SPLIT_Y 21 + +/obj/machinery/kitchen/stove + name = "Stovetop" + desc = "A set of four burners for cooking food." + description_info = "Ctrl+Click: Set Temperatures / Timers. \nShift+Ctrl+Click: Turn on a burner.\nAlt+Click: Empty container of physical food." + icon = 'icons/obj/cooking/stove.dmi' + icon_state = "stove" + density = FALSE + anchored = TRUE + layer = BELOW_OBJ_LAYER + cooking = FALSE + var/list/temperature= list("Low", "Low", "Low", "Low") + var/list/timer = list(0, 0, 0, 0) + var/list/timerstamp = list(0, 0, 0, 0) + var/list/switches = list(0, 0, 0, 0) + var/list/cooking_timestamp = list(0, 0, 0, 0) //Timestamp of when cooking initialized so we know if the prep was disturbed at any point. + var/list/items[4] + + var/reference_time = 0 //The exact moment when we call the process routine, just to account for lag. + var/power_cost = 2500 //Power cost per process step for a particular burner + var/check_on_10 = 0 + + var/on_fire = FALSE //if the stove has caught fire or not. +/obj/machinery/kitchen/stove/Initialize() + . = ..() + component_parts = list( + new /obj/item/circuitboard/stove(src)) + for(var/comp in component_parts[1].req_components) + if(comp == /obj/item/stack/cable_coil) + var/obj/item/stack/cable_coil/CC = new comp(src) + component_parts += CC + CC.amount = component_parts[1].req_components[comp] + continue + for(var/i = 1 to max(1, component_parts[1].req_components[comp])) + component_parts += new comp(src) + +//Did not want to use this... +/obj/machinery/kitchen/stove/Process() + + //if(on_fire) + //Do bad things if it is on fire. + for(var/i=1, i<=4, i++) + if(switches[i]) + handle_cooking(null, i, FALSE) + + //Under normal circumstances, Only process the rest of this 10 process calls; it doesn't need to be hyper-accurate. + if(check_on_10 != 10) + check_on_10++ + return + else + check_on_10 = 0 + + var/used_power = 0 + if(switches[1] == 1) + used_power += power_cost + if(switches[2] == 1) + used_power += power_cost + if(switches[3] == 1) + used_power += power_cost + if(switches[4] == 1) + used_power += power_cost + use_power_oneoff(used_power) + +/obj/machinery/kitchen/stove/RefreshParts() + ..() + var/man_rating = 0 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + man_rating += M.rating + quality_mod = man_rating - 2 + +//Process how a specific stove is interacting with material +/obj/machinery/kitchen/stove/proc/cook_checkin(input) + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/proc/cook_checkin called on burner [input]") + #endif + if(items[input]) + var/old_timestamp = cooking_timestamp[input] + switch(temperature[input]) + if("Low") + spawn(CWJ_BURN_TIME_LOW) + if(cooking_timestamp[input] == old_timestamp) + handle_burning(input) + spawn(CWJ_IGNITE_TIME_LOW) + if(cooking_timestamp[input] == old_timestamp) + handle_ignition(input) + + if("Medium") + spawn(CWJ_BURN_TIME_MEDIUM) + if(cooking_timestamp[input] == old_timestamp) + handle_burning(input) + spawn(CWJ_IGNITE_TIME_MEDIUM) + if(cooking_timestamp[input] == old_timestamp) + handle_ignition(input) + + if("High") + spawn(CWJ_BURN_TIME_HIGH) + if(cooking_timestamp[input] == old_timestamp) + handle_burning(input) + spawn(CWJ_IGNITE_TIME_HIGH) + if(cooking_timestamp[input] == old_timestamp) + handle_ignition(input) + +/obj/machinery/kitchen/stove/proc/handle_burning(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + container.handle_burning() + +/obj/machinery/kitchen/stove/proc/handle_ignition(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + if(container.handle_ignition()) + on_fire = TRUE + +//Retrieve which quadrant of the baking pan is being used. +/obj/machinery/kitchen/stove/proc/getInput(params) + var/list/click_params = params2list(params) + var/input + var/icon_x = text2num(click_params["icon-x"]) + var/icon_y = text2num(click_params["icon-y"]) + if(icon_x <= ICON_SPLIT_X && icon_y <= ICON_SPLIT_Y) + input = 1 + else if(icon_x > ICON_SPLIT_X && icon_y <= ICON_SPLIT_Y) + input = 2 + else if(icon_x <= ICON_SPLIT_X && icon_y > ICON_SPLIT_Y) + input = 3 + else if(icon_x > ICON_SPLIT_X && icon_y > ICON_SPLIT_Y) + input = 4 + + #ifdef CWJ_DEBUG + log_debug("cooking_with_jane/stove/proc/getInput returned burner [input]. icon-x: [click_params["icon-x"]], icon-y: [click_params["icon-y"]]") + #endif + return input + +/obj/machinery/kitchen/stove/attackby(obj/item/used_item, mob/user, params) + if(default_deconstruction_screwdriver(user, used_item)) + return + + if(default_deconstruction_crowbar(user, used_item)) + return + + if(panel_open) //Can't insert objects when its screwed open + return + + var/input = getInput(params) + + if(items[input] != null) + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + container.process_item(used_item, params) + + else if(istype(used_item, /obj/item/reagent_containers/vessel/cooking_container)) + to_chat(usr, SPAN_NOTICE("You put a [used_item] on the stove.")) + if(usr.can_unequip(used_item)) + usr.drop(used_item, src) + else + used_item.forceMove(src) + items[input] = used_item + if(switches[input] == 1) + cooking_timestamp[input] = world.time + update_icon() + +/obj/machinery/kitchen/stove/attack_hand(mob/user as mob, params) + var/input = getInput(params) + if(items[input] != null) + if(switches[input] == 1) + handle_cooking(user, input) + cooking_timestamp[input] = world.time + if(ishuman(user) && (temperature[input] == "High" || temperature[input] == "Medium" )) + var/mob/living/carbon/human/burn_victim = user + if(!burn_victim.gloves) + switch(temperature[input]) + if("High") + burn_victim.adjustFireLoss(5) + if("Medium") + burn_victim.adjustFireLoss(2) + to_chat(burn_victim, SPAN_DANGER("You burn your hand a little taking the [items[input]] off of the stove.")) + user.put_in_hands(items[input]) + items[input] = null + update_icon() + +/obj/machinery/kitchen/stove/CtrlClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + var/input = getInput(params) + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/CtrlClick called on burner [input]") + #endif + var/choice = alert(user,"Select an action for burner #[input]","Select One:","Set temperature","Set timer","Cancel") + switch(choice) + if("Set temperature") + handle_temperature(user, input) + if("Set timer") + handle_timer(user, input) + +//Switch the cooking device on or off +/obj/machinery/kitchen/stove/CtrlShiftClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + var/input = getInput(params) + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/CtrlShiftClick called on burner [input]") + #endif + handle_switch(user, input) + +//Empty a container without a tool +/obj/machinery/kitchen/stove/AltClick(mob/user, params) + if(user.stat || user.restrained() || (!in_range(src, user))) + return + + var/input = getInput(params) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/AltClick called on burner [input] [container]") + #endif + container.do_empty(user) + +/obj/machinery/kitchen/stove/proc/handle_temperature(user, input) + var/old_temp = temperature[input] + var/choice = input(user,"Select a heat setting for burner #[input].\nCurrent temp :[old_temp]","Select Temperature",old_temp) in list("High","Medium","Low","Cancel") + if(choice && choice != "Cancel" && choice != old_temp) + temperature[input] = choice + if(switches[input] == 1) + handle_cooking(user, input) + cooking_timestamp[input] = world.time + timerstamp[input]=world.time + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. [input] set! New timerstamp: [timerstamp[input]]") + #endif + + +/obj/machinery/kitchen/stove/proc/handle_timer(user, input) + var/old_time = timer[input]? round((timer[input]/(1 SECONDS)), 1 SECONDS): 1 + timer[input] = (input(user, "Enter a timer for burner #[input] (In Seconds, 0 Stays On)","Set Timer", old_time) as num) SECONDS + if(timer[input] != 0 && switches[input] == 1) + timer_act(user, input) + update_icon() + +//input: 1 thru 4, depends on which burner was selected +/obj/machinery/kitchen/stove/proc/timer_act(mob/user, input) + + timerstamp[input]=round(world.time) + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. [input] set! New timerstamp: [timerstamp[input]]") + #endif + var/old_timerstamp = timerstamp[input] + spawn(timer[input]) + #ifdef CWJ_DEBUG + log_debug("Comparimg timerstamp([input]) of [timerstamp[input]] to old_timerstamp [old_timerstamp]") + #endif + if(old_timerstamp == timerstamp[input]) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + + handle_cooking(user, input, TRUE) //Do a check in the cooking interface + switches[input] = 0 + timerstamp[input]=world.time + cooking_timestamp[input] = world.time + update_icon() + update_icon() + +/obj/machinery/kitchen/stove/proc/handle_switch(user, input) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) + if(switches[input] == 1) + handle_cooking(user, input) + switches[input] = 0 + timerstamp[input]=world.time + #ifdef CWJ_DEBUG + log_debug("Timerstamp no. [input] set! New timerstamp: [timerstamp[input]]") + #endif + cooking_timestamp[input] = world.time + else + switches[input] = 1 + cooking_timestamp[input] = world.time + cook_checkin(input) + if(timer[input] != 0) + timer_act(user, input) + update_icon() + + + +/obj/machinery/kitchen/stove/proc/handle_cooking(mob/user, input, set_timer=FALSE) + + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) + return + + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] + if(set_timer) + reference_time = timer[input] + else + reference_time = world.time - cooking_timestamp[input] + + + #ifdef CWJ_DEBUG + log_debug("stove/proc/handle_cooking data:") + log_debug(" temperature: [temperature[input]]") + log_debug(" reference_time: [reference_time]") + log_debug(" world.time: [world.time]") + log_debug(" cooking_timestamp: [cooking_timestamp[input]]") + log_debug(" stove_data: [container.stove_data]") + #endif + + + if(container.stove_data[temperature[input]]) + container.stove_data[temperature[input]] += reference_time + else + container.stove_data[temperature[input]] = reference_time + + + if(user && user.Adjacent(src)) + container.process_item(src, user, send_message=TRUE) + else + container.process_item(src, user) + + + +/obj/machinery/kitchen/stove/update_icon() + overlays.Cut() + + for(var/obj/item/our_item in vis_contents) + src.remove_from_visible(our_item) + + if(panel_open) + icon_state="stove_open" + else + icon_state="stove" + + var/stove_on = FALSE + for(var/i=1, i<=4, i++) + if(switches[i] == TRUE) + if(!stove_on) + stove_on = TRUE + AddOverlays(image(src.icon, icon_state="[panel_open?"open_":""]burner_[i]")) + + if(stove_on) + AddOverlays(image(src.icon, icon_state="indicator")) + + + for(var/i=1, i<=4, i++) + if(!(items[i])) + continue + var/obj/item/our_item = items[i] + switch(i) + if(1) + our_item.pixel_x = -7 + our_item.pixel_y = 0 + if(2) + our_item.pixel_x = 7 + our_item.pixel_y = 0 + if(3) + our_item.pixel_x = -7 + our_item.pixel_y = 9 + if(4) + our_item.pixel_x = 7 + our_item.pixel_y = 9 + src.add_to_visible(our_item, i) + if(switches[i] == 1) + AddOverlays(image(src.icon, icon_state="steam_[i]", layer=ABOVE_OBJ_LAYER)) + +/obj/machinery/kitchen/stove/proc/add_to_visible(obj/item/our_item, input) + our_item.vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID + src.vis_contents += our_item + if(input == 2 || input == 4) + var/matrix/M = matrix() + M.Scale(-1,1) + our_item.transform = M + our_item.transform *= 0.8 + +/obj/machinery/kitchen/stove/proc/remove_from_visible(obj/item/our_item, input) + our_item.vis_flags = 0 + our_item.blend_mode = 0 + our_item.transform = null + src.vis_contents.Remove(our_item) + +/obj/machinery/kitchen/stove/verb/toggle_burner_1() + set src in view(1) + set name = "Stove burner 1 - Toggle" + set category = "Object" + set desc = "Turn on a burner on the stove" + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/toggle_burner_1() called to toggle burner 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 1) + +/obj/machinery/kitchen/stove/verb/toggle_burner_2() + set src in view(1) + set name = "Stove burner 2 - Toggle" + set category = "Object" + set desc = "Turn on a burner on the stove" + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/toggle_burner_2() called to toggle burner 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 2) + +/obj/machinery/kitchen/stove/verb/toggle_burner_3() + set src in view(1) + set name = "Stove burner 3 - Toggle" + set category = "Object" + set desc = "Turn on a burner on the stove" + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/toggle_burner_3() called to toggle burner 3") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 3) + +/obj/machinery/kitchen/stove/verb/toggle_burner_4() + set src in view(1) + set name = "Stove burner 4 - Toggle" + set category = "Object" + set desc = "Turn on a burner on the stove" + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/toggle_burner_4() called to toggle burner 4") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 4) + +/obj/machinery/kitchen/stove/verb/change_temperature_1() + set src in view(1) + set name = "Stove burner 1 - Set Temp" + set category = "Object" + set desc = "Set a temperature for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_temperature_1() called to change temperature on 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 1) + +/obj/machinery/kitchen/stove/verb/change_temperature_2() + set src in view(1) + set name = "Stove burner 2 - Set Temp" + set category = "Object" + set desc = "Set a temperature for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_temperature_2() called to change temperature on 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 2) + +/obj/machinery/kitchen/stove/verb/change_temperature_3() + set src in view(1) + set name = "Stove burner 3 - Set Temp" + set category = "Object" + set desc = "Set a temperature for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_temperature_3() called to change temperature on 3") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 3) + +/obj/machinery/kitchen/stove/verb/change_temperature_4() + set src in view(1) + set name = "Stove burner 4 - Set Temp" + set category = "Object" + set desc = "Set a temperature for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_temperature_4() called to change temperature on 4") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 4) + +/obj/machinery/kitchen/stove/verb/change_timer_1() + set src in view(1) + set name = "Stove burner 1 - Set Timer" + set category = "Object" + set desc = "Set a timer for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_timer_1() called to change timer on 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 1) + +/obj/machinery/kitchen/stove/verb/change_timer_2() + set src in view(1) + set name = "Stove burner 2 - Set Timer" + set category = "Object" + set desc = "Set a timer for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_timer_2() called to change timer on 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 2) + +/obj/machinery/kitchen/stove/verb/change_timer_3() + set src in view(1) + set name = "Stove burner 3 - Set Timer" + set category = "Object" + set desc = "Set a timer for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_timer_3() called to change timer on 3") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 3) + +/obj/machinery/kitchen/stove/verb/change_timer_4() + set src in view(1) + set name = "Stove burner 4 - Set Timer" + set category = "Object" + set desc = "Set a timer for a burner." + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/stove/verb/change_timer_4() called to change timer on 4") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 4) +#undef ICON_SPLIT_X +#undef ICON_SPLIT_Y diff --git a/code/modules/cooking/cooking.dm b/code/modules/cooking/cooking.dm new file mode 100644 index 00000000000..1ca4601c16d --- /dev/null +++ b/code/modules/cooking/cooking.dm @@ -0,0 +1,792 @@ + + +/* + +The recipe datum outlines a list of steps from getting a piece of food from point A to point B. +Recipes have steps that are held in a modular linked list, holding required steps, and optional ones to increase the total quality of the food. +Following a recipe incorrectly (IE, adding too much of an item, having the burner too hot, etc.) Will decrease the quality of the food.area + +Recipes have clear start and end points. They start with a particular item and end with a particular item. + +That said, a start item can follow multiple recipes until they eventually diverge as different steps are followed. + +In the case two recipes have identical steps, the user should be prompted on what their intended result should be. (Donuts vs Bagels) + +Recipes are loaded at startup. Food items reference it by the recipe_tracker datum + +By following the steps correctly, good food can be made. + +Food quality is calculated based on the steps taken. + +*/ + +/datum/cooking/recipe + var/unique_id + var/name //Name for the cooking guide. Auto-populates if not set. + var/description //Description for the cooking guide. Auto-populates if not set. + var/recipe_guide //Step by step recipe guide. I hate it. + var/recipe_icon //Icon for the cooking guide. Auto-populates if not set. + var/recipe_icon_state //Icon state for the cooking guide. Auto-populates if not set. + + //The Cooking container the recipe is performed in. + var/cooking_container = null + + var/product_type //Type path for the product created by the recipe. An item of this type should ALSO have a recipe_tracker Datum. + var/product_name + var/product_count = 1 //how much of a thing is made per case of the recipe being followed. + + //Special variables that must be defined INSTEAD of product_type in order to create reagents instead of an object. + var/reagent_id + var/reagent_amount + var/reagent_name + var/reagent_desc + + var/icon_image_file + + var/quality_description //A decorator description tacked onto items when the recipe is completed. Used in future recipes. "The Bread looks Handmade." + + var/exclusive_option_mode = FALSE //triggers whether two steps in a process are exclusive- IE: you can do one or the other, but not both. + + var/list/active_exclusive_option_list = list() //Only needed during the creation process for tracking a given exclusive option dictionary. + + var/option_chain_mode = 0 //triggers whether two steps in a process are exclusive- IE: you can do one or the other, but not both. + + var/active_exclusive_option_chain //Only needed during the creation process for tracking items in an option chain. + + var/replace_reagents = FALSE //Determines if we entirely replace the contents of the food product with the slurry that goes into it. + + var/appear_in_default_catalog = TRUE //Everything appears in the catalog by default + /* + The Step Builder is iterated through to create new steps in the recipe dynamically. + _OPTIONAL steps are linked to the previously made REQUIRED step + CWJ_BEGIN steps must eventually terminate in a matching CWJ_END step + */ + var/list/step_builder = null + + var/datum/cooking/recipe_step/first_step //The first step in the linked list that will result in the final recipe + + var/datum/cooking/recipe_step/last_required_step //Reference to the last required step in the cooking process. + + var/datum/cooking/recipe_step/last_created_step //Reference to the last step made, regardless of if it was required or not. + +/datum/cooking/recipe/New() + + if(reagent_id && !reagent_amount) + CRASH("/datum/cooking/recipe/New: Reagent creating recipe must have reagent_amount defined! Recipe path=[src.type].") + + build_steps() + + if(ispath(product_type)) + var/obj/item/product_info = new product_type() + product_name = product_info.name + if(!name) + name = product_info.name + + if(!description) + description = product_info.desc + + QDEL_NULL(product_info) //We don't need this anymore. + + if(reagent_id) + var/datum/reagent/test_reagent = reagent_id + if(test_reagent) + if(!name) + name = test_reagent.name + if(!description) + description = test_reagent.description + + reagent_name = test_reagent.name + reagent_desc = test_reagent.description + + if(!name) + name = "NO NAME!" + + unique_id = sequential_id("recipe") + +//Build out the recipe steps for a recipe, based on the step_builder list +/datum/cooking/recipe/proc/build_steps() + if(!step_builder) + CRASH("/datum/cooking/recipe/build_steps: Recipe has no step builder defined! Recipe path=[src.type].") + + if(!cooking_container) + CRASH("/datum/cooking/recipe/build_steps: Recipe has no cooking container defined! Recipe path=[src.type].") + + //Create a base step + create_step_base() + + for (var/step in step_builder) + if(islist(step)) + var/list/step_list = step + var/reason = "" + switch(step_list[1]) + if(CWJ_ADD_ITEM) + if(step_list.len < 2) + reason="Bad argument Length for CWJ_ADD_ITEM" + else if(!ispath(step_list[2])) + reason="Bad argument type for CWJ_ADD_ITEM at arg 2" + else + create_step_add_item(step_list[2], FALSE) + if(CWJ_ADD_ITEM_OPTIONAL) + if(step_list.len < 2) + reason="Bad argument Length for CWJ_ADD_ITEM_OPTIONAL" + else if(!ispath(step_list[2])) + reason="Bad argument type for CWJ_ADD_ITEM_OPTIONAL at arg 2" + else + create_step_add_item(step_list[2], TRUE) + if(CWJ_ADD_REAGENT) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_ADD_REAGENT" + else if(!ispath(step_list[2],/datum/reagent)) + reason="Bad reagent type for CWJ_ADD_REAGENT at arg 2" + else + create_step_add_reagent(step_list[2], step_list[3], FALSE) + if(CWJ_ADD_REAGENT_OPTIONAL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_ADD_REAGENT_OPTIONAL" + else if(!ispath(step_list[2],/datum/reagent)) + reason="Bad reagent type for CWJ_ADD_REAGENT_OPTIONAL at arg 2" + else + create_step_add_reagent(step_list[2], step_list[3], TRUE) + if(CWJ_USE_ITEM) + if(step_list.len < 2) + reason="Bad argument Length for CWJ_USE_ITEM" + else if(!ispath(step_list[2])) + reason="Bad argument type for CWJ_USE_ITEM at arg 2" + else + create_step_use_item(step_list[2], FALSE) + if(CWJ_USE_ITEM_OPTIONAL) + if(step_list.len < 2) + reason="Bad argument Length for CWJ_USE_ITEM_OPTIONAL" + else if(!ispath(step_list[2])) + reason="Bad argument type for CWJ_USE_ITEM_OPTIONAL at arg 2" + else + create_step_use_item(step_list[2], TRUE) + if(CWJ_ADD_PRODUCE) + if(step_list.len < 2) + reason="Bad argument Length for CWJ_ADD_PRODUCE" + else + create_step_add_produce(step_list[2], FALSE) + if(CWJ_ADD_PRODUCE_OPTIONAL) + if(step_list.len < 2) + reason="Bad argument Length for CWJ_ADD_PRODUCE_OPTIONAL" + else + create_step_add_produce(step_list[2], TRUE) + if(CWJ_USE_TOOL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_TOOL" + else + create_step_use_tool(step_list[2], step_list[3], FALSE) + if(CWJ_USE_TOOL_OPTIONAL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_TOOL_OPTIONAL" + else + create_step_use_tool(step_list[2], step_list[3], TRUE) + if(CWJ_USE_STOVE) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_STOVE" + switch(step_list[2]) + if(J_LO) + if(step_list[3] > CWJ_BURN_TIME_LOW) + reason="Time too large for Low setting on CWJ_USE_STOVE; Food will automatically burn." + + if(J_MED) + if(step_list[3] > CWJ_BURN_TIME_MEDIUM) + reason="Time too large for Medium setting on CWJ_USE_STOVE; Food will automatically burn." + + if(J_HI) + if(step_list[3] > CWJ_BURN_TIME_HIGH) + reason="Time too large for High setting on CWJ_USE_STOVE; Food will automatically burn." + + else + reason="Unrecognized temperature for CWJ_USE_STOVE" + + if(!reason) + create_step_use_stove(step_list[2], step_list[3], FALSE) + if(CWJ_USE_STOVE_OPTIONAL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_STOVE_OPTIONAL" + switch(step_list[2]) + if(J_LO) + if(step_list[3] > CWJ_BURN_TIME_LOW) + reason="Time too large for Low setting on CWJ_USE_STOVE_OPTIONAL; Food will automatically burn." + + if(J_MED) + if(step_list[3] > CWJ_BURN_TIME_MEDIUM) + reason="Time too large for Medium setting on CWJ_USE_STOVE_OPTIONAL; Food will automatically burn." + + if(J_HI) + if(step_list[3] > CWJ_BURN_TIME_HIGH) + reason="Time too large for High setting on CWJ_USE_STOVE_OPTIONAL; Food will automatically burn." + else + reason="Unrecognized temperature for CWJ_USE_STOVE_OPTIONAL" + if(!reason) + create_step_use_stove(step_list[2], step_list[3], TRUE) + + if(CWJ_USE_GRILL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_GRILL" + switch(step_list[2]) + if(J_LO) + if(step_list[3] > CWJ_BURN_TIME_LOW) + reason="Time too large for Low setting on CWJ_USE_GRILL; Food will automatically burn." + + if(J_MED) + if(step_list[3] > CWJ_BURN_TIME_MEDIUM) + reason="Time too large for Medium setting on CWJ_USE_GRILL; Food will automatically burn." + + if(J_HI) + if(step_list[3] > CWJ_BURN_TIME_HIGH) + reason="Time too large for High setting on CWJ_USE_GRILL; Food will automatically burn." + + else + reason="Unrecognized temperature for CWJ_USE_GRILL" + + if(!reason) + create_step_use_grill(step_list[2], step_list[3], FALSE) + + if(CWJ_USE_GRILL_OPTIONAL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_GRILL_OPTIONAL" + switch(step_list[2]) + if(J_LO) + if(step_list[3] > CWJ_BURN_TIME_LOW) + reason="Time too large for Low setting on CWJ_USE_GRILL_OPTIONAL; Food will automatically burn." + + if(J_MED) + if(step_list[3] > CWJ_BURN_TIME_MEDIUM) + reason="Time too large for Medium setting on CWJ_USE_GRILL_OPTIONAL; Food will automatically burn." + + if(J_HI) + if(step_list[3] > CWJ_BURN_TIME_HIGH) + reason="Time too large for High setting on CWJ_USE_GRILL_OPTIONAL; Food will automatically burn." + else + reason="Unrecognized temperature for CWJ_USE_GRILL_OPTIONAL" + if(!reason) + create_step_use_grill(step_list[2], step_list[3], TRUE) + if(CWJ_USE_OVEN) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_OVEN" + switch(step_list[2]) + if(J_LO) + if(step_list[3] > CWJ_BURN_TIME_LOW) + reason="Time too large for Low setting on CWJ_USE_OVEN; Food will automatically burn." + + if(J_MED) + if(step_list[3] > CWJ_BURN_TIME_MEDIUM) + reason="Time too large for Medium setting on CWJ_USE_OVEN; Food will automatically burn." + + if(J_HI) + if(step_list[3] > CWJ_BURN_TIME_HIGH) + reason="Time too large for High setting on CWJ_USE_OVEN; Food will automatically burn." + + else + reason="Unrecognized temperature for CWJ_USE_OVEN" + + if(!reason) + create_step_use_oven(step_list[2], step_list[3], FALSE) + if(CWJ_USE_OVEN_OPTIONAL) + if(step_list.len < 3) + reason="Bad argument Length for CWJ_USE_OVEN_OPTIONAL" + switch(step_list[2]) + if(J_LO) + if(step_list[3] > CWJ_BURN_TIME_LOW) + reason="Time too large for Low setting on CWJ_USE_OVEN_OPTIONAL; Food will automatically burn." + + if(J_MED) + if(step_list[3] > CWJ_BURN_TIME_MEDIUM) + reason="Time too large for Medium setting on CWJ_USE_OVEN_OPTIONAL; Food will automatically burn." + + if(J_HI) + if(step_list[3] > CWJ_BURN_TIME_HIGH) + reason="Time too large for High setting on CWJ_USE_OVEN_OPTIONAL; Food will automatically burn." + else + reason="Unrecognized temperature for CWJ_USE_OVEN_OPTIONAL" + if(!reason) + create_step_use_oven(step_list[2], step_list[3], TRUE) + + //Named Arguments modify the recipe in fixed ways + if("desc" in step_list) + set_step_desc(step_list["desc"]) + + if("base" in step_list) + set_step_base_quality(step_list["base"]) + + if("max" in step_list) + set_step_max_quality(step_list["max"]) + + if("prod_desc" in step_list) + set_step_custom_result_desc(step_list["prod_desc"]) + + if("qmod" in step_list) + if(!set_inherited_quality_modifier(step_list["qmod"])) + reason="qmod / inherited_quality_modifier declared on non add-item recipe step." + + if("remain_percent" in step_list) + if(step_list["remain_percent"] > 1 || step_list["remain_percent"] < 0) + reason="remain_percent must be between 1 and 0." + else if(!set_remain_percent_modifier(step_list["remain_percent"])) + reason="remain_percent / declared on non add-reagent recipe step." + + if("exact" in step_list) + if(!set_exact_type_required(step_list["exact"])) + reason="exact / exact type match declared on non add-item / use-item recipe step." + + if("reagent_skip" in step_list) + if(!set_reagent_skip(step_list["reagent_skip"])) + reason="reagent_skip / reagent_skip declared on non add-item / add-reagent recipe step." + + if("exclude_reagents" in step_list) + for(var/reagent in step_list["exclude_reagents"]) + if(istype(reagent, /datum/reagent)) + reason="exclude_reagents list has bad type reagent [reagent]" + + if(!set_exclude_reagents(step_list["exclude_reagents"])) + reason="exclude_reagents declared on non add-item / add-reagent recipe step." + + if(reason) + CRASH("[src.type]/New: CWJ Step Builder failed. Reason: [reason]") + + propagate_step_description() + else + switch(step) + if(CWJ_BEGIN_EXCLUSIVE_OPTIONS) + begin_exclusive_options() + if(CWJ_END_EXCLUSIVE_OPTIONS) + end_exclusive_options() + if(CWJ_BEGIN_OPTION_CHAIN) + begin_option_chain() + if(CWJ_END_OPTION_CHAIN) + end_option_chain() + + if(exclusive_option_mode) + CRASH("/datum/cooking/recipe/New: Exclusive option active at end of recipe creation process. Recipe name=[name].") + + if(option_chain_mode) + CRASH("/datum/cooking/recipe/New: Option Chain active at end of recipe creation process. Recipe name=[name].") + + if(last_created_step.flags & CWJ_IS_OPTIONAL) + CRASH("/datum/cooking/recipe/New: Last option in builder is optional. It must be a required step! Recipe name=[name].") + +//Adds to the recipe description for every step of the recipe +/datum/cooking/recipe/proc/propagate_step_description() + var/qualifier = "> " + if(last_created_step.flags & CWJ_IS_OPTIONAL) + qualifier = ">> (Optional) " + if(last_created_step.flags & CWJ_IS_OPTION_CHAIN) + qualifier = ">> (Option Chain) " + if(last_created_step.flags & CWJ_IS_EXCLUSIVE) + qualifier = ">> (Exclusive Option) " + recipe_guide +="
[qualifier][last_created_step.desc]" + +//----------------------------------------------------------------------------------- +//Commands for interacting with the recipe tracker +//----------------------------------------------------------------------------------- +//Add base step command. All other steps stem from this. Don't call twice! +/datum/cooking/recipe/proc/create_step_base() + var/datum/cooking/recipe_step/start/step = new /datum/cooking/recipe_step/start(cooking_container) + last_required_step = step + last_created_step = step + first_step = step + +//----------------------------------------------------------------------------------- +//Add reagent step shortcut commands +/datum/cooking/recipe/proc/create_step_add_reagent(reagent_id, amount, optional) + var/datum/cooking/recipe_step/add_reagent/step = new (reagent_id, amount, src) + return src.add_step(step, optional) + +//----------------------------------------------------------------------------------- +//Add item step shortcut commands +/datum/cooking/recipe/proc/create_step_add_item(item_type, optional) + var/datum/cooking/recipe_step/add_item/step = new (item_type, src) + return src.add_step(step, optional) +//----------------------------------------------------------------------------------- +//Use item step shortcut commands +/datum/cooking/recipe/proc/create_step_use_item(item_type, optional) + var/datum/cooking/recipe_step/use_item/step = new (item_type, src) + return src.add_step(step, optional) + +//----------------------------------------------------------------------------------- +//Add produce step shortcut commands +/datum/cooking/recipe/proc/create_step_add_produce(produce, optional) + var/datum/cooking/recipe_step/add_produce/step = new /datum/cooking/recipe_step/add_produce(produce, src) + return src.add_step(step, optional) +//----------------------------------------------------------------------------------- +//Use Tool step shortcut commands +/datum/cooking/recipe/proc/create_step_use_tool(type, quality, optional) + var/datum/cooking/recipe_step/use_tool/step = new (type, quality, src) + return src.add_step(step, optional) + +//----------------------------------------------------------------------------------- +//Use Stove step shortcut commands +/datum/cooking/recipe/proc/create_step_use_stove(heat, time, optional) + var/datum/cooking/recipe_step/use_stove/step = new (heat, time, src) + return src.add_step(step, optional) +//----------------------------------------------------------------------------------- +//Use Grill step shortcut commands +/datum/cooking/recipe/proc/create_step_use_grill(heat, time, optional) + var/datum/cooking/recipe_step/use_grill/step = new (heat, time, src) + return src.add_step(step, optional) +//----------------------------------------------------------------------------------- +//Use Oven step shortcut commands +/datum/cooking/recipe/proc/create_step_use_oven(heat, time, optional) + var/datum/cooking/recipe_step/use_oven/step = new (heat, time, src) + return src.add_step(step, optional) +//----------------------------------------------------------------------------------- +//Customize the last step created +/datum/cooking/recipe/proc/set_step_desc(new_description) + last_created_step.desc = new_description + +/datum/cooking/recipe/proc/set_step_max_quality(quality) + last_created_step.flags |= CWJ_BASE_QUALITY_ENABLED + last_created_step.max_quality_award = quality + +/datum/cooking/recipe/proc/set_step_base_quality(quality) + last_created_step.flags |= CWJ_MAX_QUALITY_ENABLED + last_created_step.base_quality_award = quality + +/datum/cooking/recipe/proc/set_step_custom_result_desc(new_description) + last_created_step.custom_result_desc = new_description + + +/datum/cooking/recipe/proc/set_exact_type_required(boolean) + if((last_created_step.class == CWJ_ADD_ITEM) || (last_created_step.class == CWJ_USE_ITEM)) + last_created_step?:exact_path = boolean + return TRUE + else + return FALSE + +/datum/cooking/recipe/proc/set_reagent_skip(boolean) + if((last_created_step.class == CWJ_ADD_ITEM) || (last_created_step.class == CWJ_ADD_PRODUCE)) + last_created_step?:reagent_skip = boolean + return TRUE + else + return FALSE + +/datum/cooking/recipe/proc/set_exclude_reagents(list/exclude_list) + if((last_created_step.class == CWJ_ADD_ITEM) || (last_created_step.class == CWJ_ADD_PRODUCE)) + last_created_step?:exclude_reagents = exclude_list + return TRUE + else + return FALSE + +/datum/cooking/recipe/proc/set_inherited_quality_modifier(modifier) + if(last_created_step.class == CWJ_ADD_ITEM || last_created_step.class == CWJ_USE_TOOL || last_created_step.class == CWJ_ADD_PRODUCE) + last_created_step?:inherited_quality_modifier = modifier + return TRUE + else + return FALSE + +/datum/cooking/recipe/proc/set_remain_percent_modifier(modifier) + if(last_created_step.class == CWJ_ADD_REAGENT) + last_created_step?:remain_percent = modifier + return TRUE + else + return FALSE + +//----------------------------------------------------------------------------------- +//Setup for two options being exclusive to eachother. +//Performs a lot of internal checking to make sure that it doesn't break everything. +//If begin_exclusive_options is called, end_exclusive_options must eventually be called in order to close out and proceed to the next required step. + +/datum/cooking/recipe/proc/begin_exclusive_options() + if(exclusive_option_mode) + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe/proc/begin_exclusive_options: Exclusive option already active.") + log_debug("Recipe name=[name].") + #endif + return + else if(!first_step) + CRASH("/datum/cooking/recipe/proc/begin_exclusive_options: Exclusive list cannot be active before the first required step is defined. Recipe name=[src.type].") + exclusive_option_mode = TRUE + active_exclusive_option_list = list() + +/datum/cooking/recipe/proc/end_exclusive_options() + if(!exclusive_option_mode) + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe/proc/end_exclusive_options: Exclusive option already inactive.") + log_debug("Recipe name=[name].") + #endif + return + else if(active_exclusive_option_list.len == 0) + CRASH("/datum/cooking/recipe/proc/end_exclusive_options: Exclusive option list ended with no values added. Recipe name=[src.type].") + else if(option_chain_mode) + CRASH("/datum/cooking/recipe/proc/end_exclusive_options: Exclusive option cannot end while option chain is active. Recipe name=[src.type].") + + exclusive_option_mode = FALSE + + //Flatten exclusive options into the global list for easy referencing later. + //initiate the exclusive option list + for (var/datum/cooking/recipe_step/exclusive_option in active_exclusive_option_list) + if (!GLOB.cwj_optional_step_exclusion_dictionary["[exclusive_option.unique_id]"]) + GLOB.cwj_optional_step_exclusion_dictionary["[exclusive_option.unique_id]"] = list() + //populate the exclusive option list + for (var/datum/cooking/recipe_step/exclusive_option in active_exclusive_option_list) + for (var/datum/cooking/recipe_step/excluder in active_exclusive_option_list["[exclusive_option]"]) + if (exclusive_option.unique_id != excluder.unique_id) + GLOB.cwj_optional_step_exclusion_dictionary["[exclusive_option.unique_id]"] = excluder.unique_id + + active_exclusive_option_list = null + +//----------------------------------------------------------------------------------- +//Setup for a chain of optional steps to be added that order themselves sequentially. +//Optional steps with branching paths is NOT supported. +//If begin_option_chain is called, end_option_chain must eventually be called in order to close out and proceed to the next required step. +/datum/cooking/recipe/proc/begin_option_chain() + if(option_chain_mode) + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe/proc/begin_option_chain: Option Chain already active.") + log_debug("Recipe name=[name].") + #endif + return + if(!first_step) + CRASH("/datum/cooking/recipe/proc/begin_option_chain: Option Chain cannot be active before first required step is defined. Recipe name=[name].") + option_chain_mode =1 + +/datum/cooking/recipe/proc/end_option_chain() + if(!option_chain_mode) + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe/proc/end_option_chain: Option Chain already inactive.") + log_debug("Recipe name=[name].") + #endif + return + last_created_step.next_step = last_required_step + option_chain_mode = 0 + + +//----------------------------------------------------------------------------------- +//Function that dynamically adds a step into a given recipe matrix. +/datum/cooking/recipe/proc/add_step(datum/cooking/recipe_step/step, optional) + + //Required steps can't have exclusive options. + //If a given recipe needs to split into two branching required steps, it should be split into two different recipes. + if(!optional && exclusive_option_mode) + CRASH("/datum/cooking/recipe/proc/add_step: Required step added while exclusive option mode is on. Recipe name=[name].") + + if(!optional && option_chain_mode) + CRASH("/datum/cooking/recipe/proc/add_step: Required step added while option chain mode is on. Recipe name=[name].") + + if(optional) + switch(option_chain_mode) + //When the chain needs to be initialized + if(1) + last_required_step.optional_step_list += step + option_chain_mode = 2 + step.flags |= CWJ_IS_OPTION_CHAIN + //When the chain has already started. + if(2) + last_created_step.next_step = step + step.flags |= CWJ_IS_OPTION_CHAIN + else + last_required_step.optional_step_list += step + //Set the next step to loop back to the step it branched from. + step.next_step = last_required_step + else + last_required_step.next_step = step + + + //populate the previous step for optional backwards pathing. + if(option_chain_mode) + step.previous_step = last_created_step + else + step.previous_step = last_required_step + + //Update flags + if(!optional) + last_required_step.flags &= ~CWJ_IS_LAST_STEP + step.flags |= CWJ_IS_LAST_STEP + else + step.flags |= CWJ_IS_OPTIONAL + if(exclusive_option_mode) + step.flags |= CWJ_IS_EXCLUSIVE + if(option_chain_mode) + step.flags |= CWJ_IS_OPTION_CHAIN + + if(!optional) + last_required_step = step + + last_created_step = step + + //Handle exclusive options + if(exclusive_option_mode) + active_exclusive_option_list[step] = list() + for (var/datum/cooking/recipe_step/ex_step in active_exclusive_option_list) + if(ex_step == step.unique_id || step.in_option_chain(ex_step)) + continue + active_exclusive_option_list[ex_step] += step + return step + +//----------------------------------------------------------------------------------- +//default function for creating a product +/datum/cooking/recipe/proc/create_product(datum/cooking/recipe_pointer/pointer) + var/datum/cooking/recipe_tracker/parent = pointer.parent_ref.resolve() + var/obj/item/container = parent.holder_ref.resolve() + if(container) + //Build up a list of reagents that went into this. + var/datum/reagents/slurry = new /datum/reagents(1000000, container) + + //Filter out reagents based on settings + if(GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"]) + for(var/id in pointer.steps_taken) + if(!GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"][id]) + continue + var/datum/cooking/recipe_step/add_reagent/active_step = GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"][id] + var/amount_to_remove = active_step.required_reagent_amount * (1 - active_step.remain_percent) + if(!amount_to_remove) + continue + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Removing [amount_to_remove] units of id [active_step.required_reagent_id] from [container]") + #endif + container.reagents.remove_reagent(active_step.required_reagent_id, amount_to_remove, safety = 1) + + if(product_type) //Make a regular item + if(container.reagents.total_volume) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Transferring container reagents of [container.reagents.total_volume] to slurry of current volume [slurry.total_volume] max volume [slurry.maximum_volume]") + #endif + container.reagents.trans_to_holder(slurry, amount=container.reagents.total_volume) + + //Do reagent filtering on added items and produce + var/list/exclude_list = list() + for(var/obj/item/added_item in container.contents) + var/can_add = TRUE + var/list/exclude_specific_reagents = list() + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Analyzing reagents of [added_item].") + #endif + for(var/id in pointer.steps_taken) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Comparing step id [id] for [added_item].") + #endif + if(id in exclude_list) //Only consider a step for removal one time. + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: id in exclude list; skipping.") + #endif + continue + if(GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_ITEM]"] && GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_ITEM]"][id]) + var/datum/cooking/recipe_step/add_item/active_step = GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_ITEM]"][id] + exclude_specific_reagents = active_step.exclude_reagents + if(active_step.reagent_skip) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Reagent skip detected. Ignoring reagents from [added_item].") + #endif + can_add = FALSE + exclude_list += id + break + else if(GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_PRODUCE]"] && GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_PRODUCE]"][id]) + var/datum/cooking/recipe_step/add_produce/active_step = GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_PRODUCE]"][id] + exclude_specific_reagents = active_step.exclude_reagents + if(active_step.reagent_skip) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Reagent skip detected. Ignoring reagents from [added_item].") + #endif + can_add = FALSE + exclude_list += id + break + if(can_add) + if(exclude_specific_reagents.len) + for(var/id in exclude_specific_reagents) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Removing [added_item.reagents.get_reagent_amount(id)] units of id [id] from [added_item]") + #endif + added_item.reagents.remove_reagent(id, added_item.reagents.get_reagent_amount(id), safety=TRUE) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Adding [added_item.reagents.total_volume] units from [added_item] to slurry") + #endif + added_item.reagents.trans_to_holder(slurry, amount=added_item.reagents.total_volume) + + //Purge the contents of the container we no longer need it + QDEL_LIST(container.contents) + container.contents = list() + + var/reagent_quality = calculate_reagent_quality(pointer) + + + //Produce Item descriptions based on the steps taken + var/cooking_description_modifier = "" + for(var/id in pointer.steps_taken) + if(pointer.steps_taken[id] != "skip") + cooking_description_modifier += "[pointer.steps_taken[id]]\n" + + for(var/i = 0; i < product_count; i++) + var/obj/item/new_item = new product_type(container) + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Item created with reagents of [new_item.reagents.total_volume]") + #endif + if(replace_reagents) + //Clearing out reagents in data. If initialize hasn't been called, we also null that out here. + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Clearing out reagents from the [new_item]") + #endif + new_item.reagents.clear_reagents() + #ifdef CWJ_DEBUG + log_debug("/recipe/proc/create_product: Transferring slurry of [slurry.total_volume] to [new_item] of total volume [new_item.reagents.total_volume]") + #endif + slurry.trans_to_holder(new_item.reagents, amount=slurry.total_volume, copy=1) + + new_item?:food_quality = pointer.tracked_quality + reagent_quality + new_item?:cooking_description_modifier = cooking_description_modifier + new_item?:get_food_tier() + //TODO: Consider making an item's base components show up in the reagents of the product. + else + //Purge the contents of the container we no longer need it + QDEL_LIST(container.contents) + container.contents = list() + + container.reagents.clear_reagents() + + if(reagent_id) //Make a reagent + //quality handling + var/total_quality = pointer.tracked_quality + calculate_reagent_quality(pointer) + + //Create our Reagent + container.reagents.add_reagent(reagent_id, reagent_amount, data=list("FOOD_QUALITY" = total_quality)) + + qdel(slurry) + +//Extra Reagents in a recipe take away recipe quality for every extra unit added to the concoction. +//Reagents are calculated in two areas. Here and /datum/cooking/recipe_step/add_reagent/calculate_quality +/datum/cooking/recipe/proc/calculate_reagent_quality(datum/cooking/recipe_pointer/pointer) + if(!GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"]) + return 0 + var/datum/cooking/recipe_tracker/parent = pointer.parent_ref.resolve() + var/obj/item/container = parent.holder_ref.resolve() + var/total_volume = container.reagents.total_volume + + var/calculated_volume = 0 + + var/calculated_quality = 0 + for(var/id in pointer.steps_taken) + if(!GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"][id]) + continue + var/datum/cooking/recipe_step/add_reagent/active_step = GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"][id] + calculated_volume += active_step.required_reagent_amount + + calculated_quality += active_step.base_quality_award + + return calculated_quality - (total_volume - calculated_volume) + + + +//----------------------------------------------------------------------------------- +/datum/cooking/proc/get_class_string(code) + switch(code) + if(CWJ_ADD_ITEM) + return "Add Item" + if(CWJ_USE_ITEM) + return "Use Item" + if(CWJ_ADD_REAGENT) + return "Add Reagent" + if(CWJ_ADD_PRODUCE) + return "Add Produce" + if(CWJ_USE_TOOL) + return "Use Tool" + if(CWJ_USE_STOVE) + return "Use Stove" + if(CWJ_USE_GRILL) + return "Use Grill" + if(CWJ_USE_OVEN) + return "Use Oven" + if(CWJ_USE_OTHER) + return "Custom Action" + if(CWJ_START) + return "Placeholder Action" diff --git a/code/modules/cooking/cooking_catalog.dm b/code/modules/cooking/cooking_catalog.dm new file mode 100644 index 00000000000..c65af8bb448 --- /dev/null +++ b/code/modules/cooking/cooking_catalog.dm @@ -0,0 +1,217 @@ +//FIXME SHIT I GOTTA REWORK SOME COMPUTER CATALOG +/* +/datum/computer_file/program/cook_catalog + filename = "cook_catalog" + filedesc = "Cooking Assistant" + extended_desc = "Bradhaanata Presents: Papa Louie's Cooking Assistant - an AI-generated electronic catalog for cooking." + program_icon_state = "generic" + program_key_state = "generic_key" + size = 2 + available_on_ntnet = 1 + nanomodule_path = /datum/nano_module/cook_catalog + usage_flags = PROGRAM_ALL + +/datum/nano_module/cook_catalog + name = "Bradhaanata Presents: Papa Louie's Cooking Assistant" + +/datum/nano_module/cook_catalog/nano_ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = NANOUI_FOCUS, state = GLOB.default_state) + var/list/data = nano_ui_data(user) + + var/datum/asset/cooking_icons = get_asset_datum(/datum/asset/simple/cooking_icons) + if (cooking_icons.send(user.client)) + user.client.browse_queue_flush() // stall loading nanoui until assets actualy gets sent + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "cooking_catalog.tmpl", name, 640, 700, state = state) + ui.set_initial_data(data) + refresh_catalog_browsing(user, ui) + ui.auto_update_layout = 1 + ui.open() + +/datum/nano_module/cook_catalog/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["greet"]) + browse_catalog(GLOB.catalogs[CATALOG_COOKING], usr) + return 0 +//=================================================================================== +/proc/createCookingCatalogs() + for(var/datum/cooking/recipe/our_recipe in GLOB.cwj_recipe_list) + if(our_recipe.appear_in_default_catalog) + create_cooking_catalog_entry(our_recipe) + + //Do a sort + var/datum/catalog/C = GLOB.catalogs[CATALOG_COOKING] + C.associated_template = "catalog_list_cooking.tmpl" + C.entry_list = sortTim(C.entry_list, /proc/cmp_catalog_entry_cook) + +//Because I want it to be EXTREMELY ORGANIZED. +/proc/cmp_catalog_entry_cook(datum/catalog_entry/cooking/a, datum/catalog_entry/cooking/b) + //name - name + if(a.title != b.title) + return cmp_catalog_entry_asc(a, b) + + //if product name is same, sort by product count + else if(a.recipe.product_name && b.recipe.product_name && a.recipe.product_name == b.recipe.product_name && a.recipe.product_count != b.recipe.product_count) + return cmp_numeric_asc(b.recipe.product_count, a.recipe.product_count) + + //product name - product name + else if(a.recipe.product_name && b.recipe.product_name && a.recipe.product_name != b.recipe.product_name) + return sorttext(b.recipe.product_name, a.recipe.product_name) + + //if reagent name is same, sort by reagent_amount + else if(a.recipe.reagent_name && b.recipe.reagent_name && a.recipe.reagent_name == b.recipe.reagent_name && a.recipe.reagent_amount != b.recipe.reagent_amount) + return cmp_numeric_asc(b.recipe.reagent_amount, a.recipe.reagent_amount) + + //reagent name - reagent name + else if(a.recipe.reagent_name && b.recipe.reagent_name && a.recipe.reagent_name != b.recipe.reagent_name) + return sorttext(b.recipe.reagent_name, a.recipe.reagent_name) + + //product name - reagent name + else if(a.recipe.product_name && b.recipe.reagent_name && a.recipe.product_name != b.recipe.reagent_name) + return sorttext(b.recipe.reagent_name, a.recipe.product_name) + + //reagent name - product name + else if(a.recipe.reagent_name && b.recipe.product_name && a.recipe.reagent_name != b.recipe.product_name) + return sorttext(b.recipe.product_name, a.recipe.reagent_name) + + return cmp_catalog_entry_asc(a, b) + +/proc/create_cooking_catalog_entry(var/datum/cooking/recipe/our_recipe) + var/catalog_id = CATALOG_COOKING + if(!GLOB.catalogs[catalog_id]) + GLOB.catalogs[catalog_id] = new /datum/catalog(catalog_id) + + if(!GLOB.all_catalog_entries_by_type[our_recipe.type]) + GLOB.all_catalog_entries_by_type[our_recipe.type] = new /datum/catalog_entry/cooking(our_recipe) + else + CRASH("/proc/create_cooking_catalog_entry() - Duplicate type passed- [our_recipe.type]") + + var/datum/catalog/C = GLOB.catalogs[catalog_id] + C.add_entry(GLOB.all_catalog_entries_by_type[our_recipe.type]) + +/datum/catalog_entry/cooking + associated_template = "catalog_entry_cooking.tmpl" + var/datum/cooking/recipe/recipe + +/datum/catalog_entry/cooking/New(var/datum/cooking/recipe/our_recipe) + thing_type = our_recipe.type + title = our_recipe.name + recipe = our_recipe + +/datum/catalog_entry/cooking/catalog_ui_data(mob/user, ui_key = "main") + var/list/data = ..() + data["name"] = recipe.name + data["id"] = recipe.type + data["icon"] = SSassets.transport.get_asset_url(sanitizeFileName(recipe.icon_image_file)) + data["product_is_reagent"] = 0 + if(recipe.product_name) + data["product_name"] = recipe.product_name + data["product_count"] = recipe.product_count + if(recipe.reagent_name) + data["byproduct_name"] = recipe.reagent_name + data["byproduct_count"] = recipe.reagent_amount + else + data["byproduct_name"] = "None" + data["byproduct_count"] = 0 + else if(recipe.reagent_name) + data["product_name"] = recipe.reagent_name + data["product_count"] = recipe.reagent_amount + data["byproduct_name"] = "None" + data["byproduct_count"] = 0 + data["product_is_reagent"] = 1 + else + data["product_name"] = "ERROR" + data["product_count"] = 0 + data["byproduct_name"] = "None" + data["byproduct_count"] = 0 + return data + + +/datum/catalog_entry/cooking/nano_ui_data(mob/user, ui_key = "main") + var/list/data = ..() + data["name"] = recipe.name + data["id"] = recipe.type + + var/url = SSassets.transport.get_asset_url(sanitizeFileName(recipe.icon_image_file)) + #ifdef CWJ_DEBUG + log_debug("Retrieved [url] for [recipe.icon_image_file]") + #endif + + data["icon"] = url + data["product_is_reagent"] = 0 + if(recipe.product_name) + data["product_name"] = recipe.product_name + data["product_count"] = recipe.product_count + if(recipe.reagent_name) + data["byproduct_name"] = recipe.reagent_name + data["byproduct_count"] = recipe.reagent_amount + else + data["byproduct_name"] = "None" + data["byproduct_count"] = 0 + else if(recipe.reagent_name) + data["product_name"] = recipe.reagent_name + data["product_count"] = recipe.reagent_amount + data["byproduct_name"] = "None" + data["byproduct_count"] = 0 + data["product_is_reagent"] = 1 + else + data["product_name"] = "ERROR" + data["product_count"] = 0 + data["byproduct_name"] = "None" + data["byproduct_count"] = 0 + + data["description"] = recipe.description + data["recipe_guide"] = recipe.recipe_guide + + switch(recipe.cooking_container) + if(PLATE) + data["create_in"] = "Made with a debug-only serving plate." + if(CUTTING_BOARD) + data["create_in"] = "Made on a cutting board." + if(PAN) + data["create_in"] = "Made with a pan or skillet." + if(POT) + data["create_in"] = "Made in a cooking pot." + if(BOWL) + data["create_in"] = "Made in a prep bowl." + if(DF_BASKET) + data["create_in"] = "Made in a deep frying basket." + if(DF_BASKET) + data["create_in"] = "Made in an air frying basket." + if(OVEN) + data["create_in"] = "Made with an oven dish." + if(GRILL) + data["create_in"] = "Made on a grill grate." + else + data["create_in"] = "Made with a ~//SEGMENTATION FAULT//~ 00110001" + + return data + +//=========================================================== +/datum/asset/simple/cooking_icons + keep_local_name = FALSE + +/datum/asset/simple/cooking_icons/register() + for(var/datum/cooking/recipe/our_recipe in GLOB.cwj_recipe_list) + var/icon/I = null + var/filename = null + if(our_recipe.product_type) + filename = sanitizeFileName("[our_recipe.product_type].png") + I = getFlatTypeIcon(our_recipe.product_type) + else if(our_recipe.reagent_id) + var/obj/item/reagent_containers/food/dollop/test_dollop = new(null, our_recipe.reagent_id, 1) + + filename = sanitizeFileName("[test_dollop.type][test_dollop.color].png") + I = getFlatIcon(test_dollop) + //I.Blend(test_dollop.color) --might not be needed + if(I) + assets[filename] = I + our_recipe.icon_image_file = filename + #ifdef CWJ_DEBUG + log_debug("Created cooking icon under file name [filename]") + #endif + ..() +*/ diff --git a/code/modules/cooking/cooking_init.dm b/code/modules/cooking/cooking_init.dm new file mode 100644 index 00000000000..70fda9dbc1f --- /dev/null +++ b/code/modules/cooking/cooking_init.dm @@ -0,0 +1,11 @@ +/proc/initialize_cooking_recipes() + //All combination path datums, save for the default recipes we don't want. + var/list/recipe_paths = typesof(/datum/cooking/recipe) + recipe_paths -= /datum/cooking/recipe + for (var/path in recipe_paths) + var/datum/cooking/recipe/example_recipe = new path() + if(!GLOB.cwj_recipe_dictionary[example_recipe.cooking_container]) + GLOB.cwj_recipe_dictionary[example_recipe.cooking_container] = list() + GLOB.cwj_recipe_dictionary[example_recipe.cooking_container]["[example_recipe.unique_id]"] = example_recipe + + GLOB.cwj_recipe_list += example_recipe diff --git a/code/modules/cooking/cooking_items/cooking_containers.dm b/code/modules/cooking/cooking_items/cooking_containers.dm new file mode 100644 index 00000000000..c66c2f9ea5f --- /dev/null +++ b/code/modules/cooking/cooking_items/cooking_containers.dm @@ -0,0 +1,366 @@ +//Cooking containers are used in ovens, fryers and so on, to hold multiple ingredients for a recipe. +//They interact with the cooking process, and link up with the cooking code dynamically. + +//Originally sourced from the Aurora, heavily retooled to actually work with CWJ + + +//Holder for a portion of an incomplete meal, +//allows a cook to temporarily offload recipes to work on things factory-style, eliminating the need for 20 plates to get things done fast. + +/obj/item/reagent_containers/vessel/cooking_container + icon = 'icons/obj/cooking/kitchen.dmi' + description_info = "Can be emptied of physical food with alt-click." + var/shortname + var/place_verb = "into" + var/appliancetype //string beans + w_class = ITEM_SIZE_SMALL + volume = 240 //Don't make recipes using reagents in larger quantities than this amount; they won't work. + var/datum/cooking/recipe_tracker/tracker = null //To be populated the first time the plate is interacted with. + var/lip //Icon state of the lip layer of the object + var/removal_penalty = 0 //A flat quality reduction for removing an unfinished recipe from the container. + + possible_transfer_amounts = list(5,10,30,60,90,120,240) + amount_per_transfer_from_this = 10 + + atom_flags = ATOM_FLAG_NO_REACT + lid_type=null + + var/list/stove_data = list("High"=0 , "Medium" = 0, "Low"=0) //Record of what stove-cooking has been done on this food. + var/list/grill_data = list("High"=0 , "Medium" = 0, "Low"=0) //Record of what grill-cooking has been done on this food. + var/list/oven_data = list("High"=0 , "Medium" = 0, "Low"=0) //Record of what oven-cooking has been done on this food. + +/obj/item/reagent_containers/vessel/cooking_container/Initialize() + .=..() + appearance_flags |= KEEP_TOGETHER + + +/obj/item/reagent_containers/vessel/cooking_container/examine(mob/user) + if(!..(user, 1)) + return FALSE + if(contents) + to_chat(user, get_content_info()) + if(reagents.total_volume) + to_chat(user, get_reagent_info()) + +/obj/item/reagent_containers/vessel/cooking_container/proc/get_content_info() + var/string = "It contains:
" + return string + +/obj/item/reagent_containers/vessel/cooking_container/proc/get_reagent_info() + return "It contains [reagents.total_volume] units of reagents." + +/obj/item/reagent_containers/vessel/cooking_container/attackby(obj/item/used_item, mob/user) + + #ifdef CWJ_DEBUG + log_debug("cooking_container/attackby() called!") + #endif + + if(istype(used_item, /obj/item/shovel)) + do_empty(user, target=null, reagent_clear = FALSE) + return + + if(!tracker && (contents.len || reagents.total_volume != 0)) + to_chat(user, "The [src] is full. Empty its contents first.") + else + process_item(used_item, user) + + return TRUE + +/obj/item/reagent_containers/vessel/cooking_container/standard_pour_into(mob/user, atom/target) + + + #ifdef CWJ_DEBUG + log_debug("cooking_container/standard_pour_into() called!") + #endif + + if(tracker) + if(alert(user, "There is an ongoing recipe in the [src]. Dump it out?",,"Yes","No") == "No") + return FALSE + for(var/datum/reagent/our_reagent in reagents.reagent_list) + if(our_reagent.data && istype(our_reagent.data, /list) && our_reagent.data["FOOD_QUALITY"]) + our_reagent.data["FOOD_QUALITY"] = 0 + + do_empty(user, target, reagent_clear = FALSE) + + #ifdef CWJ_DEBUG + log_debug("cooking_container/do_empty() completed!") + #endif + + . = ..(user, target) + + +/obj/item/reagent_containers/vessel/cooking_container/afterattack(obj/target, mob/user, flag) + if(!istype(target, /obj/item/reagent_containers)) + return + if(!flag) + return + if(tracker) + return + if(standard_pour_into(user, target)) + return 1 + +/obj/item/reagent_containers/vessel/cooking_container/proc/process_item(obj/I, mob/user, lower_quality_on_fail = 0, send_message = TRUE) + + + #ifdef CWJ_DEBUG + log_debug("cooking_container/process_item() called!") + #endif + + //OK, time to load the tracker + if(!tracker) + if(lower_quality_on_fail) + for (var/obj/item/contained in contents) + contained?:food_quality -= lower_quality_on_fail + else + tracker = new /datum/cooking/recipe_tracker(src) + + var/return_value = 0 + switch(tracker.process_item_wrap(I, user)) + if(CWJ_NO_STEPS) + if(send_message) + to_chat(user, "It doesn't seem like you can create a meal from that. Yet.") + if(lower_quality_on_fail) + for (var/datum/cooking/recipe_pointer/pointer in tracker.active_recipe_pointers) + pointer?:tracked_quality -= lower_quality_on_fail + if(CWJ_CHOICE_CANCEL) + if(send_message) + to_chat(user, "You decide against cooking with the [src].") + if(CWJ_COMPLETE) + if(send_message) + to_chat(user, "You finish cooking with the [src].") + qdel(tracker) + tracker = null + clear_cooking_data() + update_icon() + return_value = 1 + if(CWJ_SUCCESS) + if(send_message) + to_chat(user, "You have successfully completed a recipe step.") + clear_cooking_data() + return_value = 1 + update_icon() + if(CWJ_PARTIAL_SUCCESS) + if(send_message) + to_chat(user, "More must be done to complete this step of the recipe.") + if(CWJ_LOCKOUT) + if(send_message) + to_chat(user, "You can't make the same decision twice!") + + if(tracker && !tracker.recipe_started) + qdel(tracker) + tracker = null + return return_value + +//TODO: Handle the contents of the container being ruined via burning. +/obj/item/reagent_containers/vessel/cooking_container/proc/handle_burning() + return + +//TODO: Handle the contents of the container lighting on actual fire. +/obj/item/reagent_containers/vessel/cooking_container/proc/handle_ignition() + return FALSE + +/obj/item/reagent_containers/vessel/cooking_container/verb/empty() + set src in view(1) + set name = "Empty Container" + set category = "Object" + set desc = "Removes items from the container, excluding reagents." + do_empty(usr) + +/obj/item/reagent_containers/vessel/cooking_container/proc/do_empty(mob/user, atom/target = null, reagent_clear = TRUE) + #ifdef CWJ_DEBUG + log_debug("cooking_container/do_empty() called!") + #endif + + if(contents.len != 0) + if(tracker && removal_penalty) + for (var/obj/item/contained in contents) + contained?:food_quality -= removal_penalty + to_chat(user, SPAN_WARNING("The quality of ingredients in the [src] was reduced by the extra jostling.")) + + //Handle quality reduction for reagents + if(reagents.total_volume != 0) + var/reagent_qual_reduction = round(reagents.total_volume/contents.len) + if(reagent_qual_reduction != 0) + for (var/obj/item/contained in contents) + contained?:food_quality -= reagent_qual_reduction + to_chat(user, SPAN_WARNING("The quality of ingredients in the [src] was reduced by the presence of reagents in the container.")) + + + for (var/contained in contents) + var/atom/movable/AM = contained + remove_from_visible(AM) + if(!target) + AM.forceMove(get_turf(src)) + else + AM.forceMove(get_turf(target)) + + //TODO: Splash the reagents somewhere + if(reagent_clear) + reagents.clear_reagents() + + update_icon() + qdel(tracker) + tracker = null + clear_cooking_data() + + if(contents.len != 0) + to_chat(user, SPAN_NOTICE("You remove all the solid items from [src].")) + + +/obj/item/reagent_containers/vessel/cooking_container/AltClick(mob/user) + do_empty(user) + +//Deletes contents of container. +//Used when food is burned, before replacing it with a burned mess +/obj/item/reagent_containers/vessel/cooking_container/proc/clear() + QDEL_LIST(contents) + contents=list() + reagents.clear_reagents() + if(tracker) + qdel(tracker) + tracker = null + clear_cooking_data() + + +/obj/item/reagent_containers/vessel/cooking_container/proc/clear_cooking_data() + stove_data = list("High"=0 , "Medium" = 0, "Low"=0) + grill_data = list("High"=0 , "Medium" = 0, "Low"=0) + +/obj/item/reagent_containers/vessel/cooking_container/proc/label(number, CT = null) + //This returns something like "Fryer basket 1 - empty" + //The latter part is a brief reminder of contents + //This is used in the removal menu + . = shortname + if (!isnull(number)) + .+= " [number]" + .+= " - " + if (LAZYLEN(contents)) + var/obj/O = locate() in contents + return . + O.name //Just append the name of the first object + return . + "empty" + +/obj/item/reagent_containers/vessel/cooking_container/update_icon() + overlays.Cut() + for(var/obj/item/our_item in vis_contents) + src.remove_from_visible(our_item) + + for(var/i=contents.len, i>=1, i--) + var/obj/item/our_item = contents[i] + src.add_to_visible(our_item) + if(lip) + AddOverlays(image(src.icon, icon_state=lip, layer=ABOVE_OBJ_LAYER)) + +/obj/item/reagent_containers/vessel/cooking_container/proc/add_to_visible(obj/item/our_item) + our_item.pixel_x = initial(our_item.pixel_x) + our_item.pixel_y = initial(our_item.pixel_y) + our_item.vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_ID + our_item.blend_mode = BLEND_INSET_OVERLAY + our_item.transform *= 0.6 + src.vis_contents += our_item + +/obj/item/reagent_containers/vessel/cooking_container/proc/remove_from_visible(obj/item/our_item) + our_item.vis_flags = 0 + our_item.blend_mode = 0 + our_item.transform = null + src.vis_contents.Remove(our_item) + +/obj/item/reagent_containers/vessel/cooking_container/plate + icon = 'icons/obj/cooking/kitchen2.dmi' + name = "serving plate" + shortname = "plate" + desc = "A shitty serving plate. You probably shouldn't be seeing this." + icon_state = "plate" + matter = list(MATERIAL_STEEL = 5) + appliancetype = PLATE + +/obj/item/reagent_containers/vessel/cooking_container/board + name = "cutting board" + shortname = "cutting_board" + desc = "Good for making sandwiches on, too." + icon_state = "cutting_board" + item_state = "cutting_board" + matter = list(MATERIAL_WOOD = 5) + appliancetype = CUTTING_BOARD + +/obj/item/reagent_containers/vessel/cooking_container/oven + name = "oven dish" + shortname = "shelf" + desc = "Put ingredients in this; designed for use with an oven. Warranty void if used." + icon_state = "oven_dish" + lip = "oven_dish_lip" + item_state = "oven_dish" + matter = list(MATERIAL_STEEL = 10) + appliancetype = OVEN + +/obj/item/reagent_containers/vessel/cooking_container/pan + name = "pan" + desc = "An normal pan." + + icon_state = "pan" //Default state is the base icon so it looks nice in the map builder + lip = "pan_lip" + item_state = "pan" + matter = list(MATERIAL_PLASTEEL = 5) + hitsound = 'sound/effects/fighting/smash.ogg' + appliancetype = PAN + +/obj/item/reagent_containers/vessel/cooking_container/pot + name = "cooking pot" + shortname = "pot" + desc = "Boil things with this. Maybe even stick 'em in a stew." + + icon_state = "pot" + lip = "pot_lip" + item_state = "pot" + matter = list(MATERIAL_STEEL = 5) + + hitsound = 'sound/effects/fighting/smash.ogg' + removal_penalty = 5 + appliancetype = POT + w_class = ITEM_SIZE_HUGE + +/obj/item/reagent_containers/vessel/cooking_container/deep_basket + name = "deep fryer basket" + shortname = "basket" + desc = "Cwispy! Warranty void if used." + + icon_state = "deepfryer_basket" + lip = "deepfryer_basket_lip" + item_state = "deepfryer_basket" + removal_penalty = 5 + appliancetype = DF_BASKET + +/obj/item/reagent_containers/vessel/cooking_container/air_basket + name = "air fryer basket" + shortname = "basket" + desc = "Permanently laminated with dried oil and late-stage capitalism." + + icon_state = "airfryer_basket" + lip = "airfryer_basket_lip" + item_state = "airfryer_basket" + removal_penalty = 5 + appliancetype = AF_BASKET + +/obj/item/reagent_containers/vessel/cooking_container/grill_grate + name = "grill grate" + shortname = "grate" + place_verb = "onto" + desc = "Primarily used to grill meat, place this on a grill and enjoy an ancient human tradition." + + icon_state = "grill_grate" + matter = list(MATERIAL_STEEL = 5) + + appliancetype = GRILL + +/obj/item/reagent_containers/vessel/cooking_container/bowl + name = "prep bowl" + shortname = "bowl" + desc = "A bowl for mixing, or tossing a salad. Not to be eaten out of" + + icon_state = "bowl" + lip = "bowl_lip" + item_state = "pot" + matter = list(MATERIAL_PLASTIC = 5) + + removal_penalty = 2 + appliancetype = BOWL diff --git a/code/modules/cooking/cooking_items/dollop.dm b/code/modules/cooking/cooking_items/dollop.dm new file mode 100644 index 00000000000..96cb32457cc --- /dev/null +++ b/code/modules/cooking/cooking_items/dollop.dm @@ -0,0 +1,25 @@ +/obj/item/reagent_containers/food/dollop + name = "dollop of frosting" + desc = "A fresh serving of just frosting and nothing but frosting." + icon = 'icons/obj/cooking/kitchen.dmi' + icon_state = "dollop" + bitesize = 4 + var/datum/reagent/reagent = /datum/reagent/organic/sugar/frosting + startswith = list(/datum/reagent/organic/sugar/frosting = 30) + +/obj/item/reagent_containers/food/dollop/New(loc, new_reagent = /datum/reagent/organic/sugar/frosting, new_amount = 30) + . = ..() + if(new_reagent) + reagent = new_reagent + var/reagent_name = reagent.name + if(reagent_name) + name = "dollop of [reagent_name]" + desc = "A fresh serving of just [reagent_name] and nothing but [reagent_name]." + startswith = list(reagent = new_amount) + +/obj/item/reagent_containers/food/dollop/Initialize() + . = ..() + update_icon() + +/obj/item/reagent_containers/food/dollop/update_icon() + color=reagents.get_color() diff --git a/code/modules/cooking/cooking_items/frosting.dm b/code/modules/cooking/cooking_items/frosting.dm new file mode 100644 index 00000000000..107345d8e4f --- /dev/null +++ b/code/modules/cooking/cooking_items/frosting.dm @@ -0,0 +1,87 @@ +/datum/reagent/organic/sugar/frosting + name = "frosting" + id = "frosting" + description = "Generic, store-bought frosting of indeterminable construction." + taste_description = "sugary paste" + color = "#eeebc3" + + +/datum/reagent/organic/sugar/frosting/glaze + name = "glaze" + id = "glaze" + description = "A mixture of water, chocolate and delicious sugar." + taste_description = "sugary paste" + color = "#eeede7" + + +/datum/reagent/organic/sugar/frosting/c_glaze + name = "chocolate glaze" + id = "c_glaze" + description = "A mixture of water, chocolate and delicious sugar." + taste_description = "sugary paste" + color = "#e68328" + + +/datum/reagent/organic/sugar/frosting/whip + name = "whipped cream" + id = "whip" + description = "A mixture of cream and sugar. Delecious but ephemeral." + taste_description = "sugary paste" + color = "#eeebc3" + + +/datum/reagent/organic/sugar/frosting/whip_choc + name = "chocolate whipped cream" + id = "whip_choc" + description = "A cream and sugar with a chocolate flavoring." + taste_description = "sugary chocolate" + color = "#b86417" + +/datum/reagent/organic/sugar/frosting/whip_pink + name = "pink whipped cream" + id = "whip_pink" + description = "A mixture of cream and sugar. Delecious but ephemeral." + taste_description = "sugary chocolate" + color = "#f1adbc" + +/datum/reagent/organic/sugar/frosting/stable_whip + name = "stabilized whipped cream" + id = "stable_whip" + description = "A mixture of cream and sugar. mixed with gelatin to keep it from deflating." + taste_description = "sugary paste" + color = "#eeebc3" + +/datum/reagent/organic/sugar/frosting/stable_whip_choc + name = "stabilized chocolate whipped cream" + id = "stable_whip_choc" + description = "A mixture of cream and sugar. mixed with gelatin to keep it from deflating." + taste_description = "sugary chocolate" + color = "#b86417" + +/datum/reagent/organic/sugar/frosting/stable_whip_pink + name = "stabilized pink whipped cream" + id = "stable_whip_pink" + description = "A mixture of cream and sugar. mixed with gelatin to keep it from deflating." + taste_description = "sugary fruit" + color = "#f1adbc" + +/datum/reagent/organic/sugar/frosting/buttercream + name = "buttercream frosting" + id = "buttercream" + description = "Representing the pinnacle of confection perfection- a sugary treat that tickles going down your throat." + taste_description = "sugary chocolate" + color = "#ebe48d" + +/datum/reagent/organic/sugar/frosting/buttercream_choc + name = "chocolate buttercream frosting" + id = "buttercream_choc" + description = "Representing the pinnacle of confection perfection- a sugary treat that tickles going down your throat. Now flavored with rich chocolate!" + taste_description = "sugary chocolate" + color = "#814711" + +/datum/reagent/organic/sugar/frosting/buttercream_pink + name = "pink buttercream frosting" + id = "buttercream_choc" + description = "Representing the pinnacle of confection perfection- a sugary treat that tickles going down your throat. Now colored a pleasant pink!" + taste_description = "sugary chocolate" + color = "#e2647f" \ No newline at end of file diff --git a/code/modules/cooking/cooking_items/spatula.dm b/code/modules/cooking/cooking_items/spatula.dm new file mode 100644 index 00000000000..34fa748a567 --- /dev/null +++ b/code/modules/cooking/cooking_items/spatula.dm @@ -0,0 +1,10 @@ +/obj/item/shovel/spatula + name = "spatula" + desc = "A Hydrodynamic Spatula. Port and Starboard attachments not included." + icon = 'icons/obj/cooking/kitchen.dmi' + icon_state = "spatula" + item_state = "spatula" + force = 7 + w_class = ITEM_SIZE_SMALL + attack_verb = list("smacked", "slapped", "spanked", "whapped", "whacked") + hitsound = 'sound/effects/fighting/punch3.ogg' diff --git a/code/modules/cooking/cooking_tracker.dm b/code/modules/cooking/cooking_tracker.dm new file mode 100644 index 00000000000..127757e100a --- /dev/null +++ b/code/modules/cooking/cooking_tracker.dm @@ -0,0 +1,455 @@ +//Datum held by objects that is the core component in a recipe. +//You use other items on an items with this datum to advance its recipe. +//Kept intentionally bare-bones because MANY of these objects are going to be made. +/datum/cooking/recipe_tracker + var/weakref/holder_ref //The parent object holding the recipe tracker. + var/step_flags //A collection of the classes of steps the recipe can take next. + //This variable is a little complicated. + //It specifically references recipe_pointer objects each pointing to a different point in a different recipe. + var/list/active_recipe_pointers = list() + var/completion_lockout = FALSE //Freakin' cheaters... + var/list/completed_list = list()//List of recipes marked as complete. + var/recipe_started = FALSE //Tells if steps have been taken for this recipe + +/datum/cooking/recipe_tracker/New(obj/item/reagent_containers/vessel/cooking_container/container) + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_tracker/New") + #endif + holder_ref = weakref(container) + src.generate_pointers() + src.populate_step_flags() + +//Call when a method is done incorrectly that provides a flat debuff to the whole meal. +/datum/cooking/recipe_tracker/proc/apply_flat_penalty(penalty) + if(active_recipe_pointers.len == 0) + return + + for (var/datum/cooking/recipe_pointer/pointer in active_recipe_pointers) + pointer.tracked_quality -= penalty + +//Generate recipe_pointer objects based on the global list +/datum/cooking/recipe_tracker/proc/generate_pointers() + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_tracker/proc/generate_pointers") + #endif + var/obj/item/reagent_containers/vessel/cooking_container/container = holder_ref.resolve() + + #ifdef CWJ_DEBUG + log_debug("Loading all references to [container] of type [container.type] using [container.appliancetype]") + #endif + //iterate through dictionary matching on holder type + if(GLOB.cwj_recipe_dictionary[container.appliancetype]) + for (var/key in GLOB.cwj_recipe_dictionary[container.appliancetype]) + #ifdef CWJ_DEBUG + log_debug("Loading [container.appliancetype] , [key] into pointer.") + #endif + active_recipe_pointers += new /datum/cooking/recipe_pointer(container.appliancetype, key, src) + +//Generate next steps +/datum/cooking/recipe_tracker/proc/get_step_options() + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_tracker/proc/get_step_options") + #endif + var/list/options = list() + for (var/datum/cooking/recipe_pointer/pointer in active_recipe_pointers) + options += pointer.get_possible_steps() + + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe_tracker/proc/get_step_options returned [options.len] options") + #endif + return options + + +/datum/cooking/recipe_tracker/proc/populate_step_flags() + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_tracker/proc/populate_step_flags") + #endif + step_flags = 0 + for (var/datum/cooking/recipe_pointer/pointer in active_recipe_pointers) + var/flag_group = pointer.get_step_flags() + #ifdef CWJ_DEBUG + log_debug("Flag group returned with [flag_group]") + #endif + step_flags |= flag_group + +//Check if a recipe tracker has recipes loaded. +/datum/cooking/recipe_tracker/proc/has_recipes() + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_tracker/proc/has_recipes") + #endif + return active_recipe_pointers.len + +//Wrapper function for analyzing process_item internally. +/datum/cooking/recipe_tracker/proc/process_item_wrap(obj/used_object, mob/user) + + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe_tracker/proc/process_item_wrap called!") + #endif + + var/response = process_item(used_object, user) + + if(response == CWJ_SUCCESS || response == CWJ_COMPLETE || response == CWJ_PARTIAL_SUCCESS) + if(!recipe_started) + recipe_started = TRUE + return response + +//Core function that checks if a object meets all the requirements for certain recipe actions. +/datum/cooking/recipe_tracker/proc/process_item(obj/used_object, mob/user) + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_tracker/proc/process_item") + #endif + if(completion_lockout) + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe_tracker/proc/process_item held in lockout!") + #endif + return CWJ_LOCKOUT + var/list/valid_steps = list() + var/list/valid_unique_id_list = list() + var/use_class + + //Decide what action is being taken with the item, if any. + for (var/datum/cooking/recipe_pointer/pointer in active_recipe_pointers) + var/option_list = list() + option_list += pointer.get_possible_steps() + for (var/datum/cooking/recipe_step/step in option_list) + var/class_string = get_class_string(step.class) + var/is_valid = step.check_conditions_met(used_object, src) + #ifdef CWJ_DEBUG + log_debug("recipe_tracker/proc/process_item: Check conditions met returned [is_valid]") + #endif + if(is_valid == CWJ_CHECK_VALID) + if(!valid_steps["[class_string]"]) + valid_steps["[class_string]"] = list() + valid_steps["[class_string]"]+= step + + if(!valid_unique_id_list["[class_string]"]) + valid_unique_id_list["[class_string]"] = list() + valid_unique_id_list["[class_string]"] += step.unique_id + + if(!use_class) + use_class = class_string + if(valid_steps.len == 0) + #ifdef CWJ_DEBUG + log_debug("/recipe_tracker/proc/process_item returned no steps!") + #endif + return CWJ_NO_STEPS + + if(valid_steps.len > 1) + completion_lockout = TRUE + if(user) + var/list/choice = input(user, "There's two things you can do with this item!", "Choose One:") in valid_steps + completion_lockout = FALSE + if(!choice) + #ifdef CWJ_DEBUG + log_debug("/recipe_tracker/proc/process_item returned choice cancel!") + #endif + return CWJ_CHOICE_CANCEL + use_class = choice + else + use_class = 1 + #ifdef CWJ_DEBUG + log_debug("Use class determined: [use_class]") + #endif + + valid_steps = valid_steps[use_class] + valid_unique_id_list = valid_unique_id_list[use_class] + + var/has_traversed = FALSE + //traverse and cull pointers + for (var/datum/cooking/recipe_pointer/pointer in active_recipe_pointers) + var/used_id = FALSE + var/list/option_list = pointer.get_possible_steps() + for (var/datum/cooking/recipe_step/step in option_list) + if(!(step.unique_id in valid_unique_id_list)) + continue + else + used_id = TRUE + if(step.is_complete(used_object, src)) + has_traversed = TRUE + pointer.traverse(step.unique_id, used_object) + break + if (!used_id) + active_recipe_pointers.Remove(pointer) + qdel(pointer) + + + //attempt_complete_recursive(used_object, use_class) No, never again... + + //Choose to keep baking or finish now. + if(completed_list.len && (completed_list.len != active_recipe_pointers.len)) + + var/recipe_string = null + for(var/datum/cooking/recipe_pointer/pointer in completed_list) + if(!recipe_string) + recipe_string = "\a [pointer.current_recipe.name]" + else + recipe_string += ", or \a [pointer.current_recipe.name]" + if(user) + if(alert(user, "If you finish cooking now, you will create [recipe_string]. However, you feel there are possibilities beyond even this. Continue cooking anyways?",,"Yes","No") == "Yes") + //Cull finished recipe items + for (var/datum/cooking/recipe_pointer/pointer in completed_list) + active_recipe_pointers.Remove(pointer) + qdel(pointer) + completed_list = list() + + //Check if we completed our recipe + var/datum/cooking/recipe_pointer/chosen_pointer = null + if(completed_list.len >= 1) + #ifdef CWJ_DEBUG + log_debug("/recipe_tracker/proc/process_item YO WE ACTUALLY HAVE A COMPLETED A RECIPE!") + #endif + chosen_pointer = completed_list[1] + if(user) + if(completed_list.len > 1) + completion_lockout = TRUE + var/choice = input(user, "There's two things you complete at this juncture!", "Choose One:") in completed_list + completion_lockout = FALSE + if(choice) + chosen_pointer = completed_list[choice] + + //Call a proc that follows one of the steps in question, so we have all the nice to_chat calls. + var/datum/cooking/recipe_step/sample_step = valid_steps[1] + #ifdef CWJ_DEBUG + log_debug("/recipe_tracker/proc/process_item: Calling follow_step") + #endif + sample_step.follow_step(used_object, src) + + if(chosen_pointer) + chosen_pointer.current_recipe.create_product(chosen_pointer) + return CWJ_COMPLETE + populate_step_flags() + + if(has_traversed) + #ifdef CWJ_DEBUG + log_debug("/recipe_tracker/proc/process_item returned success!") + #endif + return CWJ_SUCCESS + + #ifdef CWJ_DEBUG + log_debug("/recipe_tracker/proc/process_item returned partial success!") + #endif + return CWJ_PARTIAL_SUCCESS + +//Sleep... My precious, monsterous child.... +/* +/datum/cooking/recipe_tracker/proc/attempt_complete_recursive( + var/obj/used_object, + var/use_class, + var/depth = 1, + var/list/considered_steps = null) + var/list/ourlist = null + if(depth == 1) + ourlist = active_recipe_pointers.Copy() + else + ourlist = considered_steps.Copy() + log_debug("/recipe_tracker/proc/attempt_complete_recursive entered second recursion!") + + for (var/datum/cooking/recipe_pointer/pointer in ourlist) + var/option_list = list() + option_list += pointer.get_possible_steps() + var/has_valid_step = FALSE + var/had_traversal = FALSE + for (var/datum/cooking/recipe_step/step in option_list) + if(step.class != use_class) + continue + + if(depth !=1 && !step.auto_complete_enabled) + continue + + if(step.check_conditions_met(used_object, src) == CWJ_CHECK_VALID) + has_valid_step = TRUE + else + continue + + if(step.is_complete(src)) + pointer.traverse(step.unique_id, used_object) + had_traversal = TRUE + break ///The first valid step is the only one we traverse, in the instance of multiple valid cases. + + if(depth == 1 && !has_valid_step) + active_recipe_pointers.Remove(pointer) + ourlist.Remove(pointer) + else if(!had_traversal) + ourlist.Remove(pointer) + + if(ourlist.len != 0 && depth !=5) + attempt_complete_recursive(used_object, use_class, depth=++depth, considered_steps = ourlist) +*/ +//=================================================================================== + + +//Points to a specific step in a recipe while considering the optional paths that recipe can take. +/datum/cooking/recipe_pointer + var/datum/cooking/recipe/current_recipe //The recipe being followed here. + var/datum/cooking/recipe_step/current_step //The current step in the recipe we are following. + + var/weakref/parent_ref + + var/tracked_quality = 0 //The current level of quality within that recipe. + + var/list/steps_taken = list() //built over the course of following a recipe, tracks what has been done to the object. Format is unique_id:result + +/datum/cooking/recipe_pointer/New(start_type, recipe_id, datum/cooking/recipe_tracker/parent) + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_pointer/pointer/New([start_type], [recipe_id], parent)") + #endif + + parent_ref = weakref(parent) + + #ifdef CWJ_DEBUG + if(!GLOB.cwj_recipe_dictionary[start_type][recipe_id]) + log_debug("Recipe [start_type]-[recipe_id] not found by tracker!") + #endif + + current_recipe = GLOB.cwj_recipe_dictionary[start_type][recipe_id] + + #ifdef CWJ_DEBUG + if(!current_recipe) + log_debug("Recipe [start_type]-[recipe_id] initialized as null!") + #endif + + current_step = current_recipe.first_step + + #ifdef CWJ_DEBUG + steps_taken["[current_step.unique_id]"]="Started with a [start_type]" + #endif + +//A list returning the next possible steps in a given recipe +/datum/cooking/recipe_pointer/proc/get_possible_steps() + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_pointer/proc/get_possible_steps") + if(!current_step) + log_debug("Recipe pointer in [current_recipe] has no current_step assigned?") + + if(!current_step.next_step) + log_debug("Recipe pointer in [current_recipe] has no next step.") + #endif + + //Build a list of all possible steps while accounting for exclusive step relations. + //Could be optimized, but keeps the amount of variables in the pointer low. + var/list/return_list = list(current_step.next_step) + for(var/datum/cooking/recipe_step/step in current_step.optional_step_list) + + if(steps_taken["[step.unique_id]"]) + //Traverse an option chain if one is present. + if(step.flags & CWJ_IS_OPTION_CHAIN) + var/datum/cooking/recipe_step/option_chain_step = step.next_step + while(option_chain_step.unique_id != current_step.unique_id) + if(!steps_taken["[option_chain_step.unique_id]"]) + return_list += option_chain_step + break + option_chain_step = option_chain_step.next_step + continue + + //Reference the global exclusion list to see if we can add this + var/exclude_step = FALSE + if(step.flags & CWJ_IS_EXCLUSIVE) + for (var/id in GLOB.cwj_optional_step_exclusion_dictionary["[step.unique_id]"]) + //Reference the global exclusion list to see if any of the taken steps + //Have the current step marked as exclusive. + if(steps_taken["[id]"]) + exclude_step = TRUE + break + + + if(!exclude_step) + return_list += step + #ifdef CWJ_DEBUG + else + log_debug("Ignoring step [step.unique_id] due to exclusion.") + #endif + + + #ifdef CWJ_DEBUG + log_debug("/datum/cooking/recipe_pointer/proc/get_possible_steps returned list of length [return_list.len]") + #endif + return return_list + +//Get the classes of all applicable next-steps for a recipe in a bitmask. +/datum/cooking/recipe_pointer/proc/get_step_flags() + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking/recipe_pointer/proc/get_step_flags") + if(!current_step) + log_debug("Recipe pointer in [current_recipe] has no current_step assigned?") + else if(!current_step.next_step) + log_debug("Recipe pointer in [current_recipe] has no next step.") + #endif + + //Build a list of all possible steps while accounting for exclusive step relations. + //Could be optimized, but keeps the amount of variables in the pointer low. + var/return_flags = current_step.next_step.class + for(var/datum/cooking/recipe_step/step in current_step.optional_step_list) + + if(steps_taken["[step.unique_id]"]) + //Traverse an option chain if one is present. + if(step.flags & CWJ_IS_OPTION_CHAIN) + var/datum/cooking/recipe_step/option_chain_step = step.next_step + while(option_chain_step.unique_id != current_step.unique_id) + if(!steps_taken["[option_chain_step.unique_id]"]) + return_flags |= option_chain_step.class + break + option_chain_step = option_chain_step.next_step + continue + + //Reference the global exclusion list to see if we can add this + var/exclude_step = FALSE + if(step.flags & CWJ_IS_EXCLUSIVE) + for (var/id in GLOB.cwj_optional_step_exclusion_dictionary["[step.unique_id]"]) + //Reference the global exclusion list to see if any of the taken steps + //Have the current step marked as exclusive. + if(steps_taken["[id]"]) + exclude_step = TRUE + break + if(!exclude_step) + return_flags |= step.class + return return_flags + +/datum/cooking/recipe_pointer/proc/has_option_by_id(id) + if(!GLOB.cwj_step_dictionary["[id]"]) + return FALSE + var/datum/cooking/recipe_step/active_step = GLOB.cwj_step_dictionary["[id]"] + var/list/possible_steps = get_possible_steps() + if(active_step in possible_steps) + return TRUE + return FALSE + +/datum/cooking/recipe_pointer/proc/traverse(id, obj/used_obj) + #ifdef CWJ_DEBUG + log_debug("/recipe_pointer/traverse: Traversing pointer from [current_step.unique_id] to [id].") + #endif + if(!GLOB.cwj_step_dictionary["[id]"]) + return FALSE + var/datum/cooking/recipe_tracker/tracker = parent_ref.resolve() + var/datum/cooking/recipe_step/active_step = GLOB.cwj_step_dictionary["[id]"] + + var/is_valid_step = FALSE + var/list/possible_steps = get_possible_steps() + for(var/datum/cooking/recipe_step/possible_step in possible_steps) + if(active_step.unique_id == possible_step.unique_id) + is_valid_step = TRUE + break + + if(!is_valid_step) + #ifdef CWJ_DEBUG + log_debug("/recipe_pointer/traverse: step [id] is not valid for recipe [current_recipe.unique_id]") + #endif + return FALSE + + var/step_quality = active_step.calculate_quality(used_obj, tracker) + tracked_quality += step_quality + steps_taken["[id]"] = active_step.get_step_result_text(used_obj, step_quality) + if(!(active_step.flags & CWJ_IS_OPTIONAL)) + current_step = active_step + + //The recipe has been completed. + if(!current_step.next_step && current_step.unique_id == id) + + tracker.completed_list += src + return TRUE + + return FALSE diff --git a/code/modules/cooking/food_overrides.dm b/code/modules/cooking/food_overrides.dm new file mode 100644 index 00000000000..ac98bc63b36 --- /dev/null +++ b/code/modules/cooking/food_overrides.dm @@ -0,0 +1,27 @@ +// Tracks precooked food to stop deep fried baked grilled grilled grilled diona nymph cereal. +/obj/item/reagent_containers/food + drop_sound = SFX_DROP_FOOD + pickup_sound = SFX_PICKUP_FOOD + var/list/cooked_types = list() + +/obj/item/reagent_containers/food/examine(mob/user) + if(!..(user, get_dist(user, src))) + return + + if(cooking_description_modifier) + to_chat(user, SPAN_NOTICE(cooking_description_modifier)) + + #ifdef CWJ_DEBUG + to_chat(user, SPAN_NOTICE("The food's level of quality is [food_quality]")) //Visual number should only be visible when debugging + #endif + + to_chat(user, SPAN_NOTICE(food_descriptor)) + + if (bitecount==0) + return + else if (bitecount==1) + to_chat(user, SPAN_NOTICE("\The [src] was bitten by someone!")) + else if (bitecount<=3) + to_chat(user, SPAN_NOTICE("\The [src] was bitten [bitecount] time\s!")) + else + to_chat(user, SPAN_NOTICE("\The [src] was bitten multiple times!")) diff --git a/code/modules/cooking/recipes/_read_me.dm b/code/modules/cooking/recipes/_read_me.dm new file mode 100644 index 00000000000..c82f0eb4e63 --- /dev/null +++ b/code/modules/cooking/recipes/_read_me.dm @@ -0,0 +1,123 @@ +/* +========================================================= +CWJ STEP_BUILDER COMMANDS: + +All steps in the step builder have the following format: +list(<_OPTIONAL>, , =value) + + + The name any one of the recipe step types, custom or otherwise. + Valid options are: + CWJ_ADD_ITEM + Add an item to the recipe. The object is inserted in the container. + The product inherits the item's quality and reagents if able. + : + type_path - the type path of the item being added. + Example: list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) + + CWJ_ADD_REAGENT + Add a reagent to the recipe. The resulting reagent is stored in the container's reagent datum. + The product inherits the reagents added if able. It's possible to sneak poison into food this way. + : + reagent_id - the id of the reagent being added + amount - The amount of units the ingredient requires + Example: list(CWJ_ADD_REAGENT, "salt", 5) + + CWJ_ADD_PRODUCE + Add a grown item to the recipe. The item is inserted in the container. + The product inherits reagents if able, and its quality scales with the plant's potency. + : + plantname - the NAME of the SEED DATUM of the plant being added. + Example: list(CWJ_ADD_PRODUCE, "banana") + + CWJ_USE_TOOL + Uses a tool on the item. Going far and beyond the quality of the tool increases the quality of the product. + : + tool_quality - the id of the reagent being added + difficulty - The minimum tool quality of the reagent + Example: list(CWJ_USE_TOOL, QUALITY_CUTTING, 5) + + CWJ_USE_ITEM + Uses an item on the recipe. The object is not consumed. + : + type_path - the type path of the item being added. + Example: list(CWJ_USE_ITEM, /obj/item/material/kitchen/rollingpin) #Use a rolling pin on the container + + CWJ_USE_STOVE + Cook the cooking container on a stove. Keep it on too long, it burns. + : + temperature - the required temperature to cook the food at. + (Temperatures are macro'd by: J_LO, J_MED, J_HI) + time - the amount of time, in seconds, to keep the food on the stove. + Example: list(CWJ_USE_STOVE, J_LO, 40) #Cook on a stove set to "Low" for 40 seconds. + + CWJ_USE_GRILL + Cook the cooking container on a grill. Keep it on too long, it burns. Eats wood to cook. Wood fire is superior. + : + temperature - the required temperature to cook the food at. + (Temperatures are macro'd by: J_LO, J_MED, J_HI) + time - the amount of time, in seconds, to keep the food on the stove. + Example: list(CWJ_USE_GRILL, J_LO, 40) #Cook on a stove set to "Low" for 40 seconds. + +<_OPTIONAL> + The tag _OPTIONAL can be tacked onto any command to make it an optional step not required to finish the recipe. + Example: list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/slice/bread) + + + The required arguments for a specific class of step to function. They are not labeled and must be in order. + See above for which classes of step have which required arguments. + + + All custom arguments are declared in the format key=value. They are used to quickly modify a given step in a recipe. + + Example: list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, desc="a custom description") + + Valid options are: + desc + Adds a custom description to the recipe step, when read from a cooking book. + Example: desc="a custom description" + + base + Defines the base quality for a recipe step. This will become the LOWEST quality following a step can award. + For some step classes, this will simply be the default awarded. + If not defined, there is no minimum quality a step can add. + Example: base=4 + + max + Defines the maximum quality for a recipe step. This will become the HIGHEST quality following a step can award. + If not defined, there is no maximum quality a step can add. + Example: max=10 + + prod_desc + Adds a custom description to the result of the recipe step. This will be read off on the item product. + Example: prod_desc="A Slice of Bread is in the sandwich." + + exact + CWJ_ADD_ITEM or CWJ_USE_ITEM ONLY: + Determines if the steps require an exact type path, or if a child will satisfy the requirements. + of the type path is also preferable. + Example: exact=TRUE + + qmod + CWJ_ADD_ITEM, CWJ_USE_TOOL ONLY: + modifier to adjust the inherited_quality_modifier on an add_item recipe step. + Example: qmod=0.5 //only 50% of the added item's quality will be inherited. + + remain_percent + CWJ_ADD_REAGENT ONLY: + Determines the percentage of a reagent that remains in the cooking of an item. + IE- if you cook a steak with wine, you can make it so the wine doesn't wind up in the resulting food. + Example: remain_percent=0.1 //Only 10% of the units expected to be added will apply to the resulting food injection. + + reagent_skip + CWJ_ADD_ITEM, CWJ_ADD_PRODUCE ONLY: + Outright excludes all reagents from the added item/produce from showing up in the product. + Example: reagent_skip=TRUE + + exclude_reagents + CWJ_ADD_ITEM, CWJ_ADD_PRODUCE ONLY: + Excludes the presence of a reagent in an item from the resulting meal. + Example: exclude_reagents=list("carpotoxin", "blattedin") //Removes the presence of Carpotoxin or blattedin from the item. + +========================================================= +*/ diff --git a/code/modules/cooking/recipes/example_recipes.dm b/code/modules/cooking/recipes/example_recipes.dm new file mode 100644 index 00000000000..871cc0b56a4 --- /dev/null +++ b/code/modules/cooking/recipes/example_recipes.dm @@ -0,0 +1,122 @@ + +/* +//Example of the same recipe, but for the grill, just to show off how compact everything is. + +/datum/cooking/recipe/sandwich_basic_bowl + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_deep_fryer + cooking_container = DF_BASKET + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_air_fryer + cooking_container = AF_BASKET + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_pot + cooking_container = POT + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_oven + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + appear_in_default_catalog = FALSE + + +/datum/cooking/recipe/sandwich_bad_with_tomato + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_PRODUCE, "tomato", prod_desc="There is a whole tomato stuffed in the sandwich."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_tofu_bad + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/tofu, desc="Add tofu to it.", prod_desc="There is tofu between the bread."), + list(CWJ_USE_ITEM_OPTIONAL, /obj/item/reagent_containers/food/tofu, desc="Brush Tofu on it.", prod_desc="It has been in contact with tofu."), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_bad_stacked + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cutlet, desc="Add even more of any kind of cutlet.", prod_desc="There is additional meat between the bread."), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_salted + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, desc="Add any kind of cutlet.", prod_desc="There is meat between the bread."), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) + ) + appear_in_default_catalog = FALSE + +/datum/cooking/recipe/sandwich_split + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/sandwich + product_count = 2 + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sandwich, qmod=0.5), + list(CWJ_USE_TOOL, QUALITY_SAWING, 10) + ) + appear_in_default_catalog = FALSE + + +/datum/cooking/recipe/sandwich_toasted + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sandwich), + list(CWJ_USE_GRILL, J_LO, 30 SECONDS, prod_desc="It has been toasted.") + ) + appear_in_default_catalog = FALSE + +*/ diff --git a/code/modules/cooking/recipes/recipe_burgers.dm b/code/modules/cooking/recipes/recipe_burgers.dm new file mode 100644 index 00000000000..63b7479638a --- /dev/null +++ b/code/modules/cooking/recipes/recipe_burgers.dm @@ -0,0 +1,268 @@ +//**Burgers**// +/datum/cooking/recipe/burger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/plainburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty) + ) + +/datum/cooking/recipe/humanburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/human/burger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/human) + ) + +/datum/cooking/recipe/brainburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/brainburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/organ/internal/cerebrum/brain) + ) + +/datum/cooking/recipe/roburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/roburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/robot_parts/head) + ) + +/datum/cooking/recipe/xenoburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/xenoburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xeno) + ) + +/datum/cooking/recipe/fishburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/fishburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/carpmeat) + ) + +/datum/cooking/recipe/tofuburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/tofuburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), //Adding non-vegan optional to a vegan style dish is hysterical + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), //Double down + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu) + ) + +/datum/cooking/recipe/clownburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/clownburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/clothing/mask/gas/clown_hat) + ) + +/datum/cooking/recipe/mimeburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/mimeburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/clothing/head/beret) + ) + +/datum/cooking/recipe/bigbiteburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/bigbiteburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/plainburger, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledegg, qmod=0.5) + ) + +/datum/cooking/recipe/superbiteburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/superbiteburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bigbiteburger, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledegg, qmod=0.5) + ) + +/datum/cooking/recipe/jellyburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellyburger + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cherryjelly, 5) + ) + +/datum/cooking/recipe/jellyburger/cherry + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellyburger/cherry + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cherryjelly, 1), + ) + +/datum/cooking/recipe/jellyburger/metroid + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellyburger/metroid + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/metroidjelly, 5) + ) + +/datum/cooking/recipe/bunbun + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/bunbun + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + ) diff --git a/code/modules/cooking/recipes/recipe_donuts.dm b/code/modules/cooking/recipes/recipe_donuts.dm new file mode 100644 index 00000000000..da6f78a36ca --- /dev/null +++ b/code/modules/cooking/recipes/recipe_donuts.dm @@ -0,0 +1,47 @@ +/datum/cooking/recipe/medialuna //This is 100% a donut but with extra layers + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/medialuna + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 20 SECONDS), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking/recipe/donut + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/donut + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 1, base=1), + list(CWJ_USE_OVEN, J_LO, 10 SECONDS) + ) + +/datum/cooking/recipe/jellydonut + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/donut/jelly + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_REAGENT, "berryjuice", 5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 1, base=1), + list(CWJ_USE_OVEN, J_LO, 20 SECONDS) + ) + +/datum/cooking/recipe/slime_jellydonut + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/donut/metroidjelly + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/metroidjelly, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 1, base=1), + list(CWJ_USE_OVEN, J_LO, 20 SECONDS) + ) diff --git a/code/modules/cooking/recipes/recipe_hotdogs.dm b/code/modules/cooking/recipes/recipe_hotdogs.dm new file mode 100644 index 00000000000..7f19fcb3217 --- /dev/null +++ b/code/modules/cooking/recipes/recipe_hotdogs.dm @@ -0,0 +1,29 @@ +/datum/cooking/recipe/hotdog + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/hotdog + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sausage, qmod=0.5), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/classichotdog + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/classichotdog + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bun, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/ketchup, 1), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/holder/corgi, qmod=0.5), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) diff --git a/code/modules/cooking/recipes/recipe_pastry.dm b/code/modules/cooking/recipes/recipe_pastry.dm new file mode 100644 index 00000000000..2ef8eac720c --- /dev/null +++ b/code/modules/cooking/recipes/recipe_pastry.dm @@ -0,0 +1,29 @@ +/datum/cooking/recipe/waffles + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/waffles + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5, base=1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 5, base=1), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/rofflewaffles + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/rofflewaffles + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rofflewaffles, qmod=0.5), + list(CWJ_ADD_REAGENT, "psilocybin", 5), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, "pwine", 5, base=6, remain_percent=0.1, prod_desc="The fancy wine soaks up into the fluffy waffles."), + list(CWJ_ADD_REAGENT_OPTIONAL, "space_drugs", 5, base=6, remain_percent=0.5, prod_desc="The space drugs soak into the waffles."), + list(CWJ_ADD_REAGENT_OPTIONAL, "mindbreaker", 5, base=6, remain_percent=0.1, prod_desc="Not for waking up to."), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) diff --git a/code/modules/cooking/recipes/recipe_unsorted.dm b/code/modules/cooking/recipes/recipe_unsorted.dm new file mode 100644 index 00000000000..75e37a8b14b --- /dev/null +++ b/code/modules/cooking/recipes/recipe_unsorted.dm @@ -0,0 +1,1454 @@ +// TODO: IF YOU HAVE NOTHING TO DO, SORT DAT SHIT + +//Example Recipes +/datum/cooking/recipe/steak_stove + + //Name of the recipe. If not defined, it will just use the name of the product_type + name="Stove-Top cooked Steak" + + //The recipe will be cooked on a pan + cooking_container = PAN + + //The product of the recipe will be a steak. + product_type = /obj/item/reagent_containers/food/meatsteak + + //The product will have it's initial reagents wiped, prior to the recipe adding in reagents of its own. + replace_reagents = FALSE + + step_builder = list( + + //Butter your pan by adding a slice of butter, and then melting it. Adding the butter unlocks the option to melt it on the stove. + CWJ_BEGIN_OPTION_CHAIN, + //base - the lowest amount of quality following this step can award. + //reagent_skip - Exclude the added item's reagents from being included the product + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/butterslice, base=10), + + //Melt the butter into the pan by cooking it on a stove set to Low for 10 seconds + list(CWJ_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS), + CWJ_END_OPTION_CHAIN, + + //A steak is needed to start the meal. + //qmod- Half of the food quality of the parent will be considered. + //exclude_reagents- Blattedin and Carpotoxin will be filtered out of the steak. EXCEPT THIS IS ERIS, WE EMBRACE THE ROACH, and has thus been removed from every + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + //Add some mushrooms to give it some zest. Only one kind is allowed! + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_PRODUCE_OPTIONAL, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE_OPTIONAL, "reishi", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "amanita", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "plumphelmet", qmod=0.4), + CWJ_END_EXCLUSIVE_OPTIONS, + + //Beat that meat to increase its quality + list(CWJ_USE_TOOL_OPTIONAL, QUALITY_HAMMERING, 15), + + //You can add up to 3 units of honey to increase the quality. Any more will negatively impact it. + //base- for CWJ_ADD_REAGENT, the amount that this step will award if followed perfectly. + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), + + //You can add capaicin or wine, but not both + //prod_desc- A description appended to the resulting product. + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/capsaicin, 5, base=6, prod_desc="The steak was Spiced with chili powder."), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/ethanol/wine, 5, remain_percent=0.1 ,base=6, prod_desc="The steak was sauteed in wine"), + CWJ_END_EXCLUSIVE_OPTIONS, + + //Cook on a stove, at medium temperature, for 30 seconds + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +//**Meat and Seafood**// +//Missing: cubancarp, friedchicken, tonkatsu, enchiladas, monkeysdelight, fishandchips, katsudon, fishfingers, +/datum/cooking/recipe/donkpocket //Special interactions in recipes_microwave.dm, not sure if this is going to function as expected + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/donkpocket + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5) + ) + +/datum/cooking/recipe/donkpocket //Special interactions in recipes_microwave.dm, not sure if this is going to function as expected + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/donkpocket + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5) + ) + +/datum/cooking/recipe/cooked_cutlet + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/cutlet + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawcutlet, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/cooked_faggot + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/faggot + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawfaggot, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_LO, 20 SECONDS) + ) + +/datum/cooking/recipe/cooked_patty + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/patty + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty_raw, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_GRILL, J_LO, 10 SECONDS) + ) + +/datum/cooking/recipe/chickensteak + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/chickensteak + + replace_reagents = FALSE + + step_builder = list( + CWJ_BEGIN_OPTION_CHAIN, + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS), + CWJ_END_OPTION_CHAIN, + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chickenbreast, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_PRODUCE_OPTIONAL, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE_OPTIONAL, "reishi", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "amanita", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "plumphelmet", qmod=0.4), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/capsaicin, 5, base=6, prod_desc="The chicken was Spiced with chili powder."), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/drink/juice/lemon, 5, remain_percent=0.1 ,base=3, prod_desc="The chicken was sauteed in lemon juice"), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/porkchops + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/porkchop + + replace_reagents = FALSE + + step_builder = list( + CWJ_BEGIN_OPTION_CHAIN, + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS), + CWJ_END_OPTION_CHAIN, + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/pork, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_PRODUCE_OPTIONAL, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE_OPTIONAL, "reishi", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "amanita", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "plumphelmet", qmod=0.4), + CWJ_END_EXCLUSIVE_OPTIONS, + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/capsaicin, 5, base=6, prod_desc="The pork was Spiced with chili powder."), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 5, remain_percent=0.1 ,base=3, prod_desc="The pork was glazed with honey"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/barbecue, 3, remain_percent=0.5 ,base=8, prod_desc="The pork was layered with BBQ sauce"), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/roastchicken + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/roastchicken + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/chicken, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/stuffing, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/tofurkey //Not quite meat but cooked similar to roast chicken + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/tofurkey + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/stuffing, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/boiled_egg + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledegg + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/friedegg_basic + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/friedegg + step_builder = list( + + CWJ_BEGIN_OPTION_CHAIN, + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS), + CWJ_END_OPTION_CHAIN, + + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/bacon + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/bacon + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawbacon, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 1, base=1), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/baconegg + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/baconeggs + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/friedegg, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/benedict + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/benedict + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/protein/egg, 3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledegg, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/omelette + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/omelette + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 10 SECONDS) + ) + +/datum/cooking/recipe/taco + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/taco + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tortilla), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_PRODUCE, "corn"), + list(CWJ_ADD_PRODUCE, "cabbage"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + + +/datum/cooking/recipe/sausage + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/sausage + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawfaggot), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawbacon), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_USE_GRILL, J_MED, 10 SECONDS) + ) + +/datum/cooking/recipe/wingfangchu + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/wingfangchu + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xeno, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/soysauce, 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking/recipe/sashimi + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/sashimi + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/carpmeat, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/carpmeat, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/soysauce, 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking/recipe/chawanmushi + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/chawanmushi + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/soysauce, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/kabob + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/meatkabob + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/stack/rods = 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_USE_GRILL, J_MED, 20 SECONDS) + ) + +/datum/cooking/recipe/tofukabob + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/tofukabob + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/stack/rods = 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_USE_GRILL, J_MED, 20 SECONDS) + ) + +/datum/cooking/recipe/humankabob + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/meatkabob + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/stack/rods = 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/human, qmod=0.5, prod_desc="The kabob has some strange sweet meat"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/human, qmod=0.5), + list(CWJ_USE_GRILL, J_MED, 20 SECONDS) + ) + +//**Cereals and Grains**// +//missing: poppyprezel +/datum/cooking/recipe/bread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/bread + recipe_guide = "Put dough in an oven, bake for 30 seconds on medium." + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/meatbread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/meatbread + recipe_guide = "Put dough in an oven, bake for 30 seconds on medium." + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/xenomeatbread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/xenomeatbread + recipe_guide = "Put dough in an oven, bake for 30 seconds on medium." + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xeno), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xeno), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/tofubread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/tofubread + recipe_guide = "Put dough in an oven, bake for 30 seconds on medium." + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/creamcheesebread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/creamcheesebread + recipe_guide = "Put dough in an oven, bake for 30 seconds on medium." + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/bananabread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/bananabread + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 2), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 15), + list(CWJ_ADD_PRODUCE, "banana", 1), + list(CWJ_USE_OVEN, J_MED, 40 SECONDS) + ) +/datum/cooking/recipe/baguette + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/baguette + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/dough, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/cracker + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/cracker + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/bun + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/bun + product_count = 3 + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1), + list(CWJ_USE_OVEN, J_HI, 5 SECONDS) + ) + +/datum/cooking/recipe/flatbread + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/flatbread + product_count = 3 + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1), + list(CWJ_USE_OVEN, J_HI, 5 SECONDS) + ) + +/datum/cooking/recipe/twobread + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/twobread + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/ethanol/wine, 5) + ) + +/datum/cooking/recipe/pancakes + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/pancakes + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5, base=1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 5, base=1), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + + + +/datum/cooking/recipe/jelliedtoast + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jelliedtoast/cherry + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cherryjelly, 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking/recipe/slimetoast + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jelliedtoast/metroid + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/metroidjelly, 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking/recipe/stuffing + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/stuffing + product_count = 3 + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/bread, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/water, 5), + ) + +/datum/cooking/recipe/tortilla + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/tortilla + product_count = 3 + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/flatdoughslice), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/flatdoughslice), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/flatdoughslice), + list(CWJ_USE_OVEN, J_HI, 5 SECONDS) + ) + +/datum/cooking/recipe/muffin + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/muffin + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chocolatebar, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/boiledrice + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledrice + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/rice, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) + +/datum/cooking/recipe/ricepudding + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/ricepudding + step_builder = list( + list(CWJ_ADD_REAGENT, , 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/drink/milk/cream, 10), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledrice, qmod=0.5) + ) + + + +//**Sandwiches**// +/datum/cooking/recipe/sandwich_basic + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/sandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_PRODUCE, "cabbage"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cooked cutlet."), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + +/datum/cooking/recipe/metroidsandwich + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellysandwich/metroid + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/metroidjelly, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + +/datum/cooking/recipe/cherrysandwich + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellysandwich/cherry + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cherryjelly, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + +/datum/cooking/recipe/blt + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/blt + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_PRODUCE, "cabbage"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cutlet, qmod=0.5, desc="Add any kind of cooked cutlet."), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) + ) + +/datum/cooking/recipe/grilledcheese + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/grilledcheese + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5), + list(CWJ_USE_GRILL, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/toastedsandwich + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/toastedsandwich + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sandwich, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_GRILL, J_LO, 15 SECONDS) + ) + +//**Pastas**// +/datum/cooking/recipe/raw_spaghetti + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/spaghetti + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/flour, 1, base=1), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking/recipe/boiledspaghetti + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledspaghetti + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/spaghetti, qmod=0.5), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/pastatomato + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/pastatomato + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledspaghetti, qmod=0.5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.4), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.4), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/meatballspaghetti + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/faggotspaghetti + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledspaghetti, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato", qmod=0.4), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/spesslaw + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/spesslaw + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledspaghetti, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato", qmod=0.4), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +//**Pizzas**// +/datum/cooking/recipe/pizzamargherita + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/pizza/margherita + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/flour, 5), + list(CWJ_USE_OVEN, J_MED, 35 SECONDS) + ) + +/datum/cooking/recipe/meatpizza + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/pizza/meatpizza + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/flour, 5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + list(CWJ_USE_OVEN, J_MED, 35 SECONDS) + ) + +/datum/cooking/recipe/mushroompizza + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/pizza/mushroompizza + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/flour, 5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_USE_OVEN, J_MED, 35 SECONDS) + ) + +/datum/cooking/recipe/vegetablepizza + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/pizza/vegetablepizza + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/flour, 5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + list(CWJ_ADD_PRODUCE, "eggplant", qmod=0.2), + list(CWJ_ADD_PRODUCE, "cabbage", qmod=0.2), + list(CWJ_ADD_PRODUCE, "carrot", qmod=0.2), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_USE_OVEN, J_MED, 35 SECONDS) + ) + +//**Pies**// +/datum/cooking/recipe/meatpie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/meatpie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/tofupie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/tofupie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/xemeatpie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/xemeatpie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xeno, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/pie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/pie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "banana", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/cherrypie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/cherrypie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "cherry", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/berryclafoutis + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/berryclafoutis + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "berries", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/amanita_pie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/amanita_pie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/toxin/amatoxin, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/plump_pie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/plump_pie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "plumphelmet", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/pumpkinpie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/pumpkinpie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "pumpkin", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/applepie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/applepie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "apple", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +//**Salads**// +/datum/cooking/recipe/tossedsalad + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/tossedsalad + step_builder = list( + list(CWJ_ADD_PRODUCE, "cabbage", qmod=0.2), + list(CWJ_ADD_PRODUCE, "cabbage", qmod=0.2), + list(CWJ_ADD_PRODUCE, "carrot", qmod=0.2), + list(CWJ_ADD_PRODUCE, "apple", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/stuffing, base=10), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + ) + +/datum/cooking/recipe/aesirsalad + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/aesirsalad + step_builder = list( + list(CWJ_ADD_PRODUCE, "ambrosiadeus", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/stuffing, base=10), + list(CWJ_ADD_PRODUCE, "goldapple", qmod=0.2), + ) + +/datum/cooking/recipe/validsalad + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/validsalad + step_builder = list( + list(CWJ_ADD_PRODUCE, "ambrosia", qmod=0.2), + list(CWJ_ADD_PRODUCE, "ambrosia", qmod=0.2), + list(CWJ_ADD_PRODUCE, "ambrosia", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/stuffing, base=5), + list(CWJ_ADD_PRODUCE, "potato", qmod=0.2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + ) +//**Soups**// Possibly replaced by Handyman's Soup project, which'll be based on cauldron soup kitchen aesthetic +/datum/cooking/recipe/tomatosoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/tomatosoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_PRODUCE, "tomato"), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/drink/milk/cream, 5, base=3, prod_desc="The soup turns a lighter red and thickens with the cream."), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 5 ,base=5, prod_desc="The thickens as the honey mixes in."), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/meatballsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/faggotsoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_PRODUCE, "carrot"), + list(CWJ_ADD_PRODUCE, "potato"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/vegetablesoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/vegetablesoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "carrot"), + list(CWJ_ADD_PRODUCE, "potato"), + list(CWJ_ADD_PRODUCE, "eggplant"), + list(CWJ_ADD_PRODUCE, "cabbage"), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/nettlesoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/nettlesoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "potato"), + list(CWJ_ADD_PRODUCE, "nettle"), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/wishsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/wishsoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 20), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/coldchili + cooking_container = POT + product_type = /obj/item/reagent_containers/food/coldchili + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "icechili"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/hotchili + cooking_container = POT + product_type = /obj/item/reagent_containers/food/hotchili + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "chili"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/bearchili + cooking_container = POT + product_type = /obj/item/reagent_containers/food/bearchili + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "chili"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bearmeat, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking/recipe/stew + cooking_container = POT + product_type = /obj/item/reagent_containers/food/stew + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "carrot"), + list(CWJ_ADD_PRODUCE, "potato"), + list(CWJ_ADD_PRODUCE, "mushrooms"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/milosoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/milosoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/soydope, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/soydope, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/beetsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/beetsoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_PRODUCE, "whitebeet"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "potato"), + list(CWJ_ADD_PRODUCE, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/drink/milk/cream, 5, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/mushroomsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/mushroomsoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk/cream, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_REAGENT, /datum/reagent/blackpepper, 1), + list(CWJ_ADD_PRODUCE, "mushrooms", qmod=0.2), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_PRODUCE_OPTIONAL, "reishi", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "amanita", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "plumphelmet", qmod=0.4), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/mysterysoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/mysterysoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/badrecipe, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_USE_STOVE, J_MED, 20 SECONDS) + ) + +/datum/cooking/recipe/bloodsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/bloodsoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/blood, 30), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/metroidsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/metroidsoup + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT, /datum/reagent/metroidjelly, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking/recipe/beefcurry + cooking_container = POT + product_type = /obj/item/reagent_containers/food/beefcurry + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_USE_STOVE, J_LO, 10 SECONDS), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/soysauce, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledrice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat, qmod=0.5), + list(CWJ_ADD_PRODUCE, "chili"), + list(CWJ_ADD_PRODUCE, "carrot"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_USE_STOVE, J_MED, 40 SECONDS) + ) + +/datum/cooking/recipe/chickencurry + cooking_container = POT + product_type = /obj/item/reagent_containers/food/chickencurry + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_USE_STOVE, J_LO, 10 SECONDS), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/soysauce, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledrice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chickenbreast, qmod=0.5), + list(CWJ_ADD_PRODUCE, "chili"), + list(CWJ_ADD_PRODUCE, "carrot"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_USE_STOVE, J_MED, 40 SECONDS) + ) + +//**Vegetables**// +//missing: soylenviridians, soylentgreen +/datum/cooking/recipe/mashpotato + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/mashpotatoes + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_PRODUCE, "potato", 2), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_USE_TOOL, QUALITY_HAMMERING, 15) + ) + +/datum/cooking/recipe/loadedbakedpotato + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/loadedbakedpotato + + replace_reagents = FALSE + + step_builder = list( + list(CWJ_ADD_PRODUCE, "potato", 1), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/fries + cooking_container = DF_BASKET + product_type = /obj/item/reagent_containers/food/fries + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawsticks), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) + +/datum/cooking/recipe/cheesyfries + cooking_container = DF_BASKET + product_type = /obj/item/reagent_containers/food/cheesyfries + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/fries), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/eggplantparm + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/eggplantparm + step_builder = list( + list(CWJ_ADD_PRODUCE, "eggplant"), + list(CWJ_ADD_ITEM_OPTIONAL, /obj/item/reagent_containers/food/butterslice, base=3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_PRODUCE_OPTIONAL, "mushrooms", qmod=0.2), + list(CWJ_ADD_PRODUCE_OPTIONAL, "reishi", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "amanita", qmod=0.4), + list(CWJ_ADD_PRODUCE_OPTIONAL, "plumphelmet", qmod=0.4), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_USE_STOVE, J_HI, 30 SECONDS) + ) + +/datum/cooking/recipe/stewedsoymeat + cooking_container = POT + product_type = /obj/item/reagent_containers/food/stewedsoymeat + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/soydope, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/soydope, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "carrot"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) + +//**Cakes**// +/datum/cooking/recipe/plaincake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/plaincake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/butterstick, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 15), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 15), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/protein/egg, 9), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/carrotcake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/carrotcake + step_builder = list( + list(CWJ_ADD_PRODUCE, "carrot", qmod=0.2), + list(CWJ_ADD_PRODUCE, "carrot", qmod=0.2), + list(CWJ_ADD_PRODUCE, "carrot", qmod=0.2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/cheesecake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/cheesecake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/cheesewedge, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/orangecake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/orangecake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_PRODUCE, "orange", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/limecake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/limecake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_PRODUCE, "lime", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/lemoncake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/lemoncake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_PRODUCE, "lemon", qmod=0.2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/chocolatecake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/chocolatecake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chocolatebar, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/coco, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/applecake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/applecake + step_builder = list( + list(CWJ_ADD_PRODUCE, "apple", qmod=0.2), + list(CWJ_ADD_PRODUCE, "apple", qmod=0.2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/birthdaycake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/birthdaycake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/clothing/head/cakehat, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/braincake + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/braincake + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/plaincake, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/organ/internal/cerebrum/brain, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/butterstick, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking/recipe/brownies + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/sliceable/brownie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/butterstick, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 15), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/coco, 10), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/protein/egg, 9), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chocolatebar, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +//**Desserts and Sweets**// +//missing: fortunecookie, honey_bun, honey_pudding +//Changes: Now a chemical reaction: candy_corn, mint, +/datum/cooking/recipe/chocolateegg + cooking_container = POT + product_type = /obj/item/reagent_containers/food/chocolateegg + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chocolatebar, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sugar, 5), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/candiedapple + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/candiedapple + step_builder = list( + list(CWJ_ADD_PRODUCE, "apple", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 1, base=1), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/cookie + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/cookie + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/cornoil, 2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chocolatebar, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking/recipe/appletart + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/appletart + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "goldapple", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/sugar, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/drink/milk, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 10), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/protein/egg, 3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/plumphelmetbiscuit + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/plumphelmetbiscuit + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/flatdough, qmod=0.5), + list(CWJ_ADD_PRODUCE, "plumphelmet", qmod=0.2), + list(CWJ_ADD_REAGENT, /datum/reagent/water, 5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/flour, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking/recipe/popcorn + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/popcorn + step_builder = list( + list(CWJ_ADD_PRODUCE, "corn"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 2), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +//UNSORTED +//missing: spacylibertyduff +/datum/cooking/recipe/boiled_metroid_extract + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledmetroidcore + step_builder = list( + list(CWJ_ADD_REAGENT, /datum/reagent/water, 10), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/metroid_extract, qmod=0.5), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) diff --git a/code/modules/cooking/recipes/recipes_to_covert.dm b/code/modules/cooking/recipes/recipes_to_covert.dm new file mode 100644 index 00000000000..2fe2e8257e5 --- /dev/null +++ b/code/modules/cooking/recipes/recipes_to_covert.dm @@ -0,0 +1,431 @@ +/datum/recipe/dumplings //Missing Recipe + fruit = list("cabbage" = 1) // A recipe that ACTUALLY uses cabbage. + reagents = list(/datum/reagent/nutriment/soysauce = 5, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1, /datum/reagent/nutriment/cornoil = 1) // No sesame oil, corn will have to do. + items = list( + /obj/item/reagent_containers/food/rawbacon, + /obj/item/reagent_containers/food/rawbacon, // Substitute for minced pork. + /obj/item/reagent_containers/food/doughslice, + ) + result = /obj/item/reagent_containers/food/dumplings + +//Somethin' the fuck else + +/datum/recipe/donkpocket/proc/warm_up(obj/item/reagent_containers/food/donkpocket/being_cooked) + being_cooked.heat() + +/datum/recipe/donkpocket/warm + reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour + items = list( + /obj/item/reagent_containers/food/donkpocket + ) + result = /obj/item/reagent_containers/food/donkpocket //SPECIAL + +/datum/recipe/donkpocket/make_food(obj/container as obj) + var/obj/item/reagent_containers/food/donkpocket/being_cooked = locate() in container + if(being_cooked && !being_cooked.warm) + warm_up(being_cooked) + return being_cooked + + +// see code/datums/recipe.dm + + +/* No telebacon. just no... +/datum/recipe/telebacon + items = list( + /obj/item/reagent_containers/food/meat, + /obj/item/device/assembly/signaler + ) + result = /obj/item/reagent_containers/food/telebacon + +I said no! +/datum/recipe/syntitelebacon + items = list( + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/device/assembly/signaler + ) + result = /obj/item/reagent_containers/food/telebacon +*/ + +/datum/recipe/dionaroast + fruit = list("apple" = 1) + reagents = list(/datum/reagent/acid/polyacid = 5) //It dissolves the carapace. Still poisonous, though. + items = list(/obj/item/holder/diona) + result = /obj/item/reagent_containers/food/dionaroast + +/datum/recipe/syntibread + items = list( + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/reagent_containers/food/cheesewedge, + /obj/item/reagent_containers/food/cheesewedge, + /obj/item/reagent_containers/food/cheesewedge, + ) + result = /obj/item/reagent_containers/food/sliceable/meatbread + + +/datum/recipe/soylenviridians + fruit = list("soybeans" = 1) + reagents = list(/datum/reagent/nutriment/flour = 10) + result = /obj/item/reagent_containers/food/soylenviridians + +/datum/recipe/soylentgreen + reagents = list(/datum/reagent/nutriment/flour = 10) + items = list( + /obj/item/reagent_containers/food/meat/human, + /obj/item/reagent_containers/food/meat/human + ) + result = /obj/item/reagent_containers/food/soylentgreen + + + +/datum/recipe/chaosdonut + reagents = list(/datum/reagent/frostoil = 5, /datum/reagent/capsaicin = 5, /datum/reagent/sugar = 5) + items = list( + /obj/item/reagent_containers/food/dough + ) + result = /obj/item/reagent_containers/food/donut/chaos + +/datum/recipe/cubancarp + fruit = list("chili" = 1) + items = list( + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/carpmeat + ) + result = /obj/item/reagent_containers/food/cubancarp + +/datum/recipe/popcorn + reagents = list(/datum/reagent/sodiumchloride = 5) + fruit = list("corn" = 1) + result = /obj/item/reagent_containers/food/popcorn + +/datum/recipe/fortunecookie + reagents = list(/datum/reagent/sugar = 5) + items = list( + /obj/item/reagent_containers/food/doughslice, + /obj/item/paper, + ) + result = /obj/item/reagent_containers/food/fortunecookie + +/datum/recipe/fortunecookie/make_food(obj/container) + var/obj/item/paper/paper = locate() in container + paper.forceMove(null) //prevent deletion + var/obj/item/reagent_containers/food/fortunecookie/being_cooked = ..(container) + paper.forceMove(being_cooked) + being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn + return being_cooked + +/datum/recipe/fortunecookie/check_items(obj/container) + . = ..() + if(.) + var/obj/item/paper/paper = locate() in container + if(!paper || !paper.info) + return 0 + return . + + +/datum/recipe/loadedsteak + reagents = list(/datum/reagent/nutriment/garlicsauce = 5) + fruit = list("onion" = 1, "mushroom" = 1) + items = list(/obj/item/reagent_containers/food/meat) + result = /obj/item/reagent_containers/food/loadedsteak + +/datum/recipe/syntisteak + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) + items = list(/obj/item/reagent_containers/food/meat/syntiflesh) + result = /obj/item/reagent_containers/food/meatsteak + + +/datum/recipe/syntipizza + fruit = list("tomato" = 1) + items = list( + /obj/item/reagent_containers/food/sliceable/flatdough, + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/reagent_containers/food/meat/syntiflesh, + /obj/item/reagent_containers/food/cheesewedge + ) + result = /obj/item/reagent_containers/food/sliceable/pizza/meatpizza + +/datum/recipe/spacylibertyduff + reagents = list(/datum/reagent/water = 5, /datum/reagent/ethanol/vodka = 5, /datum/reagent/psilocybin = 5) + result = /obj/item/reagent_containers/food/spacylibertyduff + +/datum/recipe/amanitajelly + reagents = list(/datum/reagent/water = 5, /datum/reagent/ethanol/vodka = 5, /datum/reagent/toxin/amatoxin = 5) + result = /obj/item/reagent_containers/food/amanitajelly + make_food(obj/container as obj) + var/obj/item/reagent_containers/food/amanitajelly/being_cooked = ..(container) + being_cooked.reagents.del_reagent(/datum/reagent/toxin/amatoxin) + return being_cooked + + +/datum/recipe/fathersoup + fruit = list("garlic" = 1, "flamechili" = 1, "tomato" = 1) + reagents = list(/datum/reagent/nutriment/flour = 10, /datum/reagent/blackpepper = 5) + items = list(/obj/item/reagent_containers/food/tomatosoup) + result = /obj/item/reagent_containers/food/fathersoup + +/datum/recipe/spellburger + items = list( + /obj/item/reagent_containers/food/plainburger, + /obj/item/clothing/head/wizard/fake, + ) + result = /obj/item/reagent_containers/food/spellburger + +/datum/recipe/spellburger + items = list( + /obj/item/reagent_containers/food/plainburger, + /obj/item/clothing/head/wizard, + ) + result = /obj/item/reagent_containers/food/spellburger + + +/datum/recipe/enchiladas + fruit = list("chili" = 2, "corn" = 1) + items = list(/obj/item/reagent_containers/food/cutlet) + result = /obj/item/reagent_containers/food/enchiladas + +/datum/recipe/monkeysdelight + fruit = list("banana" = 1) + reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1, /datum/reagent/nutriment/flour = 10) + items = list(/obj/item/reagent_containers/food/monkeycube) + result = /obj/item/reagent_containers/food/monkeysdelight + + +/datum/recipe/fishandchips + items = list( + /obj/item/reagent_containers/food/fries, + /obj/item/reagent_containers/food/carpmeat, + ) + result = /obj/item/reagent_containers/food/fishandchips + +/datum/recipe/pelmeni + reagents = list(/datum/reagent/water = 5) + items = list( + /obj/item/reagent_containers/food/pelmeni, + ) + result = /obj/item/reagent_containers/food/boiledpelmeni + + +/datum/recipe/poppypretzel + fruit = list("poppy" = 1) + items = list(/obj/item/reagent_containers/food/dough) + result = /obj/item/reagent_containers/food/poppypretzel + + +/datum/recipe/threebread + items = list( + /obj/item/reagent_containers/food/twobread, + /obj/item/reagent_containers/food/slice/bread, + ) + result = /obj/item/reagent_containers/food/threebread + +/datum/recipe/fishfingers + reagents = list(/datum/reagent/nutriment/flour = 10) + items = list( + /obj/item/reagent_containers/food/egg, + /obj/item/reagent_containers/food/carpmeat, + ) + result = /obj/item/reagent_containers/food/fishfingers + +// Fuck Science! +/datum/recipe/ruinedvirusdish + items = list( + /obj/item/virusdish + ) + result = /obj/item/ruinedvirusdish + +////////////////////////////////////////// +// bs12 food port stuff +////////////////////////////////////////// + +/datum/recipe/onionrings + fruit = list("onion" = 1) + items = list( + /obj/item/reagent_containers/food/doughslice + ) + result = /obj/item/reagent_containers/food/onionrings + +/datum/recipe/mint + reagents = list(/datum/reagent/sugar = 5, /datum/reagent/frostoil = 5) + result = /obj/item/reagent_containers/food/mint + + + +/datum/recipe/cake/metroid + items = list(/obj/item/metroid_extract) + reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/sugar = 15) + result = /obj/item/reagent_containers/food/sliceable/metroidcake + +/datum/recipe/smokedsausage + items = list(/obj/item/reagent_containers/food/sausage) + reagents = list(/datum/reagent/sodiumchloride = 5, /datum/reagent/blackpepper = 5) + result = /obj/item/reagent_containers/food/smokedsausage + +/datum/recipe/julienne + fruit = list("mushroom" = 2, "onion" = 1) + items = list(/obj/item/reagent_containers/food/cheesewedge, /obj/item/reagent_containers/food/meat) + result = /obj/item/reagent_containers/food/julienne + +/datum/recipe/ricewithmeat + items = list(/obj/item/reagent_containers/food/boiledrice, /obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) + result = /obj/item/reagent_containers/food/ricewithmeat + +/datum/recipe/eggbowl + items = list(/obj/item/reagent_containers/food/boiledrice, /obj/item/reagent_containers/food/boiledegg) + fruit = list("carrot" = 1, "corn" = 1) + result = /obj/item/reagent_containers/food/eggbowl + +/datum/recipe/meatbun + items = list(/obj/item/reagent_containers/food/bun, /obj/item/reagent_containers/food/faggot) + reagents = list(/datum/reagent/nutriment/soysauce = 5) + fruit = list("cabbage" = 1) + result = /obj/item/reagent_containers/food/meatbun + +/datum/recipe/salami + items = list(/obj/item/reagent_containers/food/smokedsausage) + reagents = list(/datum/reagent/nutriment/garlicsauce = 5) + result = /obj/item/reagent_containers/food/sliceable/salami + +/datum/recipe/sushi + items = list(/obj/item/reagent_containers/food/tofu, /obj/item/reagent_containers/food/boiledrice, /obj/item/reagent_containers/food/carpmeat) + result = /obj/item/reagent_containers/food/sliceable/sushi + +/datum/recipe/fruitcup + fruit = list("apple" = 1, "orange" = 1,"ambrosia" = 1, "banana" = 1, "lemon" = 1, "watermelon" = 1) + result = /obj/item/reagent_containers/food/fruitcup + +/datum/recipe/fruitsalad + fruit = list("apple" = 1, "orange" = 1, "watermelon" = 1) + result = /obj/item/reagent_containers/food/fruitsalad + +/datum/recipe/delightsalad + fruit = list("lemon" = 1, "orange" = 1, "lime" = 1) + result = /obj/item/reagent_containers/food/delightsalad + +/datum/recipe/junglesalad + fruit = list("apple" = 1, "banana" = 2, "watermelon" = 1) + result = /obj/item/reagent_containers/food/junglesalad + +/datum/recipe/chowmein + items = list(/obj/item/reagent_containers/food/boiledspaghetti, /obj/item/reagent_containers/food/cutlet) + fruit = list("cabbage" = 2, "carrot" = 1) + result = /obj/item/reagent_containers/food/chowmein + +/datum/recipe/beefnoodles + items = list(/obj/item/reagent_containers/food/boiledspaghetti,/obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) + fruit = list("cabbage" = 1) + result = /obj/item/reagent_containers/food/beefnoodles + +/datum/recipe/nachos + items = list(/obj/item/reagent_containers/food/tortilla) + reagents = list(/datum/reagent/sodiumchloride = 1) + result = /obj/item/reagent_containers/food/nachos + +/datum/recipe/cheesenachos + items = list(/obj/item/reagent_containers/food/tortilla,/obj/item/reagent_containers/food/cheesewedge) + reagents = list(/datum/reagent/sodiumchloride = 1) + result = /obj/item/reagent_containers/food/cheesenachos + +/datum/recipe/cubannachos + items = list(/obj/item/reagent_containers/food/tortilla) + fruit = list("chili" = 2) + result = /obj/item/reagent_containers/food/cubannachos + +/datum/recipe/eggwrap + items = list(/obj/item/reagent_containers/food/boiledegg) + fruit = list("cabbage" = 1) + reagents = list(/datum/reagent/nutriment/soysauce = 10) + result = /obj/item/reagent_containers/food/eggwrap + +/datum/recipe/cheeseburrito + items = list(/obj/item/reagent_containers/food/tortilla,/obj/item/reagent_containers/food/cheesewedge, /obj/item/reagent_containers/food/cheesewedge) + fruit = list("soybeans" = 1) + result = /obj/item/reagent_containers/food/cheeseburrito + +/datum/recipe/sundae + items = list(/obj/item/reagent_containers/food/doughslice) + fruit = list("banana" = 1, "cherries" = 1) + reagents = list(/datum/reagent/drink/milk/cream = 10) + result = /obj/item/reagent_containers/food/sundae + +/datum/recipe/burrito + items = list(/obj/item/reagent_containers/food/tortilla) + fruit = list("soybeans" = 2) + result = /obj/item/reagent_containers/food/burrito + +/datum/recipe/carnaburrito + items = list(/obj/item/reagent_containers/food/tortilla,/obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) + fruit = list("soybeans" = 1) + result = /obj/item/reagent_containers/food/carnaburrito + +/datum/recipe/plasmaburrito + items = list(/obj/item/reagent_containers/food/tortilla) + fruit = list("soybeans" = 1, "chili" = 2) + result = /obj/item/reagent_containers/food/plasmaburrito + +/datum/recipe/risotto + items = list(/obj/item/reagent_containers/food/cheesewedge) + reagents = list(/datum/reagent/nutriment/rice = 10, /datum/reagent/ethanol/wine = 5) + result = /obj/item/reagent_containers/food/risotto + + +/datum/recipe/bruschetta + items = list(/obj/item/reagent_containers/food/cheesewedge) + fruit = list("tomato" = 1, "garlic" = 1) + reagents = list(/datum/reagent/nutriment/flour = 10, /datum/reagent/sodiumchloride = 2) + result = /obj/item/reagent_containers/food/bruschetta + +/datum/recipe/quiche + items = list(/obj/item/reagent_containers/food/cheesewedge, /obj/item/reagent_containers/food/egg) + fruit = list("tomato" = 1, "garlic" = 1) + result = /obj/item/reagent_containers/food/quiche + +/datum/recipe/lasagna + items = list( + /obj/item/reagent_containers/food/cheesewedge, + /obj/item/reagent_containers/food/sliceable/flatdough, + /obj/item/reagent_containers/food/sliceable/flatdough, + /obj/item/reagent_containers/food/meat, + /obj/item/reagent_containers/food/meat + ) + fruit = list("tomato" = 3, "eggplant" = 1) + result = /obj/item/reagent_containers/food/lasagna + +/datum/recipe/noel + items = list( + /obj/item/reagent_containers/food/chocolatebar, + /obj/item/reagent_containers/food/chocolatebar + ) + fruit = list("berries" = 2) + reagents = list( + /datum/reagent/nutriment/protein/egg = 6, + /datum/reagent/nutriment/flour = 15, + /datum/reagent/drink/milk = 5, + /datum/reagent/drink/milk/cream = 10 + ) + result = /obj/item/reagent_containers/food/sliceable/noel + +/datum/recipe/choccherrycake + items = list( + /obj/item/reagent_containers/food/chocolatebar, + /obj/item/reagent_containers/food/chocolatebar + ) + fruit = list("cherries" = 2) + reagents = list( + /datum/reagent/nutriment/protein/egg = 9, + /datum/reagent/nutriment/flour = 15, + /datum/reagent/drink/milk = 5 + ) + result = /obj/item/reagent_containers/food/sliceable/choccherrycake + +/datum/recipe/capturedevice_hacked + items = list( + /obj/item/capturedevice + ) + result = /obj/item/capturedevice/hacked diff --git a/code/modules/cooking/step_defines.dm b/code/modules/cooking/step_defines.dm new file mode 100644 index 00000000000..f4f35e35461 --- /dev/null +++ b/code/modules/cooking/step_defines.dm @@ -0,0 +1,105 @@ +//A step in a recipe, whether optional or required +/datum/cooking/recipe_step + var/unique_id //Special ID for a given recipe, allows for referencing later by food objects to save on memory. + + var/class = CWJ_USE_OTHER //The classificaiton of the step involved. + + var/group_identifier = "None" //Different for every type of recipe. + + var/image/tooltip_image = null + + var/parent_recipe //The parent recipe of this particular step. Created on initialization with New() + + var/desc //A description of the step + + var/custom_result_desc //A custom description of the resulting quality on a successful completion. + + var/list/optional_step_list = list() //List of optional steps that can be followed from this point forward. + + var/max_quality_award = 0 //The maximum quality awarded by following a given step to the letter. + + var/base_quality_award = 0 + + var/flags = 0 + + + //The next required step for the parent recipe + var/datum/cooking/recipe_step/next_step + + //The previous required step for the current recipe + var/datum/cooking/recipe_step/previous_step + + var/auto_complete_enabled = FALSE //If the step can be completed without any further input. + + + +/datum/cooking/recipe_step/New(datum/cooking/recipe/our_recipe) + parent_recipe = our_recipe + unique_id = sequential_id("recipe_step") + + if(!tooltip_image) + src.set_image() + + //Add the recipe to our dictionary for future reference. + if(!GLOB.cwj_step_dictionary_ordered["[class]"]) + GLOB.cwj_step_dictionary_ordered["[class]"] = list() + GLOB.cwj_step_dictionary_ordered["[class]"]["[unique_id]"] = src + GLOB.cwj_step_dictionary["[unique_id]"] = src + +/datum/cooking/recipe_step/proc/set_image() + tooltip_image = image('icons/emoji.dmi', icon_state="gear") + +//Calculate how well the recipe step was followed to the letter. +/datum/cooking/recipe_step/proc/calculate_quality(obj/added_item, obj/item/reagent_containers/vessel/cooking_container/container) + return 0 + +//Check if the conditions of a recipe step was followed correctly. +/datum/cooking/recipe_step/proc/check_conditions_met() + return CWJ_CHECK_VALID + +//Check if a given step is in the same option chain as another step. +/datum/cooking/recipe_step/proc/in_option_chain(datum/cooking/recipe_step/step) + if(!step) + return FALSE + if(!(flags & CWJ_IS_OPTION_CHAIN) || !(step.flags & CWJ_IS_OPTION_CHAIN)) + return FALSE + + var/datum/cooking/recipe_step/target_step = src.previous_step + //traverse backwards on the chain. + while(target_step && !(target_step & CWJ_IS_OPTION_CHAIN)) + if(step.unique_id == target_step.unique_id) + return TRUE + target_step = target_step.previous_step + + //Traverse forwards on the chain. + target_step = src.next_step + while(target_step && !(target_step & CWJ_IS_OPTION_CHAIN)) + if(step.unique_id == target_step.unique_id) + return TRUE + target_step = src.next_step + + //We didn't find anything. Return False. + return FALSE + +//Automatically clamps food based on their maximum and minimum quality, if they are set. +/datum/cooking/recipe_step/proc/clamp_quality(raw_quality) + if((flags & CWJ_BASE_QUALITY_ENABLED) && (flags & CWJ_MAX_QUALITY_ENABLED)) + return Clamp(raw_quality, base_quality_award, max_quality_award) + if(flags & CWJ_BASE_QUALITY_ENABLED) + return max(raw_quality, base_quality_award) + if(flags & CWJ_MAX_QUALITY_ENABLED) + return min(raw_quality, max_quality_award) + return raw_quality + +/datum/cooking/recipe_step/proc/get_step_result_text(obj/used_obj, step_quality) + if(custom_result_desc) + return custom_result_desc + else + return "skip" + +/datum/cooking/recipe_step/proc/follow_step(obj/added_item, obj/item/reagent_containers/vessel/cooking_container/container) + return CWJ_SUCCESS + +//Special function to check if the step has been satisfied. Sometimed just following the step is enough, but not always. +/datum/cooking/recipe_step/proc/is_complete(obj/added_item, datum/cooking/recipe_tracker/tracker) + return TRUE diff --git a/code/modules/cooking/step_types/add_item.dm b/code/modules/cooking/step_types/add_item.dm new file mode 100644 index 00000000000..eed0c2e3058 --- /dev/null +++ b/code/modules/cooking/step_types/add_item.dm @@ -0,0 +1,73 @@ +//A cooking step that involves adding an item to the food. Is based on Item Type. +//This basically deletes the food used on it. + +//ENSURE THE INCOMING ITEM HAS var/quality DEFINED! +/datum/cooking/recipe_step/add_item + class = CWJ_ADD_ITEM + + var/required_item_type //Item required for the recipe step + + var/inherited_quality_modifier = 1 //The modifier we apply multiplicatively to balance quality scaling across recipes. + + var/exact_path = FALSE //Tests if the item has to be the EXACT ITEM PATH, or just a child of the item path. + + var/reagent_skip = FALSE + + var/list/exclude_reagents = list() + +//item_type: The type path of the object we are looking for. +//our_recipe: The parent recipe object, +/datum/cooking/recipe_step/add_item/New(item_type, datum/cooking/recipe/our_recipe) + + #ifdef CWJ_DEBUG + if(!ispath(item_type, /obj/item)) + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] is not a valid path") + #endif + + var/obj/item/example_item = new item_type() + if(example_item) + desc = "Add \a [example_item] into the recipe." + + required_item_type = item_type + group_identifier = item_type + tooltip_image = image(example_item.icon, icon_state=example_item.icon_state) + QDEL_NULL(example_item) + #ifdef CWJ_DEBUG + else + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] couldn't be created.") + #endif + ..(our_recipe) + + +/datum/cooking/recipe_step/add_item/check_conditions_met(obj/added_item, datum/cooking/recipe_tracker/tracker) + #ifdef CWJ_DEBUG + log_debug("Called add_item/check_conditions_met for [added_item], checking against item type [required_item_type]. Exact_path = [exact_path]") + #endif + if(!istype(added_item, /obj/item)) + return CWJ_CHECK_INVALID + if(exact_path) + if(added_item.type == required_item_type) + return CWJ_CHECK_VALID + else + if(istype(added_item, required_item_type)) + return CWJ_CHECK_VALID + return CWJ_CHECK_INVALID + +//The quality of add_item is special, in that it inherits the quality level of its parent and +//passes it along. +//May need "Balancing" with var/inherited_quality_modifier +/datum/cooking/recipe_step/add_item/calculate_quality(obj/added_item, datum/cooking/recipe_tracker/tracker) + var/raw_quality = added_item?:food_quality * inherited_quality_modifier + return clamp_quality(raw_quality) + +/datum/cooking/recipe_step/add_item/follow_step(obj/added_item, datum/cooking/recipe_tracker/tracker) + #ifdef CWJ_DEBUG + log_debug("Called: /datum/cooking/recipe_step/add_item/follow_step") + #endif + var/obj/item/container = tracker.holder_ref.resolve() + if(container) + if(usr.can_unequip(added_item)) + usr.drop(added_item, container) + else + added_item.forceMove(container) + return CWJ_SUCCESS diff --git a/code/modules/cooking/step_types/add_produce.dm b/code/modules/cooking/step_types/add_produce.dm new file mode 100644 index 00000000000..c8122413f04 --- /dev/null +++ b/code/modules/cooking/step_types/add_produce.dm @@ -0,0 +1,64 @@ +//A cooking step that involves using SPECIFICALLY Grown foods +/datum/cooking/recipe_step/add_produce + class=CWJ_ADD_PRODUCE + var/required_produce_type + var/base_potency + var/reagent_skip = FALSE + var/inherited_quality_modifier + + var/list/exclude_reagents = list() + +/datum/cooking/recipe_step/add_produce/New(produce, datum/cooking/recipe/our_recipe) + if(!SSplants) + CRASH("/datum/cooking/recipe_step/add_produce/New: SSplants not initialized! Exiting.") + if(produce && SSplants && SSplants.seeds[produce]) + desc = "Add \a [produce] into the recipe." + required_produce_type = produce + group_identifier = produce + + //Get tooltip image for plants + var/datum/seed/seed = SSplants.seeds[produce] + var/icon_key = "fruit-[seed.get_trait(TRAIT_PRODUCT_ICON)]-[seed.get_trait(TRAIT_PRODUCT_COLOUR)]-[seed.get_trait(TRAIT_PLANT_COLOUR)]" + if(SSplants.plant_icon_cache[icon_key]) + tooltip_image = SSplants.plant_icon_cache[icon_key] + else + log_debug("[seed] is missing it's icon to add to tooltip_image") + base_potency = seed.get_trait(TRAIT_POTENCY) + else + CRASH("/datum/cooking/recipe_step/add_produce/New: Seed [produce] not found. Exiting.") + ..(base_quality_award, our_recipe) + +/datum/cooking/recipe_step/add_produce/check_conditions_met(obj/added_item, datum/cooking/recipe_tracker/tracker) + #ifdef CWJ_DEBUG + log_debug("Called add_produce/check_conditions_met for [added_item] against [required_produce_type]") + #endif + + if(!istype(added_item, /obj/item/reagent_containers/food/grown)) + return CWJ_CHECK_INVALID + + var/obj/item/reagent_containers/food/grown/added_produce = added_item + + if(added_produce.plantname == required_produce_type) + return CWJ_CHECK_VALID + + return CWJ_CHECK_INVALID + +/datum/cooking/recipe_step/add_produce/calculate_quality(obj/added_item, datum/cooking/recipe_tracker/tracker) + + var/obj/item/reagent_containers/food/grown/added_produce = added_item + + var/potency_raw = round(base_quality_award + (added_produce.potency - base_potency) * inherited_quality_modifier) + + return clamp_quality(potency_raw) + +/datum/cooking/recipe_step/add_produce/follow_step(obj/added_item, datum/cooking/recipe_tracker/tracker) + #ifdef CWJ_DEBUG + log_debug("Called: /datum/cooking/recipe_step/add_produce/follow_step") + #endif + var/obj/item/container = tracker.holder_ref.resolve() + if(container) + if(usr.can_unequip(added_item)) + usr.drop(added_item, container) + else + added_item.forceMove(container) + return CWJ_SUCCESS diff --git a/code/modules/cooking/step_types/add_reagent.dm b/code/modules/cooking/step_types/add_reagent.dm new file mode 100644 index 00000000000..0eed3adf0c7 --- /dev/null +++ b/code/modules/cooking/step_types/add_reagent.dm @@ -0,0 +1,83 @@ +//A cooking step that involves adding a reagent to the food. +/datum/cooking/recipe_step/add_reagent + class=CWJ_ADD_REAGENT + auto_complete_enabled = TRUE + var/expected_total + var/required_reagent_id + var/required_reagent_amount + var/remain_percent = 1 //What percentage of the reagent ends up in the product + +//reagent_id: The id of the required reagent to be added, E.G. 'salt'. +//amount: The amount of the required reagent that needs to be added. +//base_quality_award: The quality awarded by following this step. +//our_recipe: The parent recipe object, +/datum/cooking/recipe_step/add_reagent/New(reagent_id, amount, datum/cooking/recipe/our_recipe) + + var/datum/reagent/global_reagent = reagent_id + if(global_reagent) + desc = "Add [amount] unit[amount>1 ? "s" : ""] of [global_reagent.name]." + + required_reagent_id = reagent_id + group_identifier = reagent_id + + required_reagent_amount = amount + else + CRASH("/datum/cooking/recipe_step/add/reagent/New(): Reagent [reagent_id] not found. Recipe: [our_recipe]") + + ..(our_recipe) + + +/datum/cooking/recipe_step/add_reagent/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/container = tracker.holder_ref.resolve() + + + if((container.reagents.total_volume + required_reagent_amount - container.reagents.get_reagent_amount(required_reagent_id)) > container.reagents.maximum_volume) + return CWJ_CHECK_FULL + + if(!istype(used_item, /obj/item/reagent_containers)) + return CWJ_CHECK_INVALID + if(!(used_item.atom_flags & ATOM_FLAG_OPEN_CONTAINER)) + return CWJ_CHECK_INVALID + + var/obj/item/reagent_containers/our_item = used_item + if(our_item.amount_per_transfer_from_this <= 0) + return CWJ_CHECK_INVALID + if(our_item.reagents.total_volume == 0) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated in two areas. Here and /datum/cooking/recipe/proc/calculate_reagent_quality +/datum/cooking/recipe_step/add_reagent/calculate_quality(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/container = tracker.holder_ref.resolve() + var/data = container.reagents.get_data(required_reagent_id) + var/cooked_quality = 0 + if(data && istype(data, /list) && data["FOOD_QUALITY"]) + cooked_quality = data["FOOD_QUALITY"] + return cooked_quality + + +/datum/cooking/recipe_step/add_reagent/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/reagent_containers/our_item = used_item + var/obj/item/container = tracker.holder_ref.resolve() + + var/trans = our_item.reagents.trans_to_obj(container, our_item.amount_per_transfer_from_this) + + playsound(usr,'sound/effects/Liquid_transfer_mono.ogg',50,1) + to_chat(usr, SPAN_NOTICE("You transfer [trans] units to \the [container].")) + + return CWJ_SUCCESS + +/datum/cooking/recipe_step/add_reagent/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/reagent_containers/our_item = used_item + var/obj/item/container = tracker.holder_ref.resolve() + var/part = our_item.reagents.get_reagent_amount(required_reagent_id) / our_item.reagents.total_volume + + var/incoming_amount = max(0, min(our_item.amount_per_transfer_from_this, our_item.reagents.total_volume, container.reagents.get_free_space())) + + var/incoming_valid_amount = incoming_amount * part + + var/resulting_total = container.reagents.get_reagent_amount(required_reagent_id) + incoming_valid_amount + if(resulting_total >= required_reagent_amount) + return TRUE + return FALSE diff --git a/code/modules/cooking/step_types/recipe_start.dm b/code/modules/cooking/step_types/recipe_start.dm new file mode 100644 index 00000000000..2acfc32537f --- /dev/null +++ b/code/modules/cooking/step_types/recipe_start.dm @@ -0,0 +1,9 @@ +//The default starting step. +//Doesn't do anything, just holds the item. + +/datum/cooking/recipe_step/start + class = CWJ_START + var/required_container + +/datum/cooking/recipe_step/start/New(container) + required_container = container diff --git a/code/modules/cooking/step_types/use_grill.dm b/code/modules/cooking/step_types/use_grill.dm new file mode 100644 index 00000000000..a32e0cb9260 --- /dev/null +++ b/code/modules/cooking/step_types/use_grill.dm @@ -0,0 +1,66 @@ +//A cooking step that involves adding a reagent to the food. +/datum/cooking/recipe_step/use_grill + class=CWJ_USE_GRILL + auto_complete_enabled = TRUE + var/time + var/heat + +//reagent_id: The id of the required reagent to be added, E.G. 'salt'. +//amount: The amount of the required reagent that needs to be added. +//base_quality_award: The quality awarded by following this step. +//our_recipe: The parent recipe object, +/datum/cooking/recipe_step/use_grill/New(set_heat, set_time, datum/cooking/recipe/our_recipe) + + + + time = set_time + heat = set_heat + + desc = "Cook on a grill set to [heat] for [ticks_to_text(time)]." + + ..(our_recipe) + + +/datum/cooking/recipe_step/use_grill/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) + + if(!istype(used_item, /obj/machinery/kitchen/grill)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated prior to object creation +/datum/cooking/recipe_step/use_grill/calculate_quality(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() + + var/obj/machinery/kitchen/grill/our_grill = used_item + + + var/bad_cooking = 0 + for (var/key in container.grill_data) + if (heat != key) + bad_cooking += container.grill_data[key] + + bad_cooking = round(bad_cooking/(5 SECONDS)) + + var/good_cooking = round(time/(3 SECONDS)) - bad_cooking + our_grill.quality_mod + + return clamp_quality(good_cooking) + + +/datum/cooking/recipe_step/use_grill/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) + return CWJ_SUCCESS + +/datum/cooking/recipe_step/use_grill/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) + + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() + + if(container.grill_data[heat] >= time) + #ifdef CWJ_DEBUG + log_debug("use_grill/is_complete() Returned True; comparing [heat]: [container.grill_data[heat]] to [time]") + #endif + return TRUE + + #ifdef CWJ_DEBUG + log_debug("use_grill/is_complete() Returned False; comparing [heat]: [container.grill_data[heat]] to [time]") + #endif + return FALSE diff --git a/code/modules/cooking/step_types/use_item.dm b/code/modules/cooking/step_types/use_item.dm new file mode 100644 index 00000000000..42e7bf65c9f --- /dev/null +++ b/code/modules/cooking/step_types/use_item.dm @@ -0,0 +1,42 @@ +//A cooking step that involves using an item on the food. +/datum/cooking/recipe_step/use_item + class=CWJ_USE_ITEM + var/required_item_type + var/exact_path = FALSE //Tests if the item has to be the EXACT ITEM PATH, or just a child of the item path. + +//item_type: The type path of the object we are looking for. +//base_quality_award: The quality awarded by following this step. +//our_recipe: The parent recipe object +/datum/cooking/recipe_step/use_item/New(item_type, datum/cooking/recipe/our_recipe) + #ifdef CWJ_DEBUG + if(!ispath(item_type)) + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] is not a valid path") + #endif + + var/example_item = new item_type() + if(example_item) + desc = "Apply \a [example_item]." + + required_item_type = item_type + group_identifier = item_type + + QDEL_NULL(example_item) + #ifdef CWJ_DEBUG + else + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] couldn't be created.") + #endif + ..(our_recipe) + + +/datum/cooking/recipe_step/use_item/check_conditions_met(obj/added_item, datum/cooking/recipe_tracker/tracker) + if(src.exact_path) + if(added_item.type == required_item_type) + return CWJ_CHECK_VALID + else + if(istype(added_item,required_item_type)) + return CWJ_CHECK_VALID + return CWJ_CHECK_INVALID + +//Think about a way to make this more intuitive? +/datum/cooking/recipe_step/use_item/calculate_quality(obj/added_item) + return clamp_quality(0) diff --git a/code/modules/cooking/step_types/use_oven.dm b/code/modules/cooking/step_types/use_oven.dm new file mode 100644 index 00000000000..2c588f61d6f --- /dev/null +++ b/code/modules/cooking/step_types/use_oven.dm @@ -0,0 +1,65 @@ +//A cooking step that involves adding a reagent to the food. +/datum/cooking/recipe_step/use_oven + class=CWJ_USE_OVEN + auto_complete_enabled = TRUE + var/time + var/heat + +//set_heat: The temperature the oven must bake at. +//set_time: How long something must be baked in the overn +//our_recipe: The parent recipe object +/datum/cooking/recipe_step/use_oven/New(set_heat, set_time, datum/cooking/recipe/our_recipe) + + + + time = set_time + heat = set_heat + + desc = "Cook in an oven set to [heat] for [ticks_to_text(time)]." + + ..(our_recipe) + + +/datum/cooking/recipe_step/use_oven/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) + + if(!istype(used_item, /obj/machinery/kitchen/oven)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated prior to object creation +/datum/cooking/recipe_step/use_oven/calculate_quality(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() + + var/obj/machinery/kitchen/oven/our_oven = used_item + + + var/bad_cooking = 0 + for (var/key in container.oven_data) + if (heat != key) + bad_cooking += container.oven_data[key] + + bad_cooking = round(bad_cooking/(5 SECONDS)) + + var/good_cooking = round(time/(3 SECONDS)) - bad_cooking + our_oven.quality_mod + + return clamp_quality(good_cooking) + + +/datum/cooking/recipe_step/use_oven/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) + return CWJ_SUCCESS + +/datum/cooking/recipe_step/use_oven/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) + + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() + + if(container.oven_data[heat] >= time) + #ifdef CWJ_DEBUG + log_debug("use_oven/is_complete() Returned True; comparing [heat]: [container.oven_data[heat]] to [time]") + #endif + return TRUE + + #ifdef CWJ_DEBUG + log_debug("use_oven/is_complete() Returned False; comparing [heat]: [container.oven_data[heat]] to [time]") + #endif + return FALSE diff --git a/code/modules/cooking/step_types/use_stove.dm b/code/modules/cooking/step_types/use_stove.dm new file mode 100644 index 00000000000..edf931ac607 --- /dev/null +++ b/code/modules/cooking/step_types/use_stove.dm @@ -0,0 +1,65 @@ +//A cooking step that involves adding a reagent to the food. +/datum/cooking/recipe_step/use_stove + class=CWJ_USE_STOVE + auto_complete_enabled = TRUE + var/time + var/heat + +//set_heat: The temperature the stove must cook at. +//set_time: How long something must be cook in the stove +//our_recipe: The parent recipe object +/datum/cooking/recipe_step/use_stove/New(set_heat, set_time, datum/cooking/recipe/our_recipe) + + + + time = set_time + heat = set_heat + + desc = "Cook on a stove set to [heat] for [ticks_to_text(time)]." + + ..(our_recipe) + + +/datum/cooking/recipe_step/use_stove/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) + + if(!istype(used_item, /obj/machinery/kitchen/stove)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated prior to object creation +/datum/cooking/recipe_step/use_stove/calculate_quality(obj/used_item, datum/cooking/recipe_tracker/tracker) + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() + + var/obj/machinery/kitchen/stove/our_stove = used_item + + + var/bad_cooking = 0 + for (var/key in container.stove_data) + if (heat != key) + bad_cooking += container.stove_data[key] + + bad_cooking = round(bad_cooking/(5 SECONDS)) + + var/good_cooking = round(time/(3 SECONDS)) - bad_cooking + our_stove.quality_mod + + return clamp_quality(good_cooking) + + +/datum/cooking/recipe_step/use_stove/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) + return CWJ_SUCCESS + +/datum/cooking/recipe_step/use_stove/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) + + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() + + if(container.stove_data[heat] >= time) + #ifdef CWJ_DEBUG + log_debug("use_stove/is_complete() Returned True; comparing [heat]: [container.stove_data[heat]] to [time]") + #endif + return TRUE + + #ifdef CWJ_DEBUG + log_debug("use_stove/is_complete() Returned False; comparing [heat]: [container.stove_data[heat]] to [time]") + #endif + return FALSE diff --git a/code/modules/cooking/step_types/use_tool.dm b/code/modules/cooking/step_types/use_tool.dm new file mode 100644 index 00000000000..b4d458c83e6 --- /dev/null +++ b/code/modules/cooking/step_types/use_tool.dm @@ -0,0 +1,65 @@ +//A cooking step that involves using an item on the food. +var/list/hammering_tools = list( + /obj/item/pickaxe/sledgehammer, + /obj/item/shovel, + /obj/item/wrench, + /obj/item/storage/toolbox, + ) + +/datum/cooking/recipe_step/use_tool + class=CWJ_USE_ITEM + var/tool_type + var/tool_quality + var/inherited_quality_modifier = 0.1 + + +//item_type: The type path of the object we are looking for. +//base_quality_award: The quality awarded by following this step. +//our_recipe: The parent recipe object +/datum/cooking/recipe_step/use_tool/New(type, quality, datum/cooking/recipe/our_recipe) + + desc = "Use \a [type] tool of quality [quality] or higher." + + tool_type = type + tool_quality = quality + + ..(our_recipe) + + +/datum/cooking/recipe_step/use_tool/check_conditions_met(obj/added_item, datum/cooking/recipe_tracker/tracker) + if(!istype(added_item, /obj/item )) + return CWJ_CHECK_INVALID + + var/obj/item/our_tool = added_item + // REVIEW make tool quality list + switch(tool_type) + if(QUALITY_CUTTING) + if(!has_edge(our_tool)) + return CWJ_CHECK_INVALID + if(QUALITY_HAMMERING) + if(!is_type_in_list(our_tool, hammering_tools)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +/datum/cooking/recipe_step/use_tool/follow_step(obj/added_item, obj/item/reagent_containers/vessel/cooking_container/container) + var/obj/item/our_tool = added_item + if(our_tool.tool_sound) + playsound(usr.loc, our_tool.tool_sound, 50, 1) + to_chat(usr, SPAN_NOTICE("You use the [added_item] according to the recipe.")) + + /*REVIEW - No tool quality so comment that shit + if(our_tool.get_tool_quality(tool_type) < tool_quality) + return to_chat(usr, SPAN_NOTICE("The low quality of the tool hurts the quality of the dish.")) + */ + + return CWJ_SUCCESS + +//Think about a way to make this more intuitive? +/datum/cooking/recipe_step/use_tool/calculate_quality(obj/added_item) + /*REVIEW - No tool quality so comment that shit + var/obj/item/our_tool = added_item + var/raw_quality = (our_tool.get_tool_quality(tool_type) - tool_quality) * inherited_quality_modifier + */ + var/raw_quality = tool_quality * inherited_quality_modifier + return clamp_quality(raw_quality) diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 5508c7a5286..e69de29bb2d 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -1,1297 +0,0 @@ - -// see code/datums/recipe.dm - - -/* No telebacon. just no... -/datum/recipe/telebacon - items = list( - /obj/item/reagent_containers/food/meat, - /obj/item/device/assembly/signaler - ) - result = /obj/item/reagent_containers/food/telebacon - -I said no! -/datum/recipe/syntitelebacon - items = list( - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/device/assembly/signaler - ) - result = /obj/item/reagent_containers/food/telebacon -*/ - -/datum/recipe/friedegg - reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) - items = list( - /obj/item/reagent_containers/food/egg - ) - result = /obj/item/reagent_containers/food/friedegg - -/datum/recipe/boiledegg - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/egg - ) - result = /obj/item/reagent_containers/food/boiledegg - -/datum/recipe/dionaroast - fruit = list("apple" = 1) - reagents = list(/datum/reagent/acid/polyacid = 5) //It dissolves the carapace. Still poisonous, though. - items = list(/obj/item/holder/diona) - result = /obj/item/reagent_containers/food/dionaroast - -/datum/recipe/classichotdog - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/holder/corgi - ) - result = /obj/item/reagent_containers/food/classichotdog - -/datum/recipe/jellydonut - reagents = list(/datum/reagent/drink/juice/berry = 5, /datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/donut/jelly - -/datum/recipe/jellydonut/metroid - reagents = list(/datum/reagent/metroidjelly = 5, /datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/donut/metroidjelly - -/datum/recipe/jellydonut/cherry - reagents = list(/datum/reagent/nutriment/cherryjelly = 5, /datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/donut/cherryjelly - -/datum/recipe/donut - reagents = list(/datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/donut/normal - -/datum/recipe/plainburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/meat - ) - result = /obj/item/reagent_containers/food/plainburger - -/datum/recipe/brainburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/organ/brain - ) - result = /obj/item/reagent_containers/food/brainburger - -/datum/recipe/roburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/robot_parts/head - ) - result = /obj/item/reagent_containers/food/roburger - -/datum/recipe/xenoburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/meat/xeno - ) - result = /obj/item/reagent_containers/food/xenoburger - -/datum/recipe/fishburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/carpmeat - ) - result = /obj/item/reagent_containers/food/fishburger - -/datum/recipe/tofuburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/tofu - ) - result = /obj/item/reagent_containers/food/tofuburger - -/datum/recipe/ghostburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/ectoplasm //where do you even find this stuff - ) - result = /obj/item/reagent_containers/food/ghostburger - -/datum/recipe/clownburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/clothing/mask/gas/clown_hat - ) - result = /obj/item/reagent_containers/food/clownburger - -/datum/recipe/mimeburger - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/clothing/head/beret - ) - result = /obj/item/reagent_containers/food/mimeburger - -/datum/recipe/bunbun - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/bun - ) - result = /obj/item/reagent_containers/food/bunbun - -/datum/recipe/hotdog - items = list( - /obj/item/reagent_containers/food/bun, - /obj/item/reagent_containers/food/sausage - ) - result = /obj/item/reagent_containers/food/hotdog - -/datum/recipe/waffles - reagents = list(/datum/reagent/sugar = 10) - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/waffles - -/datum/recipe/pancakes - fruit = list("blueberries" = 2) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/sliceable/flatdough - ) - result = /obj/item/reagent_containers/food/pancakes - -/datum/recipe/donkpocket - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/faggot - ) - result = /obj/item/reagent_containers/food/donkpocket //SPECIAL - proc/warm_up(obj/item/reagent_containers/food/donkpocket/being_cooked) - being_cooked.heat() - make_food(obj/container as obj) - var/obj/item/reagent_containers/food/donkpocket/being_cooked = ..(container) - warm_up(being_cooked) - return being_cooked - -/datum/recipe/donkpocket/warm - reagents = list() //This is necessary since this is a child object of the above recipe and we don't want donk pockets to need flour - items = list( - /obj/item/reagent_containers/food/donkpocket - ) - result = /obj/item/reagent_containers/food/donkpocket //SPECIAL - make_food(obj/container as obj) - var/obj/item/reagent_containers/food/donkpocket/being_cooked = locate() in container - if(being_cooked && !being_cooked.warm) - warm_up(being_cooked) - return being_cooked - -/datum/recipe/meatbread - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/sliceable/meatbread - -/datum/recipe/syntibread - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/sliceable/meatbread - -/datum/recipe/xenomeatbread - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/meat/xeno, - /obj/item/reagent_containers/food/meat/xeno, - /obj/item/reagent_containers/food/meat/xeno, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/sliceable/xenomeatbread - -/datum/recipe/bananabread - fruit = list("banana" = 1) - reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 15) - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/sliceable/bananabread - -/datum/recipe/omelette - items = list( - /obj/item/reagent_containers/food/egg, - /obj/item/reagent_containers/food/egg, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/omelette - -/datum/recipe/muffin - reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough, - ) - result = /obj/item/reagent_containers/food/muffin - -/datum/recipe/eggplantparm - fruit = list("eggplant" = 1) - items = list( - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/eggplantparm - -/datum/recipe/soylenviridians - fruit = list("soybeans" = 1) - reagents = list(/datum/reagent/nutriment/flour = 10) - result = /obj/item/reagent_containers/food/soylenviridians - -/datum/recipe/soylentgreen - reagents = list(/datum/reagent/nutriment/flour = 10) - items = list( - /obj/item/reagent_containers/food/meat/human, - /obj/item/reagent_containers/food/meat/human - ) - result = /obj/item/reagent_containers/food/soylentgreen - -/datum/recipe/meatpie - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/meat, - ) - result = /obj/item/reagent_containers/food/meatpie - -/datum/recipe/tofupie - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/tofu, - ) - result = /obj/item/reagent_containers/food/tofupie - -/datum/recipe/xemeatpie - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/meat/xeno, - ) - result = /obj/item/reagent_containers/food/xemeatpie - -/datum/recipe/pie - fruit = list("banana" = 1) - reagents = list(/datum/reagent/sugar = 5) - items = list(/obj/item/reagent_containers/food/sliceable/flatdough) - result = /obj/item/reagent_containers/food/pie - -/datum/recipe/cherrypie - fruit = list("cherries" = 1) - reagents = list(/datum/reagent/sugar = 10) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - ) - result = /obj/item/reagent_containers/food/cherrypie - -/datum/recipe/berryclafoutis - fruit = list("berries" = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - ) - result = /obj/item/reagent_containers/food/berryclafoutis - -/datum/recipe/wingfangchu - reagents = list(/datum/reagent/nutriment/soysauce = 5) - items = list( - /obj/item/reagent_containers/food/meat/xeno, - ) - result = /obj/item/reagent_containers/food/wingfangchu - -/datum/recipe/chaosdonut - reagents = list(/datum/reagent/frostoil = 5, /datum/reagent/capsaicin = 5, /datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/donut/chaos - -/datum/recipe/meatkabob - items = list( - /obj/item/stack/rods, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - ) - result = /obj/item/reagent_containers/food/meatkabob - -/datum/recipe/tofukabob - items = list( - /obj/item/stack/rods, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/tofu, - ) - result = /obj/item/reagent_containers/food/tofukabob - -/datum/recipe/tofubread - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/sliceable/tofubread - -/datum/recipe/loadedbakedpotato - fruit = list("potato" = 1) - items = list(/obj/item/reagent_containers/food/cheesewedge) - result = /obj/item/reagent_containers/food/loadedbakedpotato - -/datum/recipe/cheesyfries - items = list( - /obj/item/reagent_containers/food/fries, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/cheesyfries - -/datum/recipe/cubancarp - fruit = list("chili" = 1) - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/carpmeat - ) - result = /obj/item/reagent_containers/food/cubancarp - -/datum/recipe/popcorn - reagents = list(/datum/reagent/sodiumchloride = 5) - fruit = list("corn" = 1) - result = /obj/item/reagent_containers/food/popcorn - -/datum/recipe/cookie - reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/chocolatebar, - ) - result = /obj/item/reagent_containers/food/cookie - -/datum/recipe/fortunecookie - reagents = list(/datum/reagent/sugar = 5) - items = list( - /obj/item/reagent_containers/food/doughslice, - /obj/item/paper, - ) - result = /obj/item/reagent_containers/food/fortunecookie - -/datum/recipe/fortunecookie/make_food(obj/container) - var/obj/item/paper/paper = locate() in container - paper.forceMove(null) //prevent deletion - var/obj/item/reagent_containers/food/fortunecookie/being_cooked = ..(container) - paper.forceMove(being_cooked) - being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn - return being_cooked - -/datum/recipe/fortunecookie/check_items(obj/container) - . = ..() - if(.) - var/obj/item/paper/paper = locate() in container - if(!paper || !paper.info) - return 0 - return . - -/datum/recipe/meatsteak - reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) - items = list(/obj/item/reagent_containers/food/meat) - result = /obj/item/reagent_containers/food/meatsteak - -/datum/recipe/loadedsteak - reagents = list(/datum/reagent/nutriment/garlicsauce = 5) - fruit = list("onion" = 1, "mushroom" = 1) - items = list(/obj/item/reagent_containers/food/meat) - result = /obj/item/reagent_containers/food/loadedsteak - -/datum/recipe/syntisteak - reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) - items = list(/obj/item/reagent_containers/food/meat/syntiflesh) - result = /obj/item/reagent_containers/food/meatsteak - -/datum/recipe/porkchop - reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) - items = list(/obj/item/reagent_containers/food/meat/pork) - result = /obj/item/reagent_containers/food/porkchop - -/datum/recipe/pizzamargherita - fruit = list("tomato" = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/sliceable/pizza/margherita - -/datum/recipe/meatpizza - fruit = list("tomato" = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/sliceable/pizza/meatpizza - -/datum/recipe/syntipizza - fruit = list("tomato" = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/reagent_containers/food/meat/syntiflesh, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/sliceable/pizza/meatpizza - -/datum/recipe/mushroompizza - fruit = list("mushroom" = 5, "tomato" = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/sliceable/pizza/mushroompizza - -/datum/recipe/vegetablepizza - fruit = list("eggplant" = 1, "carrot" = 1, "corn" = 1, "tomato" = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/sliceable/pizza/vegetablepizza - -/datum/recipe/spacylibertyduff - reagents = list(/datum/reagent/water = 5, /datum/reagent/ethanol/vodka = 5, /datum/reagent/psilocybin = 5) - result = /obj/item/reagent_containers/food/spacylibertyduff - -/datum/recipe/amanitajelly - reagents = list(/datum/reagent/water = 5, /datum/reagent/ethanol/vodka = 5, /datum/reagent/toxin/amatoxin = 5) - result = /obj/item/reagent_containers/food/amanitajelly - make_food(obj/container as obj) - var/obj/item/reagent_containers/food/amanitajelly/being_cooked = ..(container) - being_cooked.reagents.del_reagent(/datum/reagent/toxin/amatoxin) - return being_cooked - -/datum/recipe/faggotsoup - fruit = list("carrot" = 1, "potato" = 1) - reagents = list(/datum/reagent/water = 10) - items = list(/obj/item/reagent_containers/food/faggot) - result = /obj/item/reagent_containers/food/faggotsoup - -/datum/recipe/fathersoup - fruit = list("garlic" = 1, "flamechili" = 1, "tomato" = 1) - reagents = list(/datum/reagent/nutriment/flour = 10, /datum/reagent/blackpepper = 5) - items = list(/obj/item/reagent_containers/food/tomatosoup) - result = /obj/item/reagent_containers/food/fathersoup - -/datum/recipe/vegetablesoup - fruit = list("carrot" = 1, "potato" = 1, "corn" = 1, "eggplant" = 1) - reagents = list(/datum/reagent/water = 10) - result = /obj/item/reagent_containers/food/vegetablesoup - -/datum/recipe/nettlesoup - fruit = list("nettle" = 1, "potato" = 1) - reagents = list(/datum/reagent/water = 10) - items = list( - /obj/item/reagent_containers/food/egg - ) - result = /obj/item/reagent_containers/food/nettlesoup - -/datum/recipe/wishsoup - reagents = list(/datum/reagent/water = 20) - result= /obj/item/reagent_containers/food/wishsoup - -/datum/recipe/hotchili - fruit = list("chili" = 1, "tomato" = 1) - items = list(/obj/item/reagent_containers/food/meat) - result = /obj/item/reagent_containers/food/hotchili - -/datum/recipe/coldchili - fruit = list("icechili" = 1, "tomato" = 1) - items = list(/obj/item/reagent_containers/food/meat) - result = /obj/item/reagent_containers/food/coldchili - -/datum/recipe/amanita_pie - reagents = list(/datum/reagent/toxin/amatoxin = 5) - items = list(/obj/item/reagent_containers/food/sliceable/flatdough) - result = /obj/item/reagent_containers/food/amanita_pie - -/datum/recipe/plump_pie - fruit = list("plumphelmet" = 1) - items = list(/obj/item/reagent_containers/food/sliceable/flatdough) - result = /obj/item/reagent_containers/food/plump_pie - -/datum/recipe/spellburger - items = list( - /obj/item/reagent_containers/food/plainburger, - /obj/item/clothing/head/wizard/fake, - ) - result = /obj/item/reagent_containers/food/spellburger - -/datum/recipe/spellburger - items = list( - /obj/item/reagent_containers/food/plainburger, - /obj/item/clothing/head/wizard, - ) - result = /obj/item/reagent_containers/food/spellburger - -/datum/recipe/bigbiteburger - items = list( - /obj/item/reagent_containers/food/plainburger, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/egg, - ) - result = /obj/item/reagent_containers/food/bigbiteburger - -/datum/recipe/enchiladas - fruit = list("chili" = 2, "corn" = 1) - items = list(/obj/item/reagent_containers/food/cutlet) - result = /obj/item/reagent_containers/food/enchiladas - -/datum/recipe/creamcheesebread - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/sliceable/creamcheesebread - -/datum/recipe/monkeysdelight - fruit = list("banana" = 1) - reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1, /datum/reagent/nutriment/flour = 10) - items = list(/obj/item/reagent_containers/food/monkeycube) - result = /obj/item/reagent_containers/food/monkeysdelight - -/datum/recipe/baguette - reagents = list(/datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - ) - result = /obj/item/reagent_containers/food/baguette - -/datum/recipe/fishandchips - items = list( - /obj/item/reagent_containers/food/fries, - /obj/item/reagent_containers/food/carpmeat, - ) - result = /obj/item/reagent_containers/food/fishandchips - -/datum/recipe/bread - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/egg - ) - result = /obj/item/reagent_containers/food/sliceable/bread - -/datum/recipe/sandwich - items = list( - /obj/item/reagent_containers/food/meatsteak, - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/sandwich - -/datum/recipe/pelmeni - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/pelmeni, - ) - result = /obj/item/reagent_containers/food/boiledpelmeni - -/datum/recipe/toastedsandwich - items = list( - /obj/item/reagent_containers/food/sandwich - ) - result = /obj/item/reagent_containers/food/toastedsandwich - -/datum/recipe/grilledcheese - items = list( - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/grilledcheese - -/datum/recipe/tomatosoup - fruit = list("tomato" = 2) - reagents = list(/datum/reagent/water = 10) - result = /obj/item/reagent_containers/food/tomatosoup - -/datum/recipe/rofflewaffles - reagents = list(/datum/reagent/psilocybin = 5, /datum/reagent/sugar = 10) - items = list( - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/dough, - ) - result = /obj/item/reagent_containers/food/rofflewaffles - -/datum/recipe/stew - fruit = list("potato" = 1, "tomato" = 1, "carrot" = 1, "eggplant" = 1, "mushroom" = 1) - reagents = list(/datum/reagent/water = 10) - items = list(/obj/item/reagent_containers/food/meat) - result = /obj/item/reagent_containers/food/stew - -/datum/recipe/metroidtoast - reagents = list(/datum/reagent/metroidjelly = 5) - items = list( - /obj/item/reagent_containers/food/slice/bread, - ) - result = /obj/item/reagent_containers/food/jelliedtoast/metroid - -/datum/recipe/jelliedtoast - reagents = list(/datum/reagent/nutriment/cherryjelly = 5) - items = list( - /obj/item/reagent_containers/food/slice/bread, - ) - result = /obj/item/reagent_containers/food/jelliedtoast/cherry - -/datum/recipe/milosoup - reagents = list(/datum/reagent/water = 10) - items = list( - /obj/item/reagent_containers/food/soydope, - /obj/item/reagent_containers/food/soydope, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/tofu, - ) - result = /obj/item/reagent_containers/food/milosoup - -/datum/recipe/stewedsoymeat - fruit = list("carrot" = 1, "tomato" = 1) - items = list( - /obj/item/reagent_containers/food/soydope, - /obj/item/reagent_containers/food/soydope - ) - result = /obj/item/reagent_containers/food/stewedsoymeat - -/*/datum/recipe/spagetti We have the processor now - items = list( - /obj/item/reagent_containers/food/doughslice - ) - result= /obj/item/reagent_containers/food/spagetti*/ - -/datum/recipe/boiledspagetti - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/spagetti, - ) - result = /obj/item/reagent_containers/food/boiledspagetti - -/datum/recipe/boiledrice - reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/rice = 10) - result = /obj/item/reagent_containers/food/boiledrice - -/datum/recipe/ricepudding - reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/rice = 10) - result = /obj/item/reagent_containers/food/ricepudding - -/datum/recipe/pastatomato - fruit = list("tomato" = 2) - reagents = list(/datum/reagent/water = 5) - items = list(/obj/item/reagent_containers/food/spagetti) - result = /obj/item/reagent_containers/food/pastatomato - -/datum/recipe/poppypretzel - fruit = list("poppy" = 1) - items = list(/obj/item/reagent_containers/food/dough) - result = /obj/item/reagent_containers/food/poppypretzel - -/datum/recipe/faggotspagetti - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/spagetti, - /obj/item/reagent_containers/food/faggot, - /obj/item/reagent_containers/food/faggot, - ) - result = /obj/item/reagent_containers/food/faggotspagetti - -/datum/recipe/spesslaw - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/spagetti, - /obj/item/reagent_containers/food/faggot, - /obj/item/reagent_containers/food/faggot, - /obj/item/reagent_containers/food/faggot, - /obj/item/reagent_containers/food/faggot, - ) - result = /obj/item/reagent_containers/food/spesslaw - -/datum/recipe/superbiteburger - fruit = list("tomato" = 1) - reagents = list(/datum/reagent/sodiumchloride = 5, /datum/reagent/blackpepper = 5) - items = list( - /obj/item/reagent_containers/food/bigbiteburger, - /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/boiledegg, - ) - result = /obj/item/reagent_containers/food/superbiteburger - -/datum/recipe/candiedapple - fruit = list("apple" = 1) - reagents = list(/datum/reagent/water = 5, /datum/reagent/sugar = 5) - result = /obj/item/reagent_containers/food/candiedapple - -/datum/recipe/applepie - fruit = list("apple" = 1) - items = list(/obj/item/reagent_containers/food/sliceable/flatdough) - result = /obj/item/reagent_containers/food/applepie - -/datum/recipe/metroidburger - reagents = list(/datum/reagent/metroidjelly = 5) - items = list( - /obj/item/reagent_containers/food/bun - ) - result = /obj/item/reagent_containers/food/jellyburger/metroid - -/datum/recipe/jellyburger - reagents = list(/datum/reagent/nutriment/cherryjelly = 5) - items = list( - /obj/item/reagent_containers/food/bun - ) - result = /obj/item/reagent_containers/food/jellyburger/cherry - -/datum/recipe/twobread - reagents = list(/datum/reagent/ethanol/wine = 5) - items = list( - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/slice/bread, - ) - result = /obj/item/reagent_containers/food/twobread - -/datum/recipe/threebread - items = list( - /obj/item/reagent_containers/food/twobread, - /obj/item/reagent_containers/food/slice/bread, - ) - result = /obj/item/reagent_containers/food/threebread - -/datum/recipe/metroidsandwich - reagents = list(/datum/reagent/metroidjelly = 5) - items = list( - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/slice/bread, - ) - result = /obj/item/reagent_containers/food/jellysandwich/metroid - -/datum/recipe/cherrysandwich - reagents = list(/datum/reagent/nutriment/cherryjelly = 5) - items = list( - /obj/item/reagent_containers/food/slice/bread, - /obj/item/reagent_containers/food/slice/bread, - ) - result = /obj/item/reagent_containers/food/jellysandwich/cherry - -/datum/recipe/bloodsoup - reagents = list(/datum/reagent/blood = 30) - result = /obj/item/reagent_containers/food/bloodsoup - -/datum/recipe/metroidsoup - reagents = list(/datum/reagent/water = 10, /datum/reagent/metroidjelly = 5) - items = list() - result = /obj/item/reagent_containers/food/metroidsoup - -/datum/recipe/boiledmetroidextract - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/metroid_extract, - ) - result = /obj/item/reagent_containers/food/boiledmetroidcore - -/datum/recipe/chocolateegg - items = list( - /obj/item/reagent_containers/food/egg, - /obj/item/reagent_containers/food/chocolatebar, - ) - result = /obj/item/reagent_containers/food/chocolateegg - -/datum/recipe/sausage - items = list( - /obj/item/reagent_containers/food/faggot, - /obj/item/reagent_containers/food/cutlet, - ) - result = /obj/item/reagent_containers/food/sausage - -/datum/recipe/fishfingers - reagents = list(/datum/reagent/nutriment/flour = 10) - items = list( - /obj/item/reagent_containers/food/egg, - /obj/item/reagent_containers/food/carpmeat, - ) - result = /obj/item/reagent_containers/food/fishfingers - -/datum/recipe/mysterysoup - reagents = list(/datum/reagent/water = 10) - items = list( - /obj/item/reagent_containers/food/badrecipe, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/egg, - /obj/item/reagent_containers/food/cheesewedge, - ) - result = /obj/item/reagent_containers/food/mysterysoup - -/datum/recipe/pumpkinpie - fruit = list("pumpkin" = 1) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/sugar = 5, - /datum/reagent/nutriment/protein/egg = 3, - /datum/reagent/nutriment/flour = 10 - ) - result = /obj/item/reagent_containers/food/sliceable/pumpkinpie - -/datum/recipe/plumphelmetbiscuit - fruit = list("plumphelmet" = 1) - reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/flour = 5) - result = /obj/item/reagent_containers/food/plumphelmetbiscuit - -/datum/recipe/mushroomsoup - fruit = list("mushroom" = 1) - reagents = list(/datum/reagent/drink/milk = 10) - result = /obj/item/reagent_containers/food/mushroomsoup - -/datum/recipe/chawanmushi - fruit = list("mushroom" = 1) - reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/soysauce = 5) - items = list( - /obj/item/reagent_containers/food/egg, - /obj/item/reagent_containers/food/egg - ) - result = /obj/item/reagent_containers/food/chawanmushi - -/datum/recipe/beetsoup - fruit = list("whitebeet" = 1, "cabbage" = 1) - reagents = list(/datum/reagent/water = 10) - result = /obj/item/reagent_containers/food/beetsoup - -/datum/recipe/appletart - fruit = list("goldapple" = 1) - reagents = list(/datum/reagent/sugar = 5, /datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 10) - items = list( - /obj/item/reagent_containers/food/egg - ) - result = /obj/item/reagent_containers/food/appletart - -/datum/recipe/tossedsalad - fruit = list("cabbage" = 2, "tomato" = 1, "carrot" = 1, "apple" = 1) - result = /obj/item/reagent_containers/food/tossedsalad - -/datum/recipe/aesirsalad - fruit = list("goldapple" = 1, "ambrosiadeus" = 1) - result = /obj/item/reagent_containers/food/aesirsalad - -/datum/recipe/validsalad - fruit = list("potato" = 1, "ambrosia" = 3) - items = list(/obj/item/reagent_containers/food/faggot) - result = /obj/item/reagent_containers/food/validsalad - make_food(obj/container as obj) - var/obj/item/reagent_containers/food/validsalad/being_cooked = ..(container) - being_cooked.reagents.del_reagent(/datum/reagent/toxin) - return being_cooked - -/datum/recipe/cracker - reagents = list(/datum/reagent/sodiumchloride = 1) - items = list( - /obj/item/reagent_containers/food/doughslice - ) - result = /obj/item/reagent_containers/food/cracker - -/datum/recipe/stuffing - reagents = list(/datum/reagent/water = 5, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) - items = list( - /obj/item/reagent_containers/food/sliceable/bread, - ) - result = /obj/item/reagent_containers/food/stuffing - -/datum/recipe/tofurkey - items = list( - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/tofu, - /obj/item/reagent_containers/food/stuffing, - ) - result = /obj/item/reagent_containers/food/tofurkey - -// Fuck Science! -/datum/recipe/ruinedvirusdish - items = list( - /obj/item/virusdish - ) - result = /obj/item/ruinedvirusdish - -////////////////////////////////////////// -// bs12 food port stuff -////////////////////////////////////////// - -/datum/recipe/taco - items = list( - /obj/item/reagent_containers/food/doughslice, - /obj/item/reagent_containers/food/cutlet, - /obj/item/reagent_containers/food/cheesewedge - ) - result = /obj/item/reagent_containers/food/taco - -/datum/recipe/bun - items = list( - /obj/item/reagent_containers/food/dough - ) - result = /obj/item/reagent_containers/food/bun - -/datum/recipe/flatbread - items = list( - /obj/item/reagent_containers/food/sliceable/flatdough - ) - result = /obj/item/reagent_containers/food/flatbread - -/datum/recipe/faggot - items = list( - /obj/item/reagent_containers/food/rawfaggot - ) - result = /obj/item/reagent_containers/food/faggot - -/datum/recipe/cutlet - items = list( - /obj/item/reagent_containers/food/rawcutlet - ) - result = /obj/item/reagent_containers/food/cutlet - -/datum/recipe/fries - items = list( - /obj/item/reagent_containers/food/rawsticks - ) - result = /obj/item/reagent_containers/food/fries - -/datum/recipe/onionrings - fruit = list("onion" = 1) - items = list( - /obj/item/reagent_containers/food/doughslice - ) - result = /obj/item/reagent_containers/food/onionrings - -/datum/recipe/mint - reagents = list(/datum/reagent/sugar = 5, /datum/reagent/frostoil = 5) - result = /obj/item/reagent_containers/food/mint - - -// Cakes. -/datum/recipe/cake - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/sugar = 15, - /datum/reagent/nutriment/protein/egg = 9 - ) - result = /obj/item/reagent_containers/food/sliceable/plaincake - -/datum/recipe/cake/carrot - fruit = list("carrot" = 3) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/sugar = 15, - /datum/reagent/nutriment/protein/egg = 9 - ) - result = /obj/item/reagent_containers/food/sliceable/carrotcake - -/datum/recipe/cake/cheese - items = list( - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/cheesewedge - ) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/cheesecake - -/datum/recipe/cake/orange - fruit = list("orange" = 1) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/orangecake - -/datum/recipe/cake/lime - fruit = list("lime" = 1) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/limecake - -/datum/recipe/cake/lemon - fruit = list("lemon" = 1) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/lemoncake - -/datum/recipe/cake/chocolate - items = list(/obj/item/reagent_containers/food/chocolatebar) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/chocolatecake - -/datum/recipe/cake/metroid - items = list(/obj/item/metroid_extract) - reagents = list(/datum/reagent/drink/milk = 5, /datum/reagent/nutriment/flour = 15, /datum/reagent/nutriment/protein/egg = 9, /datum/reagent/sugar = 15) - result = /obj/item/reagent_containers/food/sliceable/metroidcake - -/datum/recipe/cake/birthday - items = list(/obj/item/clothing/head/cakehat) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/birthdaycake - -/datum/recipe/cake/apple - fruit = list("apple" = 2) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/applecake - -/datum/recipe/cake/brain - items = list(/obj/item/reagent_containers/food/organ/brain) - reagents = list( - /datum/reagent/drink/milk = 5, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/sugar = 15 - ) - result = /obj/item/reagent_containers/food/sliceable/braincake - -/datum/recipe/smokedsausage - items = list(/obj/item/reagent_containers/food/sausage) - reagents = list(/datum/reagent/sodiumchloride = 5, /datum/reagent/blackpepper = 5) - result = /obj/item/reagent_containers/food/smokedsausage - -/datum/recipe/julienne - fruit = list("mushroom" = 2, "onion" = 1) - items = list(/obj/item/reagent_containers/food/cheesewedge, /obj/item/reagent_containers/food/meat) - result = /obj/item/reagent_containers/food/julienne - -/datum/recipe/ricewithmeat - items = list(/obj/item/reagent_containers/food/boiledrice, /obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) - result = /obj/item/reagent_containers/food/ricewithmeat - -/datum/recipe/eggbowl - items = list(/obj/item/reagent_containers/food/boiledrice, /obj/item/reagent_containers/food/boiledegg) - fruit = list("carrot" = 1, "corn" = 1) - result = /obj/item/reagent_containers/food/eggbowl - -/datum/recipe/meatbun - items = list(/obj/item/reagent_containers/food/bun, /obj/item/reagent_containers/food/faggot) - reagents = list(/datum/reagent/nutriment/soysauce = 5) - fruit = list("cabbage" = 1) - result = /obj/item/reagent_containers/food/meatbun - -/datum/recipe/eggsbenedict - items = list(/obj/item/reagent_containers/food/egg, /obj/item/reagent_containers/food/meatsteak, /obj/item/reagent_containers/food/slice/bread) - result = /obj/item/reagent_containers/food/eggsbenedict - -/datum/recipe/salami - items = list(/obj/item/reagent_containers/food/smokedsausage) - reagents = list(/datum/reagent/nutriment/garlicsauce = 5) - result = /obj/item/reagent_containers/food/sliceable/salami - -/datum/recipe/sushi - items = list(/obj/item/reagent_containers/food/tofu, /obj/item/reagent_containers/food/boiledrice, /obj/item/reagent_containers/food/carpmeat) - result = /obj/item/reagent_containers/food/sliceable/sushi - -/datum/recipe/fruitcup - fruit = list("apple" = 1, "orange" = 1,"ambrosia" = 1, "banana" = 1, "lemon" = 1, "watermelon" = 1) - result = /obj/item/reagent_containers/food/fruitcup - -/datum/recipe/fruitsalad - fruit = list("apple" = 1, "orange" = 1, "watermelon" = 1) - result = /obj/item/reagent_containers/food/fruitsalad - -/datum/recipe/delightsalad - fruit = list("lemon" = 1, "orange" = 1, "lime" = 1) - result = /obj/item/reagent_containers/food/delightsalad - -/datum/recipe/junglesalad - fruit = list("apple" = 1, "banana" = 2, "watermelon" = 1) - result = /obj/item/reagent_containers/food/junglesalad - -/datum/recipe/chowmein - items = list(/obj/item/reagent_containers/food/boiledspagetti, /obj/item/reagent_containers/food/cutlet) - fruit = list("cabbage" = 2, "carrot" = 1) - result = /obj/item/reagent_containers/food/chowmein - -/datum/recipe/beefnoodles - items = list(/obj/item/reagent_containers/food/boiledspagetti,/obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) - fruit = list("cabbage" = 1) - result = /obj/item/reagent_containers/food/beefnoodles - -/datum/recipe/tortilla - fruit = list("corn" = 1) - reagents = list(/datum/reagent/nutriment/flour = 10) - result = /obj/item/reagent_containers/food/tortilla - -/datum/recipe/nachos - items = list(/obj/item/reagent_containers/food/tortilla) - reagents = list(/datum/reagent/sodiumchloride = 1) - result = /obj/item/reagent_containers/food/nachos - -/datum/recipe/cheesenachos - items = list(/obj/item/reagent_containers/food/tortilla,/obj/item/reagent_containers/food/cheesewedge) - reagents = list(/datum/reagent/sodiumchloride = 1) - result = /obj/item/reagent_containers/food/cheesenachos - -/datum/recipe/cubannachos - items = list(/obj/item/reagent_containers/food/tortilla) - fruit = list("chili" = 2) - result = /obj/item/reagent_containers/food/cubannachos - -/datum/recipe/eggwrap - items = list(/obj/item/reagent_containers/food/boiledegg) - fruit = list("cabbage" = 1) - reagents = list(/datum/reagent/nutriment/soysauce = 10) - result = /obj/item/reagent_containers/food/eggwrap - -/datum/recipe/cheeseburrito - items = list(/obj/item/reagent_containers/food/tortilla,/obj/item/reagent_containers/food/cheesewedge, /obj/item/reagent_containers/food/cheesewedge) - fruit = list("soybeans" = 1) - result = /obj/item/reagent_containers/food/cheeseburrito - -/datum/recipe/sundae - items = list(/obj/item/reagent_containers/food/doughslice) - fruit = list("banana" = 1, "cherries" = 1) - reagents = list(/datum/reagent/drink/milk/cream = 10) - result = /obj/item/reagent_containers/food/sundae - -/datum/recipe/burrito - items = list(/obj/item/reagent_containers/food/tortilla) - fruit = list("soybeans" = 2) - result = /obj/item/reagent_containers/food/burrito - -/datum/recipe/carnaburrito - items = list(/obj/item/reagent_containers/food/tortilla,/obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) - fruit = list("soybeans" = 1) - result = /obj/item/reagent_containers/food/carnaburrito - -/datum/recipe/plasmaburrito - items = list(/obj/item/reagent_containers/food/tortilla) - fruit = list("soybeans" = 1, "chili" = 2) - result = /obj/item/reagent_containers/food/plasmaburrito - -/datum/recipe/risotto - items = list(/obj/item/reagent_containers/food/cheesewedge) - reagents = list(/datum/reagent/nutriment/rice = 10, /datum/reagent/ethanol/wine = 5) - result = /obj/item/reagent_containers/food/risotto - - -/datum/recipe/bruschetta - items = list(/obj/item/reagent_containers/food/cheesewedge) - fruit = list("tomato" = 1, "garlic" = 1) - reagents = list(/datum/reagent/nutriment/flour = 10, /datum/reagent/sodiumchloride = 2) - result = /obj/item/reagent_containers/food/bruschetta - -/datum/recipe/quiche - items = list(/obj/item/reagent_containers/food/cheesewedge, /obj/item/reagent_containers/food/egg) - fruit = list("tomato" = 1, "garlic" = 1) - result = /obj/item/reagent_containers/food/quiche - -/datum/recipe/lasagna - items = list( - /obj/item/reagent_containers/food/cheesewedge, - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/sliceable/flatdough, - /obj/item/reagent_containers/food/meat, - /obj/item/reagent_containers/food/meat - ) - fruit = list("tomato" = 3, "eggplant" = 1) - result = /obj/item/reagent_containers/food/lasagna - -/datum/recipe/noel - items = list( - /obj/item/reagent_containers/food/chocolatebar, - /obj/item/reagent_containers/food/chocolatebar - ) - fruit = list("berries" = 2) - reagents = list( - /datum/reagent/nutriment/protein/egg = 6, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/drink/milk = 5, - /datum/reagent/drink/milk/cream = 10 - ) - result = /obj/item/reagent_containers/food/sliceable/noel - -/datum/recipe/choccherrycake - items = list( - /obj/item/reagent_containers/food/chocolatebar, - /obj/item/reagent_containers/food/chocolatebar - ) - fruit = list("cherries" = 2) - reagents = list( - /datum/reagent/nutriment/protein/egg = 9, - /datum/reagent/nutriment/flour = 15, - /datum/reagent/drink/milk = 5 - ) - result = /obj/item/reagent_containers/food/sliceable/choccherrycake - -/datum/recipe/capturedevice_hacked - items = list( - /obj/item/capturedevice - ) - result = /obj/item/capturedevice/hacked diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 3e94743865f..7364ce5e7df 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1,5 +1,6 @@ /datum/reagent var/name = "Reagent" + var/id = "reagent" var/description = "A non-descript chemical." var/taste_description = "old rotten bandaids" var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index fb0e194260a..e6dfed0e096 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1544,7 +1544,7 @@ /datum/chemical_reaction/faggot/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/faggot(location) + new /obj/item/reagent_containers/food/rawfaggot(location) /datum/chemical_reaction/dough name = "Dough" @@ -1586,6 +1586,26 @@ required_reagents = list(/datum/reagent/water = 1, /datum/reagent/drink/chicken_powder = 3) result_amount = 3 +/datum/chemical_reaction/mint + result = null + required_reagents = list(/datum/reagent/sugar = 5, /datum/reagent/frostoil = 5) + result_amount = 1 + +/datum/chemical_reaction/mint/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/reagent_containers/food/mint(location) + +/datum/chemical_reaction/candy_corn + result = null + required_reagents = list(/datum/reagent/sugar = 5, /datum/reagent/nutriment/cornoil = 5) + result_amount = 1 + +/datum/chemical_reaction/candy_corn/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/reagent_containers/food/candy_corn(location) + /* Alcohol */ /datum/chemical_reaction/goldschlager diff --git a/code/modules/reagents/reagent_containers/food/_food.dm b/code/modules/reagents/reagent_containers/food/_food.dm index 2462bfeb146..44cedd4d42a 100644 --- a/code/modules/reagents/reagent_containers/food/_food.dm +++ b/code/modules/reagents/reagent_containers/food/_food.dm @@ -25,9 +25,18 @@ var/nutriment_amt = 0 // Amount of nutriments that spawn in Initialize. var/list/nutriment_desc = list("food" = 1) // Taste-describing data for the nutriments spawned by the var above. + var/food_quality = 1 //Result of cooking effort + var/food_tier //Where on the tier scale the food falls on, determines multiplier + var/cooking_description_modifier + var/food_descriptor //Feedback on quality on examine + var/bite_descriptor //Feedback on quality per bite + var/filling_color = "#ffffff" // Used by sandwiches and stuff. var/trash = null // Type that spawns upon finishing the src. +/obj/item/reagent_containers/food/New() + ..() + get_food_tier() /obj/item/reagent_containers/food/Initialize() . = ..() @@ -248,6 +257,9 @@ for(var/i = 1 to (slices_num - slices_lost)) var/obj/slice = new slice_path(src.loc) reagents.trans_to_obj(slice, reagents_per_slice) + if(istype(slice, /obj/item/reagent_containers/food)) + var/obj/item/reagent_containers/food/F = slice + F.food_quality = src.food_quality qdel(src) return return ..() @@ -276,3 +288,43 @@ /obj/item/reagent_containers/food/proc/is_sliceable() return (slices_num && slice_path) + +/obj/item/reagent_containers/food/proc/get_food_tier() + if(food_quality < -9) + food_tier = CWJ_QUALITY_GARBAGE + food_descriptor = "It looks gross. Someone cooked this poorly." + bite_descriptor = " Eating this makes you regret every decision that lead you to this moment." + else if (food_quality >= 100) + food_tier = CWJ_QUALITY_ELDRITCH + food_descriptor = "What cruel twist of fate it must be, for this unparalleled artistic masterpiece can only be truly appreciated through its destruction. Does this dish's transient form belie the true nature of all things? You see the totality of existence reflected through \the [src]." + bite_descriptor = " It's like reliving the happiest moments of your life, nothing is better than this!" + else + switch(food_quality) + if(-9 to 0) + food_tier = CWJ_QUALITY_GROSS + food_descriptor = "It looks like an unappetizing a meal." + bite_descriptor = " Your stomach turns as you chew." + if(1 to 10) + food_tier = CWJ_QUALITY_MEH + food_descriptor = "The food is edible, but frozen dinners have been reheated with more skill." + bite_descriptor = " It could be worse, but it certainly isn't good." + if(11 to 20) + food_tier = CWJ_QUALITY_NORMAL + food_descriptor = "It looks adequately made." + bite_descriptor = " It's food, alright." + if(21 to 30) + food_tier = CWJ_QUALITY_GOOD + food_descriptor = "The quality of the food is is pretty good." + bite_descriptor = " This ain't half bad!" + if(31 to 50) + food_tier = CWJ_QUALITY_VERY_GOOD + food_descriptor = "This food looks very tasty." + bite_descriptor = " So tasty!" + if(61 to 70) + food_tier = CWJ_QUALITY_CUISINE + food_descriptor = "There's a special spark in this cooking, a measure of love and care unseen by the casual chef." + bite_descriptor = " You can taste the attention to detail like a fine spice on top of the excellently prepared dish." + if(81 to 99) + food_tier = CWJ_QUALITY_LEGENDARY + food_descriptor = "The quality of this food is legendary. Words fail to describe it further. It must be eaten" + bite_descriptor = " This food is unreal, the textures blend perfectly with the flavor, could food get any better than this?" diff --git a/code/modules/reagents/reagent_containers/food/meat.dm b/code/modules/reagents/reagent_containers/food/meat.dm index c5cdadecea5..280f6b8c349 100644 --- a/code/modules/reagents/reagent_containers/food/meat.dm +++ b/code/modules/reagents/reagent_containers/food/meat.dm @@ -45,10 +45,6 @@ name = "chevon slab" desc = "Goat meat, to the uncultured." -/obj/item/reagent_containers/food/meat/chicken - name = "chicken piece" - desc = "It tastes like you'd expect." - /obj/item/reagent_containers/food/meat/xeno name = "xenomeat" desc = "A slab of green meat. Smells like acid." @@ -67,11 +63,59 @@ /obj/item/reagent_containers/food/meat/pork/attackby(obj/item/W, mob/user) if(istype(W,/obj/item/material/knife)) - new /obj/item/reagent_containers/food/bacon(src) - new /obj/item/reagent_containers/food/bacon(src) - new /obj/item/reagent_containers/food/bacon(src) + new /obj/item/reagent_containers/food/rawbacon(src) + new /obj/item/reagent_containers/food/rawbacon(src) + new /obj/item/reagent_containers/food/rawbacon(src) to_chat(user, "You cut the meat into thin strips.") qdel(src) return else ..() + +/obj/item/reagent_containers/food/meat/chicken + name = "poultry" + desc = "Poultry meat, might be chicken or any other avian species." + icon_state = "meat_bird" + filling_color = "#EDA897" + startswith = list(/datum/reagent/nutriment/protein = 3) + slice_path = /obj/item/reagent_containers/food/chickenbreast + slices_num = 4 + +/obj/item/reagent_containers/food/chickenbreast + name = "poultry breast" + desc = "The breast meat of an avian species, chicken or otherwise." + icon_state = "chickenbreast" + bitesize = 3 + startswith = list(/datum/reagent/nutriment/protein = 9) + +/obj/item/reagent_containers/food/chickensteak + name = "chicken steak" + desc = "Poultry breasts, cooked juicy and tender, lightly seasoned with salt and pepper." // Don't ask how they get grill marks on a microwave tho - Seb + icon_state = "chickenbreast_cooked" + trash = /obj/item/trash/dish/plate + filling_color = "#7A3D11" + bitesize = 3 + center_of_mass = list("x"=16, "y"=13) + + startswith = list(/datum/reagent/nutriment/protein = 8, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) + nutriment_desc = list("juicy poultry" = 10, "salt" = 2, "pepper" = 2) + matter = list(MATERIAL_BIOMATTER = 11) + +/obj/item/reagent_containers/food/roastchicken + name = "chicken roast" + desc = "A wonderful roast of an entire poultry. While you can't tell if it's exactly chicken, it certainlly will end up tasting like it." + icon_state = "chickenroast" + trash = /obj/item/trash/dish/tray + bitesize = 6 + startswith = list(/datum/reagent/nutriment/protein = 10, /datum/reagent/sodiumchloride = 1, /datum/reagent/blackpepper = 1) + nutriment_desc = list("juicy roasted poultry" = 10, "salt" = 2, "pepper" = 2) + matter = list(MATERIAL_BIOMATTER = 12) + +/obj/item/reagent_containers/food/friedchicken //missing recipe + name = "fried poultry" + desc = "Crunchy on the exterior but juicy and soft on the inside, a piece of poultry that has been fried to mouthwatering perfection." + icon_state = "friedchicken" + bitesize = 3 + startswith = list(/datum/reagent/nutriment/protein = 8, /datum/reagent/nutriment/cornoil = 5) + nutriment_desc = list("fried poultry" = 10, "spicy fried batter" = 3) + matter = list(MATERIAL_BIOMATTER = 11) diff --git a/code/modules/reagents/reagent_containers/food/sliceable.dm b/code/modules/reagents/reagent_containers/food/sliceable.dm index bf602a3f04d..4431e567764 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable.dm @@ -34,7 +34,7 @@ qdel(whole) -// slicable into 3xdoughslices +// sliceable into 3xdoughslices /obj/item/reagent_containers/food/sliceable/flatdough name = "flat dough" desc = "A flattened dough." @@ -51,13 +51,57 @@ desc = "A building block of an impressive dish." icon = 'icons/obj/food_ingredients.dmi' icon_state = "doughslice" - slice_path = /obj/item/reagent_containers/food/spagetti + slice_path = /obj/item/reagent_containers/food/spaghetti slices_num = 1 center_of_mass = "x=17;y=19" nutriment_desc = list("dough" = 1) nutriment_amt = 1 bitesize = 2 +// Dough + rolling pin = flat dough +/obj/item/reagent_containers/food/dough/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/material/kitchen/rollingpin)) + new /obj/item/reagent_containers/food/sliceable/flatdough(src) + to_chat(user, "You flatten the dough.") + qdel(src) + +// Dough slice + rolling pin = flat dough slice +/obj/item/reagent_containers/food/doughslice/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/material/kitchen/rollingpin)) + new /obj/item/reagent_containers/food/flatdoughslice(src) + to_chat(user, "You flatten the dough slice.") + qdel(src) + +/obj/item/reagent_containers/food/flatdoughslice + name = "flat dough slice" + desc = "A flattened building block of an impressive dish." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "flatdoughslice" + slice_path = /obj/item/reagent_containers/food/spaghetti + slices_num = 1 + bitesize = 2 + center_of_mass = list("x"=17, "y"=19) + nutriment_desc = list("dough" = 1) + nutriment_amt = 1 + matter = list(MATERIAL_BIOMATTER = 2) + +/obj/item/reagent_containers/food/sliceable/butterstick //missing recipe, tried to make it churnable using a centrifuge and failed miserably. Good luck to the next guy. + name = "stick of butter" + desc = "A whole stick of butter, an excellent flavor booster or spread." + icon_state = "butter" + slice_path = /obj/item/reagent_containers/food/butterslice + slices_num = 5 + nutriment_amt = 10 + nutriment_desc = list("your arteries clogging themselves" = 10) + matter = list(MATERIAL_BIOMATTER = 10) + +/obj/item/reagent_containers/food/butterslice // I'm so sorry for this. Wasting an entire stick of butter on a toast is a no. + name = "slice of butter" + desc = "A slice of butter ready to be spread over toast or used on recipes." + icon_state = "butterslice" + bitesize = 2 + nutriment_amt = 2 + nutriment_desc = list("butter" = 5) //////////////////////// /obj/item/reagent_containers/food/sliceable/salami name = "Salami" @@ -494,6 +538,29 @@ /obj/item/reagent_containers/food/slice/birthdaycake/filled filled = TRUE +/obj/item/reagent_containers/food/sliceable/brownie + name = "brownies" + desc = "A huge rectangular brownie ready to be sliced and shared." + icon_state = "brownies" + trash = /obj/item/trash/waffles + filling_color = "#362008" + slice_path = /obj/item/reagent_containers/food/brownieslice + slices_num = 5 + nutriment_amt = 20 + nutriment_desc = list("buttery goodness" = 10, "sweetness" = 10, "chocolate" = 15) + matter = list(MATERIAL_BIOMATTER = 30) + +/obj/item/reagent_containers/food/brownieslice + name = "brownie slice" + desc = "A delicious and buttery chocolate brownie, pairs perfect with icecream!" + icon_state = "brownieslice" + filling_color = "#362008" + trash = /obj/item/trash/dish/plate + bitesize = 2 + nutriment_amt = 4 + nutriment_desc = list("buttery goodness" = 5, "sweetness" = 5, "chocolate" = 10) + matter = list(MATERIAL_BIOMATTER = 6) + //////////////////////// /obj/item/reagent_containers/food/sliceable/bread name = "Bread" diff --git a/code/modules/reagents/reagent_containers/food/unsorted.dm b/code/modules/reagents/reagent_containers/food/unsorted.dm index 15152dafc54..24139d62be8 100644 --- a/code/modules/reagents/reagent_containers/food/unsorted.dm +++ b/code/modules/reagents/reagent_containers/food/unsorted.dm @@ -320,6 +320,29 @@ /datum/reagent/blackpepper = 1) bitesize = 1 +/obj/item/reagent_containers/food/baconeggs + name = "eggs and bacon" + desc = "A classic breakfast combo of fried, sunny-side eggs, with bacon strips on the side." // Wakey wakey. + icon_state = "baconegg" + bitesize = 4 + startswith = list( + /datum/reagent/nutriment/protein = 6, + /datum/reagent/nutriment/cornoil = 3) + nutriment_desc = list("bacon" = 5, "fried eggs" = 5) + +/obj/item/reagent_containers/food/benedict + name = "eggs benedict" + desc = "A perfectly poached runny egg sitting atop a bedding of Nadezhdian bacon and muffin, with hollandaise sauce generously spread on top. The best breakfast you'll ever have." + icon_state = "benedict" + trash = /obj/item/trash/dish/plate + center_of_mass = "x=15;y=15" + bitesize = 5 + startswith = list( + /datum/reagent/nutriment/protein = 15, + /datum/reagent/sodiumchloride = 1, + /datum/reagent/blackpepper = 1) + nutriment_desc = list("ham" = 5, "poached egg" = 5, "hollandaise sauce" = 3) + /obj/item/reagent_containers/food/boiledegg name = "Boiled egg" desc = "A hard boiled egg." @@ -369,6 +392,18 @@ /datum/reagent/toxin/carpotoxin = 6) bitesize = 6 +/obj/item/reagent_containers/food/sashimi + name = "sashimi" + desc = "Raw cuts of carp fillet with a side of soy sauce, apparently an eastern earth delicacy." + icon_state = "sashimi" + trash = /obj/item/trash/dish/plate + bitesize = 2 + nutriment_amt = 4 + startswith = list( + /datum/reagent/nutriment/protein = 6, + /datum/reagent/toxin/carpotoxin = 4) + nutriment_desc = list("raw fish" = 2, "soy sauce" = 2) + /obj/item/reagent_containers/food/fishfingers name = "Fish Fingers" desc = "A finger of fish." @@ -420,6 +455,40 @@ startswith = list(/datum/reagent/nutriment/protein = 3) bitesize = 2 +/obj/item/reagent_containers/food/rawfaggot + name = "raw meatball" + desc = "A raw meatball." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "rawfaggot" + bitesize = 3 + center_of_mass = list("x"=16, "y"=15) + startswith = list(/datum/reagent/nutriment/protein=5) + +/obj/item/reagent_containers/food/rawfaggot/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/material/kitchen/rollingpin)) + new /obj/item/reagent_containers/food/patty_raw(src) + to_chat(user, "You flatten the raw meatball.") + qdel(src) + + +/obj/item/reagent_containers/food/patty_raw + name = "raw patty" + desc = "A raw patty ready to be grilled into a juicy and delicious burger." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "patty_raw" + bitesize = 3 + center_of_mass = list("x"=17, "y"=20) + startswith = list(/datum/reagent/nutriment/protein=2) + +/obj/item/reagent_containers/food/patty + name = "patty" + desc = "A juicy cooked patty, ready to be slapped between two buns." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "patty" + bitesize = 3 + center_of_mass = list("x"=17, "y"=20) + startswith = list(/datum/reagent/nutriment/protein=5) + /obj/item/reagent_containers/food/sausage name = "Sausage" desc = "A piece of mixed, long meat." @@ -903,7 +972,7 @@ nutriment_amt = 2 bitesize = 2 -/obj/item/reagent_containers/food/spagetti +/obj/item/reagent_containers/food/spaghetti name = "Spaghetti" desc = "A bundle of raw spaghetti." icon_state = "spagetti" @@ -1524,7 +1593,7 @@ nutriment_amt = 8 bitesize = 2 -/obj/item/reagent_containers/food/boiledspagetti +/obj/item/reagent_containers/food/boiledspaghetti name = "Boiled Spaghetti" desc = "A plain dish of noodles, this sucks." icon_state = "spagettiboiled" @@ -1569,7 +1638,7 @@ startswith = list(/datum/reagent/drink/juice/tomato = 10) bitesize = 4 -/obj/item/reagent_containers/food/faggotspagetti +/obj/item/reagent_containers/food/faggotspaghetti name = "Spaghetti & Faggots" desc = "Now thats a nic'e faggot!" icon_state = "faggotspagetti" @@ -1912,27 +1981,45 @@ desc = "A thin piece of raw meat." icon = 'icons/obj/food_ingredients.dmi' icon_state = "rawcutlet" - center_of_mass = "x=17;y=20" - startswith = list(/datum/reagent/nutriment/protein = 1) - bitesize = 1 + bitesize = 2 + center_of_mass = list("x"=17, "y"=20) + startswith = list(/datum/reagent/nutriment/protein = 3) + +/obj/item/reagent_containers/food/rawcutlet/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/material/kitchen/rollingpin)) + new /obj/item/reagent_containers/food/rawfaggot(src) + new /obj/item/reagent_containers/food/rawfaggot(src) + to_chat(user, "You ground the sliced meat, and shape it into a ball.") + qdel(src) /obj/item/reagent_containers/food/cutlet name = "cutlet" - desc = "A tasty meat slice." + desc = "A tasty slice of meat." icon = 'icons/obj/food_ingredients.dmi' icon_state = "cutlet" + bitesize = 2 + center_of_mass = list("x"=17, "y"=20) + startswith = list(/datum/reagent/nutriment/protein = 3) + +/obj/item/reagent_containers/food/rawbacon + name = "raw bacon" + desc = "A thin slice of pork." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "bacon_raw" center_of_mass = "x=17;y=20" startswith = list(/datum/reagent/nutriment/protein = 2) bitesize = 2 /obj/item/reagent_containers/food/bacon - name = "bacon" - desc = "A thin slice of pork." - icon = 'icons/obj/food.dmi' - icon_state = "bacon" + name = "fried bacon" + desc = "When it comes to bacon, always be prepared." + icon = 'icons/obj/food_ingredients.dmi' center_of_mass = "x=17;y=20" - startswith = list(/datum/reagent/nutriment/protein = 2) - bitesize = 1 + icon_state = "bacon" + bitesize = 2 + startswith = list(/datum/reagent/nutriment/cornoil=5,/datum/reagent/nutriment/protein=10) + nutriment_desc = list("artery clogging freedom" = 10, "bacon fat" = 3) + /obj/item/reagent_containers/food/rawfaggot name = "raw faggot" @@ -2047,16 +2134,6 @@ startswith = list(/datum/reagent/nutriment/protein = 2) bitesize = 4 -/obj/item/reagent_containers/food/eggsbenedict - name = "Eggs Benedict" - desc = "It's has only one egg, how rough." - icon_state = "eggsbenedict" - trash = /obj/item/trash/dish/plate - center_of_mass = "x=15;y=15" - nutriment_amt = 6 - startswith = list(/datum/reagent/nutriment/protein = 4) - bitesize = 4 - /obj/item/reagent_containers/food/fruitcup name = "Dina's fruit cup" desc = "Single salad with edible plate" @@ -2277,3 +2354,75 @@ center_of_mass = "x=17;y=14" startswith = list(/datum/reagent/nutriment/magical_custard = 6) bitesize = 2 + +/obj/item/reagent_containers/food/tortilla + name = "tortilla" + desc = "The foldable possiblites are endless, as long as it's less than seven folds." + icon_state = "tortilla" + bitesize = 2 + center_of_mass = list("x"=21, "y"=12) + nutriment_desc = list("taco shell" = 2) + nutriment_amt = 2 + matter = list(MATERIAL_BIOMATTER = 5) + +/obj/item/reagent_containers/food/medialuna + name = "croissant" + desc = "A flakey, buttery pastry shaped like a crescent moon. Soft and fluffy on the inside, crunchy on the outside, makes a perfect pair with a good cup of espresso." + icon_state = "medialuna" + bitesize = 3 + nutriment_amt = 6 + nutriment_desc = list("crunchy pastry" = 5, "buttery goodness" = 5) + +/obj/item/reagent_containers/food/blt + name = "BLT" + desc = "A classic sandwich composed of nothing more than bacon, lettuce and tomato." + icon_state = "blt" + bitesize = 2 + nutriment_desc = list("toasted bread" = 3, "bacon" = 3, "tomato" = 2) + nutriment_amt = 3 + +/obj/item/reagent_containers/food/boiledslimecore + name = "boiled slime core" + desc = "A boiled red thing." + icon_state = "boiledrorocore" // Fix'd + bitesize = 3 + startswith = list(/datum/reagent/metroidjelly = 5) + matter = list(MATERIAL_BIOMATTER = 33) + +/obj/item/reagent_containers/food/bearchili + name = "bear meat chili" + desc = "A chili so manly you'll end up growing hair on your chest and wrestling Renders with your bare hands." + icon_state = "bearchili" + nutriment_desc = list("manliest meat" = 10, "hot chili peppers" = 3) + nutriment_amt = 3 + trash = /obj/item/trash/dish/bowl + bitesize = 5 + startswith = list(/datum/reagent/nutriment/protein = 12, /datum/reagent/capsaicin = 3, /datum/reagent/hyperzine = 5) + +/obj/item/reagent_containers/food/beefcurry + name = "beef curry" + desc = "A piping hot plate of spicy beef curry atop fluffy, steamed white rice." + icon_state = "beefcurry" + trash = /obj/item/trash/dish/bowl + bitesize = 4 + startswith = list(/datum/reagent/nutriment/protein = 8, /datum/reagent/capsaicin = 5) + nutriment_desc = list("beef" = 5, "curry" = 5, "spicyness" = 2) + +/obj/item/reagent_containers/food/chickencurry + name = "poultry curry" + desc = "A piping hot plate of spicy poultry curry atop fluffy, steamed white rice." + icon_state = "chickencurry" + trash = /obj/item/trash/dish/bowl + bitesize = 4 + startswith = list(/datum/reagent/nutriment/protein = 8, /datum/reagent/capsaicin = 5) + nutriment_desc = list("chicken" = 5, "curry" = 5, "spicyness" = 2) + +/obj/item/reagent_containers/food/mashpotatoes + name = "mashed potatoes" + desc = "Soft and fluffy mashed potatoes, the perfect side dish for a variety of meats." + icon_state = "mashpotatoes" + trash = /obj/item/trash/dish/plate + bitesize = 4 + nutriment_amt = 8 + nutriment_desc = list("mashed potatoes" = 5, "butter" = 2) + matter = list(MATERIAL_BIOMATTER = 8) diff --git a/code/modules/reagents/reagent_containers/vessel/condiment.dm b/code/modules/reagents/reagent_containers/vessel/condiment.dm index a9fbe9b826d..f7235cc2046 100644 --- a/code/modules/reagents/reagent_containers/vessel/condiment.dm +++ b/code/modules/reagents/reagent_containers/vessel/condiment.dm @@ -346,3 +346,15 @@ /obj/item/reagent_containers/vessel/condiment/pack/creamer name = "creamer" startswith = list(/datum/reagent/drink/milk/cream) + +/obj/item/reagent_containers/vessel/condiment/soysauce + name = "soysauce" + startswith = list(/datum/reagent/nutriment/soysauce = 50) + +/obj/item/reagent_containers/vessel/condiment/coldsauce + name = "coldsauce" + startswith = list(/datum/reagent/frostoil = 50) + +/obj/item/reagent_containers/vessel/condiment/cornoil + name = "cornoil" + startswith = list(/datum/reagent/nutriment/cornoil = 50) diff --git a/icons/obj/cooking/grill.dmi b/icons/obj/cooking/grill.dmi new file mode 100644 index 00000000000..5b999f1c6a4 Binary files /dev/null and b/icons/obj/cooking/grill.dmi differ diff --git a/icons/obj/cooking/kitchen.dmi b/icons/obj/cooking/kitchen.dmi new file mode 100644 index 00000000000..259f358e19a Binary files /dev/null and b/icons/obj/cooking/kitchen.dmi differ diff --git a/icons/obj/cooking/kitchen2.dmi b/icons/obj/cooking/kitchen2.dmi new file mode 100644 index 00000000000..bd7988fa436 Binary files /dev/null and b/icons/obj/cooking/kitchen2.dmi differ diff --git a/icons/obj/cooking/oven.dmi b/icons/obj/cooking/oven.dmi new file mode 100644 index 00000000000..115df9f185e Binary files /dev/null and b/icons/obj/cooking/oven.dmi differ diff --git a/icons/obj/cooking/scan.dmi b/icons/obj/cooking/scan.dmi new file mode 100644 index 00000000000..5767c8ceaea Binary files /dev/null and b/icons/obj/cooking/scan.dmi differ diff --git a/icons/obj/cooking/stove.dmi b/icons/obj/cooking/stove.dmi new file mode 100644 index 00000000000..43ba9912808 Binary files /dev/null and b/icons/obj/cooking/stove.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 0498057aa3b..a8b890e5095 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/food_ingredients.dmi b/icons/obj/food_ingredients.dmi index b624a82058a..b653cae9218 100644 Binary files a/icons/obj/food_ingredients.dmi and b/icons/obj/food_ingredients.dmi differ diff --git a/maps/derelicts/jungleplanet/jungle_planet.dmm b/maps/derelicts/jungleplanet/jungle_planet.dmm index 2cc47e968d2..774b6aaa0ea 100644 --- a/maps/derelicts/jungleplanet/jungle_planet.dmm +++ b/maps/derelicts/jungleplanet/jungle_planet.dmm @@ -1009,7 +1009,7 @@ "tu" = (/obj/structure/bed/chair/office/light,/obj/effect/floor_decal/corner/paleblue/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/medbay) "tv" = (/obj/effect/floor_decal/corner/paleblue/diagonal,/obj/item/modular_computer/console/preset/medical,/obj/machinery/light/small{dir = 1; icon_state = "bulb1"},/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/medbay) "tw" = (/obj/structure/table/marble,/obj/machinery/microwave{pixel_x = 0; pixel_y = 6},/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) -"tx" = (/obj/structure/table/marble,/obj/machinery/cooker/candy,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) +"tx" = (/obj/structure/table/marble,/obj/machinery/kitchen/candy,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) "ty" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/jungledirt,/turf/simulated/floor/tiled/dark,/area/jungleplanet/jungle/northeast) "tz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/woodentable,/obj/item/storage/box/cups,/obj/machinery/light/small,/turf/simulated/floor/trim/wood,/area/jungleplanet/junglestructure/residential/dorm) "tA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/trim/wood,/area/jungleplanet/junglestructure/residential/bar) @@ -1089,12 +1089,12 @@ "uW" = (/obj/machinery/light/small/hl{icon_state = "hanginglantern1"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/jungledirt/grass/corner{icon_state = "grassdirt_corner"; dir = 1},/turf/simulated/floor/tiled/dark,/area/jungleplanet/jungle/north) "uX" = (/obj/structure/bed/chair/beige{dir = 8},/obj/effect/floor_decal/corner/paleblue/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/medbay) "uY" = (/obj/structure/flora/jungleplants/alienplant1,/turf/simulated/floor/natural/jungle,/area/jungleplanet/jungle/central) -"uZ" = (/obj/structure/table/marble,/obj/machinery/cooker/cereal,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) +"uZ" = (/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) "va" = (/obj/structure/largecrate,/obj/random/soap,/obj/random/soap,/turf/simulated/floor/natural/jungle/dirt,/area/jungleplanet/jungle/cargo) "vb" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/trim/wood,/area/jungleplanet/junglestructure/residential/bar) -"vc" = (/obj/machinery/cooker/grill,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) -"vd" = (/obj/machinery/cooker/oven,/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/light/small,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) -"ve" = (/obj/machinery/cooker/fryer,/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) +"vc" = (/obj/machinery/kitchen/grill,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) +"vd" = (/obj/machinery/kitchen/oven,/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/light/small,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) +"ve" = (/obj/machinery/kitchen/fryer,/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) "vf" = (/obj/machinery/vending/dinnerware,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) "vg" = (/obj/structure/closet/crate/bin,/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/jungleplanet/junglestructure/lab) "vh" = (/obj/structure/table/marble,/obj/item/reagent_containers/vessel/condiment/enzyme,/obj/item/reagent_containers/vessel/beaker{pixel_x = 5},/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/jungleplanet/junglestructure/residential/bar) diff --git a/maps/derelicts/old_restaurant/old_restaurant.dmm b/maps/derelicts/old_restaurant/old_restaurant.dmm index 5433801d3e0..1c2807bd278 100644 --- a/maps/derelicts/old_restaurant/old_restaurant.dmm +++ b/maps/derelicts/old_restaurant/old_restaurant.dmm @@ -77,7 +77,7 @@ "jX" = (/obj/structure/table/darkwood_reinforced,/obj/item/reagent_containers/rag,/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/random/snack,/turf/simulated/floor/trim/carpet/oldred,/area/old_restaurant) "kp" = (/obj/structure/sign/warning/docking_area,/turf/simulated/wall/r_wall,/area/old_restaurant) "kq" = (/obj/structure/curtain/black,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/trim/carpet/oldred,/area/old_restaurant) -"ks" = (/obj/structure/table/marble,/obj/machinery/cooker/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/old_restaurant) +"ks" = (/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/old_restaurant) "kU" = (/obj/machinery/light{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/barricade/material,/turf/simulated/floor/trim/darkwood,/area/old_restaurant) "lo" = (/obj/structure/bed/couch/middle/sofa{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/trim/carpet/purple,/area/old_restaurant) "lB" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/trim/carpet/oldred,/area/old_restaurant) @@ -309,7 +309,7 @@ "Tr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/space) "Tt" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/trim/darkwood,/area/old_restaurant) "Tv" = (/obj/structure/table/darkwood_reinforced,/obj/item/material/kitchen/utensil/fork,/obj/effect/decal/cleanable/dirt,/obj/random/snack,/turf/simulated/floor/trim/carpet/oldred,/area/old_restaurant) -"TB" = (/obj/structure/table/marble,/obj/machinery/cooker/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/old_restaurant) +"TB" = (/obj/structure/table/marble,/obj/machinery/kitchen/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/white,/area/old_restaurant) "TI" = (/obj/structure/table/darkwood_reinforced,/obj/effect/decal/cleanable/dirt,/obj/random/trash,/turf/simulated/floor/trim/carpet/oldred,/area/old_restaurant) "TQ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dirty,/area/old_restaurant) "Uh" = (/obj/machinery/light,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/barricade/material,/turf/simulated/floor/tiled/dirty,/area/old_restaurant) diff --git a/maps/derelicts/science_ship/science_ship-2.dmm b/maps/derelicts/science_ship/science_ship-2.dmm index 82a2ac90d79..d43fb961de5 100644 --- a/maps/derelicts/science_ship/science_ship-2.dmm +++ b/maps/derelicts/science_ship/science_ship-2.dmm @@ -15,7 +15,7 @@ "cD" = (/obj/structure/bed/chair/brown{dir = 8},/turf/simulated/floor/tiled/dark,/area/science_ship/level2) "cE" = (/turf/simulated/open/elevatorshaft,/area/science_ship/level2) "df" = (/obj/item/ammo_casing/c9mm,/obj/item/ammo_casing/c9mm,/turf/simulated/floor/tiled/white,/area/science_ship/level2) -"dn" = (/obj/machinery/cooker/oven,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) +"dn" = (/obj/machinery/kitchen/oven,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "dr" = (/obj/structure/toilet{pixel_y = 16},/obj/random/trash,/obj/effect/landmark/corpse/commander,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled/freezer,/area/science_ship/level2) "dA" = (/obj/random/trash,/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "dE" = (/obj/structure/bed/padded,/obj/structure/curtain/open/bed{anchored = 1},/obj/item/bedsheet,/turf/simulated/floor/tiled/dark,/area/science_ship/level2) @@ -77,7 +77,7 @@ "nc" = (/obj/item/device/flashlight/flare{on = 1},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "ne" = (/obj/structure/table/standard,/obj/item/storage/firstaid/surgery,/obj/effect/floor_decal/corner/pink,/turf/simulated/floor/tiled/white,/area/science_ship/level2) "nv" = (/obj/structure/energybarrier,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/shuttle/research,/area/science_ship/level2) -"nA" = (/obj/structure/table/marble,/obj/machinery/cooker/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) +"nA" = (/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "nE" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor/plating,/area/science_ship/level2) "nJ" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "nV" = (/obj/structure/catwalk,/obj/random/trash,/turf/simulated/floor/plating,/area/science_ship/level2) @@ -144,11 +144,11 @@ "zF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "zM" = (/obj/structure/window_frame/reinforced/hull,/obj/structure/lattice,/turf/simulated/floor/plating,/area/science_ship/level2) "zN" = (/obj/random/trash,/obj/effect/floor_decal/corner/pink,/obj/item/ammo_casing/c9mm,/turf/simulated/floor/tiled/white,/area/science_ship/level2) -"zQ" = (/obj/machinery/cooker/fryer,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) +"zQ" = (/obj/machinery/kitchen/fryer,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "zW" = (/obj/effect/decal/cleanable/blood,/obj/effect/floor_decal/corner/blue{dir = 6; tag = "icon-corner_white (SOUTHEAST)"},/obj/item/ammo_casing/c9mm,/obj/item/ammo_casing/c9mm,/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "zY" = (/obj/machinery/door/airlock/glass{name = "Dormitory"},/turf/simulated/floor/tiled/dark,/area/science_ship/level2) "Ae" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/tiled/white,/area/science_ship/level2) -"AG" = (/obj/structure/table/marble,/obj/machinery/cooker/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) +"AG" = (/obj/structure/table/marble,/obj/machinery/kitchen/candy,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "AH" = (/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood,/mob/living/simple_animal/hostile/scarybat/cult,/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "AS" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "AX" = (/obj/effect/floor_decal/corner/blue{dir = 6; tag = "icon-corner_white (SOUTHEAST)"},/obj/item/ammo_casing/c9mm,/turf/simulated/floor/shuttle/research,/area/science_ship/level2) @@ -260,7 +260,7 @@ "WP" = (/obj/random/trash,/obj/effect/floor_decal/corner/blue{dir = 9},/obj/item/ammo_casing/c9mm,/obj/item/ammo_casing/c9mm,/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "WU" = (/mob/living/simple_animal/hostile/scarybat/cult,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "Xk" = (/obj/random/trash,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) -"XK" = (/obj/machinery/cooker/grill,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) +"XK" = (/obj/machinery/kitchen/grill,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/science_ship/level2) "XM" = (/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood,/obj/effect/floor_decal/corner/blue{dir = 9},/turf/simulated/floor/shuttle/research,/area/science_ship/level2) "XU" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/red{dir = 4},/turf/simulated/open,/area/science_ship/level2) "XV" = (/obj/structure/barricade/material,/obj/item/ammo_casing/c9mm,/turf/simulated/floor/shuttle/research,/area/science_ship/level2) diff --git a/maps/eclipse/eclipse-1.dmm b/maps/eclipse/eclipse-1.dmm index 1be11a86d13..05b72e96b1d 100644 --- a/maps/eclipse/eclipse-1.dmm +++ b/maps/eclipse/eclipse-1.dmm @@ -3764,7 +3764,7 @@ "bAg" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/tiled/white,/area/eclipse/research/main/xenofauna) "bAh" = (/obj/item/stool,/obj/machinery/light_switch{dir = 4; pixel_x = -26; name = "light switch - west"},/obj/machinery/light/small{dir = 8},/obj/effect/landmark/joinlate/observer,/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/cargo/disposal) "bAi" = (/obj/structure/bed/chair/shuttle/blue{dir = 1},/obj/effect/landmark/joinlate,/turf/simulated/floor/shuttle/blue,/area/shuttle/arrival/station) -"bAj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/marble,/obj/item/device/radio/intercom{canhear_range = 4; name = "Station Intercom"; pixel_y = 26},/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/cereal,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) +"bAj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/marble,/obj/item/device/radio/intercom{canhear_range = 4; name = "Station Intercom"; pixel_y = 26},/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/cereal,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) "bAk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/reagentgrinder,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) "bAl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Hydroponics Substation"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/eclipse/maintenance/substation/hydroponics) "bAm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/security/chapel) @@ -3993,7 +3993,7 @@ "bEG" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/research/research_shuttle) "bEH" = (/obj/machinery/status_display{dir = 8; pixel_x = 32; name = "status display east"},/turf/simulated/floor/tiled,/area/eclipse/civilian/hallway/orangery) "bEI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/corner/blue{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/eclipse/medical/hallway/medical_hallway2) -"bEJ" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/fryer,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) +"bEJ" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/fryer,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) "bEK" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/door/firedoor/border_only,/obj/structure/window_frame/reinforced/hull,/turf/simulated/floor/plating,/area/maintenance/incinerator) "bEL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 4},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/tiled/white,/area/eclipse/medical/hallway/medical_hallway2) "bEM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/eclipse/research/hallway/research_hallway4) @@ -4030,7 +4030,7 @@ "bFr" = (/obj/effect/shuttle_landmark/administration/station,/turf/space,/area/shuttle/administration/station) "bFs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/lime/diagonal,/obj/effect/floor_decal/spline/fancy,/turf/simulated/floor/tiled,/area/eclipse/civilian/hallway/bar) "bFt" = (/obj/effect/floor_decal/corner/lime/diagonal,/obj/effect/floor_decal/spline/fancy,/turf/simulated/floor/tiled,/area/eclipse/civilian/hallway/bar) -"bFu" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/oven,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) +"bFu" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/oven,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) "bFv" = (/obj/random/pottedplant,/obj/effect/floor_decal/spline/fancy/wood{dir = 6},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/ai_status_display{dir = 1; pixel_y = -32; name = "AI display south"},/obj/machinery/light,/obj/machinery/light_switch{dir = 8; pixel_x = 26; name = "light switch - east"},/turf/simulated/floor/trim/carpet/blue,/area/eclipse/civilian/dormitory/rooms/room6) "bFw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/eclipse/security/hallway/brig_hallway1) "bFx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) @@ -4056,7 +4056,7 @@ "bFR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start/crew/chef,/turf/simulated/floor/tiled/freezer,/area/eclipse/civilian/support/kitchen) "bFS" = (/obj/structure/kitchenspike,/turf/simulated/floor/tiled/freezer,/area/eclipse/civilian/support/kitchen) "bFT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 4; pixel_x = -22},/obj/structure/table/standard,/obj/machinery/microwave,/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) -"bFU" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) +"bFU" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/grill,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) "bFV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/eclipse/civilian/hallway/orangery) "bFW" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/obj/effect/floor_decal/industrial/arrows/blue{dir = 4; pixel_x = -7; pixel_y = -6},/turf/simulated/floor/tiled/mono,/area/eclipse/engineering/tech/supermatter_engine) "bFX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/eclipse/civilian/hallway/emergency) @@ -4082,7 +4082,7 @@ "bGr" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "incinerator_outer"; locked = 1; req_access = list(13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/shield_diffuser,/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/research/incinerator) "bGs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/eclipse/civilian/misc/orangery) "bGt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/eclipse/civilian/hallway/orangery) -"bGu" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/candy,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) +"bGu" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/candy,/turf/simulated/floor/tiled/white,/area/eclipse/civilian/support/kitchen) "bGv" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/research/incinerator) "bGw" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "incinerator_airlock"; pixel_x = 6; pixel_y = 26; req_access = list(13); tag_airpump = "incinerator_pump"; tag_chamber_sensor = "incinerator_sensor"; tag_exterior_door = "incinerator_outer"; tag_interior_door = "incinerator_inner"},/obj/machinery/airlock_sensor{id_tag = "incinerator_sensor"; pixel_x = -6; pixel_y = 26},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "incinerator_pump"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/research/incinerator) "bGx" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "incinerator_inner"; locked = 1; req_access = list(13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/eclipse/maintenance/tunnel/research/incinerator) diff --git a/maps/entrepot/entrepot-1.dmm b/maps/entrepot/entrepot-1.dmm index 5f9847c6a1c..5eb47f11e0d 100644 --- a/maps/entrepot/entrepot-1.dmm +++ b/maps/entrepot/entrepot-1.dmm @@ -3,11 +3,11 @@ "ac" = (/turf/simulated/wall/r_wall,/area/entrepot/cafe_1) "ad" = (/obj/structure/window_frame/reinforced/hull,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/entrepot/cafe_1) "ae" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/entrepot/cafe_1) -"af" = (/obj/machinery/cooker/oven,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) -"ag" = (/obj/machinery/cooker/grill,/obj/machinery/camera/network/civilian_west{c_tag = "Refectory Module 1F - Kitchen"},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) -"ah" = (/obj/machinery/cooker/fryer,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) -"ai" = (/obj/structure/table/marble,/obj/item/material/knife/butch,/obj/item/material/kitchen/rollingpin,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) -"aj" = (/obj/structure/table/marble,/obj/item/material/knife/kitchen,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"af" = (/obj/machinery/kitchen/oven,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"ag" = (/obj/machinery/kitchen/grill,/obj/machinery/camera/network/civilian_west{c_tag = "Refectory Module 1F - Kitchen"},/obj/structure/table/marble,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"ah" = (/obj/machinery/light{dir = 1},/obj/machinery/kitchen/stove,/obj/structure/table/marble,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"ai" = (/obj/structure/table/marble,/obj/item/material/knife/butch,/obj/item/material/kitchen/rollingpin,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/material/knife/kitchen,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"aj" = (/obj/structure/table/marble,/obj/item/reagent_containers/vessel/cooking_container/board,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) "ak" = (/obj/structure/table/marble,/obj/machinery/reagentgrinder{pixel_y = 10},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) "al" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"},/obj/machinery/camera/network/civilian_west{c_tag = "Refectory Module 1F - Freezer"},/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) "am" = (/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/reagent_containers/vessel/plastic/milk,/obj/item/reagent_containers/vessel/plastic/milk,/obj/item/reagent_containers/vessel/plastic/soymilk,/obj/item/reagent_containers/vessel/plastic/soymilk,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) @@ -17,8 +17,8 @@ "aq" = (/obj/machinery/icecream_vat,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) "ar" = (/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) "as" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) -"at" = (/obj/structure/table/marble,/obj/machinery/cooker/cereal{pixel_y = 6},/obj/item/reagent_containers/vessel/plastic/milk,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) -"au" = (/obj/structure/table/marble,/obj/machinery/cooker/candy{pixel_y = 6},/obj/item/storage/fancy/egg_box,/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) +"at" = (/obj/structure/table/marble,/obj/item/reagent_containers/vessel/plastic/milk,/obj/item/reagent_containers/vessel/cooking_container/grill_grate,/obj/item/reagent_containers/vessel/cooking_container/oven,/obj/item/reagent_containers/vessel/cooking_container/pan,/obj/item/reagent_containers/vessel/cooking_container/pot,/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"au" = (/obj/structure/table/marble,/obj/item/storage/fancy/egg_box,/obj/item/reagent_containers/vessel/cooking_container/air_basket,/obj/item/reagent_containers/vessel/cooking_container/deep_basket,/obj/item/reagent_containers/vessel/cooking_container/plate,/obj/item/reagent_containers/vessel/cooking_container/bowl,/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) "av" = (/obj/structure/sink/kitchen{dir = 8; pixel_x = 18},/obj/machinery/alarm{dir = 8; pixel_x = 24},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) "aw" = (/obj/machinery/slot_machine,/obj/effect/floor_decal/siding/wood{dir = 1},/obj/effect/floor_decal/siding/wood{dir = 8},/turf/simulated/floor/trim/darkwood,/area/entrepot/cafe_1) "ax" = (/obj/item/stool/bar/padded,/obj/effect/floor_decal/siding/wood{dir = 1},/turf/simulated/floor/trim/darkwood,/area/entrepot/cafe_1) @@ -763,7 +763,7 @@ "oI" = (/obj/effect/floor_decal/spline/plain/black{dir = 6},/obj/effect/floor_decal/spline/plain/corner{dir = 4},/obj/effect/floor_decal/floordetail/tiled,/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled/freezer,/area/entrepot/crew_1/fitness) "oJ" = (/obj/structure/cable{icon_state = "1-2"; d2 = 2; d1 = 1},/obj/machinery/alarm{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled/dark/rough,/area/entrepot/deck_1) "oK" = (/obj/machinery/alarm{dir = 8; pixel_x = 24},/turf/simulated/floor/tiled/dark/rough,/area/entrepot/deck_1) -"oL" = (/obj/machinery/alarm{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) +"oL" = (/obj/machinery/alarm{dir = 4; pixel_x = -24},/obj/item/stack/material/wood/fifty,/turf/simulated/floor/tiled/freezer,/area/entrepot/cafe_1) "oM" = (/obj/machinery/alarm{dir = 4; pixel_x = -24},/turf/simulated/floor/reinforced{name = "Holodeck Projector Floor"},/area/holodeck) "oN" = (/obj/structure/window_frame/glass,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/entrepot/deck_1) "oO" = (/obj/machinery/door/airlock/glass,/obj/structure/cable{icon_state = "4-8"; d2 = 8; d1 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{icon_state = "intact-supply"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled/dark/mono,/area/entrepot/deck_1) diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 0d8f9c76145..3f84cf33f78 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -3368,7 +3368,7 @@ "bmN" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/icecream_vat,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bmO" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bmP" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bmQ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/candy,/obj/structure/table/marble,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bmQ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/candy,/obj/structure/table/marble,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bmR" = (/obj/structure/flora/ausbushes/stalkybush,/obj/structure/flora/ausbushes/sparsegrass{pixel_x = 11; pixel_y = 8},/obj/structure/flora/ausbushes/sparsegrass{pixel_x = 25; pixel_y = 2},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "bmS" = (/obj/structure/flora/ausbushes/fullgrass{pixel_x = 23; pixel_y = 2},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "bmT" = (/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/window/basic{dir = 4},/obj/effect/floor_decal/spline/fancy{dir = 4},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) @@ -3463,10 +3463,10 @@ "boE" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey{dir = 10},/obj/effect/floor_decal/corner/grey{dir = 1},/obj/machinery/door/blast/shutters/open{dir = 2; id = "kitchen2"},/obj/item/clothing/head/cakehat,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "boF" = (/obj/machinery/door/window/southright{name = "Kitchen"; req_access = list(28)},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/door/blast/shutters/open{dir = 2; id = "kitchen2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "boG" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor/tiled/white/rough,/area/medical/chemistry) -"boH" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"boI" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/fryer,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"boJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/oven,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"boK" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/machinery/cooker/cereal,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"boH" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/grill,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"boI" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/fryer,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"boJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/oven,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"boK" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "boL" = (/obj/structure/flora/ausbushes/fullgrass,/obj/structure/flora/ausbushes/lavendergrass{pixel_x = 20; pixel_y = 17},/obj/structure/window/basic,/obj/effect/floor_decal/spline/fancy,/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "boM" = (/obj/structure/flora/ausbushes/fullgrass{pixel_x = 3; pixel_y = 30},/obj/structure/flora/ausbushes/sparsegrass{pixel_x = 3; pixel_y = 6},/obj/structure/window/basic,/obj/effect/floor_decal/spline/fancy,/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "boN" = (/obj/machinery/door/firedoor,/obj/structure/window_frame/rglass,/turf/simulated/floor/plating,/area/hallway/secondary/exit) diff --git a/maps/frontier/bar/classic.dmm b/maps/frontier/bar/classic.dmm index e97a1885a94..7fafaba37c0 100644 --- a/maps/frontier/bar/classic.dmm +++ b/maps/frontier/bar/classic.dmm @@ -78,7 +78,7 @@ "pp" = (/obj/structure/cable/white{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 4},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep/lobby) "pL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/trim/darkwood,/area/crew_quarters/bar) "qq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Cave Dorm - Lobby"; dir = 1},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) -"qv" = (/obj/machinery/cooker/fryer,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"qv" = (/obj/machinery/kitchen/fryer,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "qD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/trim/darkwood,/area/crew_quarters/bar) "qJ" = (/obj/structure/cable/white{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = -2},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) "ro" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) @@ -214,8 +214,8 @@ "LC" = (/obj/structure/cable/white{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "LN" = (/obj/structure/table/marble,/obj/machinery/microwave{pixel_y = 6},/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "Mm" = (/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/light,/obj/structure/cable/white{icon_state = "4-8"},/obj/machinery/door/window/westleft{name = "Bar"; req_access = list(25)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "bar_shutters"; name = "Bar Shutters"; opacity = 0},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) -"Mp" = (/obj/structure/table/marble,/obj/machinery/cooker/candy,/obj/effect/floor_decal/spline/plain/grey{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen"},/obj/machinery/atmospherics/unary/vent_pump/on{layer = 2.4; level = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) -"Nm" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"Mp" = (/obj/structure/table/marble,/obj/machinery/kitchen/candy,/obj/effect/floor_decal/spline/plain/grey{dir = 4},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen"},/obj/machinery/atmospherics/unary/vent_pump/on{layer = 2.4; level = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"Nm" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/grill,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "Nu" = (/obj/structure/table/darkwood_reinforced,/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/effect/floor_decal/corner/black/diagonal,/obj/item/material/ashtray/bronze,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "Nz" = (/obj/structure/table/darkwood_reinforced,/obj/item/flame/lighter/zippo,/obj/random/smokes,/turf/simulated/floor/trim/darkwood,/area/crew_quarters/bar) "NN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/item/device/radio/intercom{pixel_y = 22},/obj/machinery/alarm{dir = 8; pixel_x = 24},/obj/structure/flora/pottedplant/flowerbushred,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) @@ -266,8 +266,8 @@ "VN" = (/obj/item/music_tape_box/frontier,/obj/item/reagent_containers/rag,/obj/item/book/wiki/barman_recipes,/obj/item/screwdriver,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/obj/structure/table/woodentable,/obj/item/reagent_containers/vessel/bottle/syrup_bottle/caramel,/obj/item/reagent_containers/vessel/bottle/syrup_bottle/liqueur,/turf/simulated/floor/trim/darkwood,/area/crew_quarters/barbackroom) "Wu" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "WN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) -"Xf" = (/obj/machinery/cooker/oven,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) -"Xn" = (/obj/structure/table/marble,/obj/machinery/cooker/cereal,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"Xf" = (/obj/machinery/kitchen/oven,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"Xn" = (/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "Xo" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/cable/white{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "XD" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/structure/cable/white{icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "XU" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/white{icon_state = "0-8"},/turf/simulated/floor/trim/darkwood,/area/crew_quarters/bar) diff --git a/maps/frontier/bar/modern.dmm b/maps/frontier/bar/modern.dmm index e4db80d4f18..0e598686daa 100644 --- a/maps/frontier/bar/modern.dmm +++ b/maps/frontier/bar/modern.dmm @@ -21,7 +21,7 @@ "cK" = (/obj/machinery/door/airlock/glass{name = "Bar"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/spline/plain/grey{dir = 4},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "cZ" = (/obj/structure/cable/white{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/rough,/area/hallway/primary/frontier/central_east) "da" = (/obj/item/device/radio/intercom{pixel_y = 22},/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) -"db" = (/obj/structure/table/marble,/obj/machinery/cooker/candy,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/trim/lino,/area/crew_quarters/kitchen) +"db" = (/obj/structure/table/marble,/obj/machinery/kitchen/candy,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/trim/lino,/area/crew_quarters/kitchen) "dn" = (/obj/effect/floor_decal/spline/plain/black,/obj/machinery/door/window/southleft,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "ds" = (/obj/structure/table/steel,/obj/machinery/camera/network/civilian_east{c_tag = "Bar East"},/obj/effect/landmark/roundstart/monkeyportrait{pixel_x = 4; pixel_y = 28},/obj/effect/floor_decal/corner/red{dir = 6},/obj/machinery/coffeemaker,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "dL" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/Bar,/obj/machinery/door/window/southleft{name = "Bar Delivery"; req_access = list(25)},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/barbackroom) @@ -81,7 +81,7 @@ "pN" = (/obj/effect/floor_decal/corner/black/diagonal,/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/item/stool/bar_new/padded,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "pW" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/meat,/obj/item/reagent_containers/food/meat,/obj/item/reagent_containers/food/meat,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "qc" = (/obj/structure/cable/white{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/spline/fancy/corner{dir = 4},/turf/simulated/floor/tiled/dark/mono,/area/crew_quarters/bar) -"qm" = (/obj/machinery/cooker/fryer,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/dark,/area/crew_quarters/kitchen) +"qm" = (/obj/machinery/kitchen/fryer,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/dark,/area/crew_quarters/kitchen) "qq" = (/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/effect/floor_decal/corner/black/diagonal,/obj/structure/table/darkwood_reinforced,/obj/item/music_tape_box/jazz,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "qr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 1},/turf/simulated/floor/trim/darkwood,/area/hallway/primary/frontier/central_east) "qt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/floor_light/prebuilt,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) @@ -105,7 +105,7 @@ "uf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window_frame/rglass,/turf/simulated/floor/plating,/area/crew_quarters/bar) "uF" = (/obj/effect/floor_decal/corner/green{dir = 4},/turf/simulated/floor/tiled/rough,/area/hallway/primary/frontier/central_east) "uR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "bar_shutters"; name = "Bar Shutters"; opacity = 0},/obj/effect/floor_decal/corner/red{dir = 9},/obj/structure/table/marble,/obj/item/material/ashtray,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) -"vp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/table/marble,/obj/machinery/cooker/cereal,/turf/simulated/floor/trim/lino,/area/crew_quarters/kitchen) +"vp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/turf/simulated/floor/trim/lino,/area/crew_quarters/kitchen) "vC" = (/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/effect/floor_decal/corner/black/diagonal,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/darkwood_reinforced,/obj/item/material/ashtray/bronze,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "vD" = (/obj/effect/floor_decal/spline/fancy{dir = 8},/obj/item/stool/bar_new/padded,/turf/simulated/floor/tiled/dark/mono,/area/crew_quarters/bar) "vM" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable/white{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/crew_quarters/bar) @@ -144,7 +144,7 @@ "Cn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/spline/fancy{dir = 4},/turf/simulated/floor/tiled/dark/mono,/area/crew_quarters/bar) "Cx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/item/device/radio/intercom{pixel_y = 22},/obj/machinery/alarm{dir = 8; pixel_x = 24},/obj/structure/flora/pottedplant/flowerbushred,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "CB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) -"CH" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/dark,/area/crew_quarters/kitchen) +"CH" = (/obj/effect/floor_decal/corner/grey/diagonal,/obj/machinery/kitchen/grill,/turf/simulated/floor/tiled/dark,/area/crew_quarters/kitchen) "CU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/trim/darkwood,/area/crew_quarters/barbackroom) "Da" = (/turf/simulated/wall,/area/crew_quarters/sleep) "Dr" = (/obj/structure/table/marble,/obj/machinery/reagentgrinder,/turf/simulated/floor/trim/lino,/area/crew_quarters/kitchen) @@ -171,7 +171,7 @@ "GN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/spline/fancy{dir = 4},/turf/simulated/floor/tiled/dark/mono,/area/crew_quarters/bar) "GT" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/spline/fancy{dir = 1},/turf/simulated/floor/tiled/dark/mono,/area/crew_quarters/bar) "GY" = (/obj/effect/floor_decal/corner/black/diagonal,/obj/structure/synthesized_instrument/synthesizer/piano,/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) -"Hh" = (/obj/machinery/cooker/oven,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/dark,/area/crew_quarters/kitchen) +"Hh" = (/obj/machinery/kitchen/oven,/obj/effect/floor_decal/corner/grey/diagonal,/turf/simulated/floor/tiled/dark,/area/crew_quarters/kitchen) "Ho" = (/obj/effect/floor_decal/corner/green{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{name = "south bump"; pixel_y = -24},/obj/structure/cable/white,/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep/lobby) "HG" = (/obj/effect/floor_decal/corner/green{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{name = "south bump"; pixel_y = -24},/obj/structure/cable/white,/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) "HJ" = (/obj/effect/floor_decal/corner/green{dir = 4},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) diff --git a/maps/frontier/bar/saloon.dmm b/maps/frontier/bar/saloon.dmm index 0fdb52887ce..0b744e7f09a 100644 --- a/maps/frontier/bar/saloon.dmm +++ b/maps/frontier/bar/saloon.dmm @@ -1,6 +1,6 @@ "aa" = (/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 1},/obj/machinery/light/small/hl{dir = 4},/obj/machinery/slot_machine,/turf/simulated/floor/trim/wood,/area/crew_quarters/bar) "aj" = (/obj/structure/cable/white{icon_state = "4-8"},/obj/effect/floor_decal/spline/fancy/wood{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep/lobby) -"as" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/structure/table/marble,/obj/machinery/cooker/candy,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"as" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/structure/table/marble,/obj/machinery/kitchen/candy,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "aF" = (/obj/structure/cable/white{icon_state = "2-8"},/obj/structure/cable/white{icon_state = "1-2"},/obj/effect/floor_decal/corner/green{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) "aR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/white{icon_state = "1-2"},/turf/simulated/floor/trim/wood,/area/crew_quarters/bar) "aV" = (/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) @@ -42,7 +42,7 @@ "hb" = (/obj/effect/landmark/start/crew/bartender,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "hc" = (/obj/structure/table/woodentable,/obj/item/reagent_containers/vessel/shaker,/obj/item/packageWrap,/obj/item/wrapping_paper,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/deck/cards,/obj/item/deck/cards,/obj/item/deck/cards,/obj/random/music_tape,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8; layer = 2.4; level = 2},/obj/item/device/flashlight/lantern/active,/turf/simulated/floor/trim/carpet/oldred,/area/crew_quarters/barbackroom) "hj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment,/obj/structure/cable/white{icon_state = "1-2"},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = -2},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) -"hk" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/structure/table/marble,/obj/machinery/cooker/cereal,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"hk" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "hl" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Dormitory"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/spline/plain/grey{dir = 4},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep/lobby) "hx" = (/obj/structure/table/gamblingtable,/obj/item/deck/cards,/obj/item/storage/pill_bottle/dice,/turf/simulated/floor/trim/carpet/oldred,/area/crew_quarters/bar) "hB" = (/obj/structure/closet/secure_closet/bar,/obj/item/gun/projectile/shotgun/doublebarrel,/obj/item/storage/box/shotgun/beanbags,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 4; pixel_x = -24},/turf/simulated/floor/trim/wood,/area/crew_quarters/barbackroom) @@ -63,7 +63,7 @@ "kO" = (/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "ld" = (/obj/structure/cable/white{icon_state = "4-8"},/obj/effect/floor_decal/corner/green{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep/lobby) "lj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep/lobby) -"lH" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/machinery/cooker/grill,/obj/machinery/light{dir = 8},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen"; dir = 4},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"lH" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/machinery/kitchen/grill,/obj/machinery/light{dir = 8},/obj/machinery/camera/network/civilian_east{c_tag = "Kitchen"; dir = 4},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "lX" = (/obj/structure/bed/chair/wood{dir = 4},/turf/simulated/floor/trim/carpet/oldred,/area/crew_quarters/bar) "mh" = (/obj/structure/table/darkwood_reinforced,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/item/device/synthesized_instrument/guitar,/obj/machinery/light/small/hl,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "mn" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) @@ -242,13 +242,13 @@ "Sz" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/white{icon_state = "2-4"},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "SD" = (/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/kitchen) "SE" = (/obj/structure/window_frame/electric/rglass,/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/ppflowers,/obj/structure/flora/ausbushes/brflowers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/natural/grass,/area/crew_quarters/bar) -"SQ" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/machinery/cooker/oven,/obj/machinery/alarm{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"SQ" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/machinery/kitchen/oven,/obj/machinery/alarm{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "ST" = (/obj/structure/cable/white{icon_state = "4-8"},/obj/effect/floor_decal/corner/green{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/white{icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/machinery/camera/network/civilian_east{c_tag = "Cave Dorm - Lobby"},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) "SY" = (/obj/structure/table/darkwood_reinforced,/obj/item/flame/lighter/zippo,/obj/item/device/flashlight/lantern/active,/obj/random/smokes,/turf/simulated/floor/trim/wood,/area/crew_quarters/bar) "Td" = (/obj/structure/cable/white{icon_state = "4-8"},/obj/effect/floor_decal/corner/green{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/rough,/area/crew_quarters/sleep) "Tf" = (/obj/effect/floor_decal/spline/plain/grey{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Saloon"},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "Tr" = (/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/obj/machinery/light/small/hl{dir = 8},/obj/effect/floor_decal/spline/fancy/wood,/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) -"TH" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/machinery/cooker/fryer,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = -2},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) +"TH" = (/obj/effect/floor_decal/corner/blue/diagonal,/obj/machinery/kitchen/fryer,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = -2},/turf/simulated/floor/tiled/white/rough,/area/crew_quarters/kitchen) "Uc" = (/obj/structure/bed/couch/left/brown{dir = 4},/turf/simulated/floor/trim/carpet/oldred,/area/crew_quarters/sleep/lobby) "Ug" = (/obj/item/stool/bar/padded,/obj/effect/floor_decal/corner/red/diagonal{dir = 8},/turf/simulated/floor/tiled/dark/rough,/area/crew_quarters/bar) "Ul" = (/obj/machinery/vending/cigars,/turf/simulated/floor/trim/wood,/area/crew_quarters/bar) diff --git a/maps/genesis/genesis-2.dmm b/maps/genesis/genesis-2.dmm index 9ed8a1d698a..2c080e65487 100644 --- a/maps/genesis/genesis-2.dmm +++ b/maps/genesis/genesis-2.dmm @@ -2876,11 +2876,11 @@ "bdz" = (/obj/effect/floor_decal/corner/beige/diagonal,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/brown,/area/crew_quarters/mess) "bdA" = (/obj/item/stool/bar/padded,/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/obj/effect/floor_decal/spline/fancy/wood{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; icon_state = "intact-supply"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/mess) "bdB" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/button/remote/blast_door{id = "kitchen"; name = "Kitchen Shutters Control"; pixel_x = -24; pixel_y = -6; req_access = list(28)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bdC" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/grill,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bdD" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/fryer,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bdC" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/grill,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bdD" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/fryer,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bdE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/item/material/kitchen/rollingpin,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bdF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bdG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/candy,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bdG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/candy,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bdH" = (/obj/structure/flora/ausbushes/brflowers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "bdI" = (/turf/simulated/wall,/area/hallway/primary/starboard) "bdJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance,/turf/simulated/floor/plating,/area/hallway/primary/starboard) @@ -2971,7 +2971,7 @@ "bfq" = (/obj/effect/floor_decal/corner/beige/diagonal,/obj/structure/table/woodentable,/obj/item/clothing/head/cakehat,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled{color = "#ceb689"; icon_state = "steel_dirty"},/area/crew_quarters/mess) "bfr" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bfs" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/effect/landmark/start/crew/chef,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bft" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/oven,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bft" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/kitchen/oven,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bfu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/lime{dir = 9},/obj/effect/floor_decal/spline/fancy{icon_state = "spline_fancy"; dir = 8},/turf/simulated/floor/tiled,/area/hydroponics/garden) "bfv" = (/obj/structure/flora/ausbushes/brflowers,/obj/effect/landmark/start/crew/gartender,/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "bfw" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/ausbushes/fullgrass,/obj/structure/flora/ausbushes/lavendergrass{pixel_x = 20; pixel_y = 17},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) @@ -3045,7 +3045,7 @@ "bgN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/corner/beige/diagonal,/obj/structure/table/woodentable,/obj/item/reagent_containers/vessel/condiment/small/peppermill{pixel_x = -3; pixel_y = 8},/obj/item/reagent_containers/vessel/condiment/small/saltshaker{pixel_x = 7},/turf/simulated/floor/tiled{color = "#ceb689"; icon_state = "steel_dirty"},/area/crew_quarters/mess) "bgO" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/stool/padded,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bgP" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bgQ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/marble,/obj/machinery/cooker/cereal,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bgQ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/marble,/obj/machinery/kitchen/cereal,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bgR" = (/obj/structure/flora/ausbushes/fullgrass{pixel_x = 3; pixel_y = 30},/obj/structure/flora/ausbushes/sparsegrass{pixel_x = 3; pixel_y = 6},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "bgS" = (/obj/structure/flora/bush{pixel_x = 1; pixel_y = 15},/obj/structure/flora/ausbushes/sparsegrass{pixel_x = 0; pixel_y = 0},/obj/structure/flora/ausbushes/fullgrass,/obj/structure/window/basic{icon_state = "window"; dir = 4},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) "bgT" = (/obj/structure/flora/ausbushes/fullgrass{pixel_x = 13; pixel_y = 12},/obj/structure/cable/green{icon_state = "1-2"; pixel_x = 0; pixel_y = 0; d1 = 1; d2 = 2},/turf/simulated/floor/natural/grass,/area/hydroponics/garden) diff --git a/maps/research-outpost.dmm b/maps/research-outpost.dmm index b332aed2c93..6598ba9855c 100644 --- a/maps/research-outpost.dmm +++ b/maps/research-outpost.dmm @@ -367,7 +367,7 @@ "Bs" = (/obj/machinery/disposal/deliveryChute{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/door/blast/regular/open{dir = 8; id = "anomaly_isolation_lockdown"; name = "Anomalous Isolation Lockdown Shutters"},/obj/machinery/door/blast/regular/open{dir = 8; id = "SciOutpShutters"; name = "Window Shutters"},/turf/simulated/floor,/area/outpost/research/isolation_monitoring) "Bv" = (/turf/simulated/floor/tiled/white/rough,/area/outpost/research/lab) "Bw" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/outpost/research/engine) -"By" = (/obj/structure/table/marble,/obj/item/reagent_containers/food/candy_corn,/obj/item/reagent_containers/food/candy_corn,/obj/item/reagent_containers/food/boiledmetroidcore,/obj/item/reagent_containers/food/boiledmetroidcore,/obj/machinery/cooker/cereal,/obj/item/device/radio/intercom{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/outpost/research/brainstorm) +"By" = (/obj/structure/table/marble,/obj/item/reagent_containers/food/candy_corn,/obj/item/reagent_containers/food/candy_corn,/obj/item/reagent_containers/food/boiledmetroidcore,/obj/item/reagent_containers/food/boiledmetroidcore,/obj/machinery/kitchen/cereal,/obj/item/device/radio/intercom{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/outpost/research/brainstorm) "BA" = (/obj/machinery/atmospherics/pipe/simple/visible/red{dir = 4},/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/research/atmospherics) "BG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled/rough,/area/outpost/research/lab) "BN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_monitoring) diff --git a/sound/effects/Liquid_transfer_mono.ogg b/sound/effects/Liquid_transfer_mono.ogg new file mode 100644 index 00000000000..8db7d100e02 Binary files /dev/null and b/sound/effects/Liquid_transfer_mono.ogg differ diff --git a/sound/items/stove.ogg b/sound/items/stove.ogg new file mode 100644 index 00000000000..9deb37057ea Binary files /dev/null and b/sound/items/stove.ogg differ diff --git a/~code/global_init.dm b/~code/global_init.dm index fe6caedd5a1..4d654a2ad8c 100644 --- a/~code/global_init.dm +++ b/~code/global_init.dm @@ -18,6 +18,7 @@ var/global/datum/global_init/init = new () // kept out of a hook to preserve call order initialize_chemical_reactions() + qdel(src) //we're done // This dumb shit must be wiped out of existence as soon as possible