From f0a0aa2bd942b95b5321d49a2268a97f986320bb Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:35:06 +0300 Subject: [PATCH 01/22] Added defines, lists, helpers --- code/__defines/__cooking.dm | 99 ++++++++++++++++++++++++++++++ code/_global_vars/lists/cooking.dm | 19 ++++++ code/_helpers/time.dm | 34 +++++++++- 3 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 code/__defines/__cooking.dm create mode 100644 code/_global_vars/lists/cooking.dm diff --git a/code/__defines/__cooking.dm b/code/__defines/__cooking.dm new file mode 100644 index 00000000000..c3029c54150 --- /dev/null +++ b/code/__defines/__cooking.dm @@ -0,0 +1,99 @@ +//#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" + +//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) From 712600173c896d71fad2f883cbbad65f8574c2d4 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:35:41 +0300 Subject: [PATCH 02/22] coocking_appliances --- .../coocking_appliances/appliance_defines.dm | 10 + .../cooking/coocking_appliances/candy.dm | 18 + .../cooking/coocking_appliances/cereal.dm | 38 ++ .../coocking_appliances/cooking_circuits.dm | 27 + .../cooking/coocking_appliances/fryer.dm | 50 ++ .../cooking/coocking_appliances/gibber.dm | 432 +++++++++++++++ .../cooking/coocking_appliances/grill.dm | 465 ++++++++++++++++ .../cooking/coocking_appliances/icecream.dm | 209 +++++++ .../cooking/coocking_appliances/machinery.dm | 3 + .../cooking/coocking_appliances/microwave.dm | 429 +++++++++++++++ .../cooking/coocking_appliances/oven.dm | 405 ++++++++++++++ .../cooking/coocking_appliances/stove.dm | 511 ++++++++++++++++++ 12 files changed, 2597 insertions(+) create mode 100644 code/modules/cooking/coocking_appliances/appliance_defines.dm create mode 100644 code/modules/cooking/coocking_appliances/candy.dm create mode 100644 code/modules/cooking/coocking_appliances/cereal.dm create mode 100644 code/modules/cooking/coocking_appliances/cooking_circuits.dm create mode 100644 code/modules/cooking/coocking_appliances/fryer.dm create mode 100644 code/modules/cooking/coocking_appliances/gibber.dm create mode 100644 code/modules/cooking/coocking_appliances/grill.dm create mode 100644 code/modules/cooking/coocking_appliances/icecream.dm create mode 100644 code/modules/cooking/coocking_appliances/machinery.dm create mode 100644 code/modules/cooking/coocking_appliances/microwave.dm create mode 100644 code/modules/cooking/coocking_appliances/oven.dm create mode 100644 code/modules/cooking/coocking_appliances/stove.dm 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..578556a70e0 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/appliance_defines.dm @@ -0,0 +1,10 @@ +/obj/machinery/cooking_with_jane + 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/modules/cooking/coocking_appliances/candy.dm b/code/modules/cooking/coocking_appliances/candy.dm new file mode 100644 index 00000000000..866af6857da --- /dev/null +++ b/code/modules/cooking/coocking_appliances/candy.dm @@ -0,0 +1,18 @@ +/obj/machinery/cooker/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" + + output_options = list( + "Jawbreaker" = /obj/item/reagent_containers/food/variable/jawbreaker, + "Candy Bar" = /obj/item/reagent_containers/food/candy/variable, + "Sucker" = /obj/item/reagent_containers/food/variable/sucker, + "Jelly" = /obj/item/reagent_containers/food/variable/jelly + ) + +/obj/machinery/cooker/candy/change_product_appearance() + food_color = get_random_colour(1) + . = ..() diff --git a/code/modules/cooking/coocking_appliances/cereal.dm b/code/modules/cooking/coocking_appliances/cereal.dm new file mode 100644 index 00000000000..60344bb3c46 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/cereal.dm @@ -0,0 +1,38 @@ +/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/modules/cooking/coocking_appliances/cooking_circuits.dm b/code/modules/cooking/coocking_appliances/cooking_circuits.dm new file mode 100644 index 00000000000..60ce978398b --- /dev/null +++ b/code/modules/cooking/coocking_appliances/cooking_circuits.dm @@ -0,0 +1,27 @@ +/obj/item/electronics/circuitboard/cooking_with_jane/stove + name = "Circuit board (Stovetop)" + build_path = /obj/machinery/cooking_with_jane/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/electronics/circuitboard/cooking_with_jane/oven + name = "Circuit board (Convection Oven)" + build_path = /obj/machinery/cooking_with_jane/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/electronics/circuitboard/cooking_with_jane/grill + name = "Circuit board (Charcoal Grill)" + build_path = /obj/machinery/cooking_with_jane/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/modules/cooking/coocking_appliances/fryer.dm b/code/modules/cooking/coocking_appliances/fryer.dm new file mode 100644 index 00000000000..dd83d135ca6 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/fryer.dm @@ -0,0 +1,50 @@ +/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/modules/cooking/coocking_appliances/gibber.dm b/code/modules/cooking/coocking_appliances/gibber.dm new file mode 100644 index 00000000000..0df342a4b25 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/gibber.dm @@ -0,0 +1,432 @@ +/obj/machinery/gibber + name = "gibber" + desc = "The name isn't descriptive enough?" + + icon = 'icons/obj/machines/gibber.dmi' + icon_state = "gibber" + layer = BELOW_OBJ_LAYER + + density = TRUE + anchored = TRUE + + idle_power_usage = 2 WATTS + active_power_usage = 500 WATTS + + component_types = list( + /obj/item/stock_parts/micro_laser, + /obj/item/stock_parts/matter_bin, + /obj/item/circuitboard/gibber + ) + + /// Direction to spit meat and gibs in. + var/gib_throw_dir = WEST + + /// Time to gib a single entity. + var/gib_time + /// Whether the machine is processing pigs. + var/operating = FALSE + /// Max mount of mobs that can fit into the machine. + var/mob_capacity + /// List of mobs to be gibbed. + var/list/mob/mobs_to_process + +/obj/machinery/gibber/on_update_icon() + ClearOverlays() + if(panel_open) + AddOverlays("gibber-panel") + + if(stat & (NOPOWER|BROKEN)) + return + + if(operating) + AddOverlays("gibber-use") + else if(length(mobs_to_process)) + AddOverlays("gibber-jam") + else + AddOverlays("gibber-idle") + + var/should_glow = update_glow() + if(should_glow) + AddOverlays(emissive_appearance(icon, "[icon_state]_ea")) + +/obj/machinery/gibber/proc/update_glow() + if(inoperable(MAINT)) + set_light(0) + return FALSE + + var/color = COLOR_YELLOW + if(operating) + color = COLOR_GREEN + if(length(mobs_to_process)) + color = COLOR_NT_RED + + set_light(0.7, 0.1, 1, 2, color) + return TRUE + +/obj/machinery/gibber/RefreshParts() + var/time_modifier = 0 + for(var/obj/item/stock_parts/micro_laser/ML in component_parts) + time_modifier += ML.rating + gib_time = max(4 SECONDS - 10 * (time_modifier - 1), 1 SECOND) + + var/capacity_modifier = 0 + for(var/obj/item/stock_parts/matter_bin/MB in component_parts) + capacity_modifier += MB.rating + mob_capacity = clamp(capacity_modifier * (capacity_modifier - 1), 1, 12) + +/obj/machinery/gibber/Initialize() + . = ..() + + add_think_ctx("finish_processing", CALLBACK(src, nameof(.proc/finish_processing)), 0) + update_icon() + RefreshParts() + +/obj/machinery/gibber/Destroy() + if(operating) + for(var/atom/A in contents - mobs_to_process - component_parts) + qdel(A) // No drops for cheaters... + if(length(mobs_to_process)) + for(var/mob/M in mobs_to_process) + M.forceMove(loc) + return ..() + +/obj/machinery/gibber/attack_hand(mob/user) + if(stat & (NOPOWER|BROKEN)) + return + + if(operating) + to_chat(user, SPAN("danger", "\The [src] is locked and running, wait for it to finish!")) + return + + if(!length(mobs_to_process)) + to_chat(user, SPAN("danger", "\The [src] has nothing grindable inside!")) + return + + process_mobs(user) + +/obj/machinery/gibber/attackby(obj/item/W, mob/user) + if(operating) + return ..() + + if(default_deconstruction_screwdriver(user, W)) + return + + if(default_deconstruction_crowbar(user, W)) + return + + if(default_part_replacement(user, W)) + return + + if(istype(W, /obj/item/grab)) + var/obj/item/grab/G = W + if(!G.force_danger()) + to_chat(user, SPAN("danger", "You need a better grip to do that!")) + return + + add_to_contents(user, G.affecting) + G.delete_self() + return + + if(istype(W, /obj/item/organ)) + if(!user.drop(W)) + return + + user.visible_message(SPAN("danger", "\The [user] feeds \the [W] into \the [src], obliterating it.")) + qdel(W) + return + + return ..() + +/obj/machinery/gibber/relaymove(mob/user) + if(!empty_contents()) + return + + user.visible_message( + SPAN("danger", "[user] flies out from \the [src], thus emptying its contents"), + SPAN("warning", "You successfully knock out \the [src]s hatch, thus saving your life!") + ) + +/obj/machinery/gibber/MouseDrop_T(mob/target, mob/user) + if(user.stat || user.restrained()) + return + + add_to_contents(user, target) + +/obj/machinery/gibber/verb/eject() + set category = "Object" + set name = "Empty Gibber" + set src in oview(1) + + if(usr.is_ic_dead()) + return + + if(usr.loc == src) + return + + empty_contents() + add_fingerprint(usr) + +/obj/machinery/gibber/proc/empty_contents() + if(operating) + return FALSE + + for(var/mob/M in mobs_to_process) + M.dropInto(loc) + if(M.client) + M.client.eye = M.client.mob + M.client.perspective = MOB_PERSPECTIVE + + LAZYCLEARLIST(mobs_to_process) + update_icon() + return TRUE + +/obj/machinery/gibber/proc/move_inside(mob/victim) + victim.forceMove(src) + LAZYADD(mobs_to_process, victim) + + if(victim.client) + victim.client.perspective = EYE_PERSPECTIVE + victim.client.eye = src + +/obj/machinery/gibber/proc/do_move_inside_checks(mob/user, mob/living/victim, loud = TRUE) + if(isnull(user) && loud) + return FALSE + + if(isnull(victim)) + return FALSE + + if(length(mobs_to_process) >= mob_capacity) + if(loud) to_chat(user, SPAN("danger", "\The [src] is full, empty it first!")) + return FALSE + + if(operating) + if(loud) to_chat(user, SPAN("danger","\The [src] is locked and running, wait for it to finish.")) + return FALSE + + if(!iscarbon(victim) && !isanimal(victim)) + if(loud) to_chat(user, SPAN("danger","This is not suitable for \the [src]!")) + return FALSE + + if(victim.abiotic(TRUE)) + if(loud) to_chat(user, SPAN("danger","\The [victim] may not have any abiotic items on.")) + return FALSE + + return TRUE + +/obj/machinery/gibber/proc/add_to_contents(mob/user, mob/living/victim) + if(!do_move_inside_checks(user, victim)) + return + + user.visible_message(SPAN("danger", "\The [user] starts to put \the [victim] into \the [src]!")) + add_fingerprint(user) + if(do_after(user, 30, src) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && length(mobs_to_process) < mob_capacity) + user.visible_message(SPAN("danger", "\The [user] stuffs \the [victim] into \the [src]!")) + move_inside(victim) + update_icon() + +/obj/machinery/gibber/proc/process_mobs(mob/user = null) + if(operating) + return + + if(!length(mobs_to_process)) + visible_message(SPAN("danger", "You hear a loud metallic grinding sound.")) + playsound(loc, 'sound/signals/error4.ogg', 50, TRUE) + return + + visible_message(SPAN("danger", "You hear a loud squelchy grinding sound.")) + playsound(loc, 'sound/machines/juicer.ogg', 50, TRUE) + use_power_oneoff(1000) + update_icon() + + operating = TRUE + for(var/mob/pig in mobs_to_process) + create_mob_drop(pig) + + set_next_think_ctx("finish_processing", world.time + length(mobs_to_process) * gib_time, user) + +/obj/machinery/gibber/proc/create_mob_drop(mob/victim) + if(istype(victim, /mob/living/simple_animal/hostile/faithless)) + new /obj/item/ectoplasm(src) + return + + if(ismetroid(victim)) + var/mob/living/carbon/metroid/M = victim + var/extract_type = M.GetCoreType() + new extract_type(src) + return + + var/slab_owner = victim.name + + var/slab_count = 3 + var/slab_nutrition = 20 + var/robotic_slab_count = 0 + var/slab_type = /obj/item/reagent_containers/food/meat + + if(iscarbon(victim)) + var/mob/living/carbon/C = victim + slab_nutrition = C.nutrition / 15 + if(isanimal(victim)) + var/mob/living/simple_animal/S = victim + if(S.meat_amount) + slab_count = S.meat_amount + if(S.meat_type) + slab_type = S.meat_type + if(ishuman(victim)) + var/mob/living/carbon/human/H = victim + slab_count = 0 + slab_owner = H.real_name + slab_type = H.species.meat_type + for(var/obj/item/organ/external/O in H.organs) + if(O.is_stump()) + continue + + if(istype(O, /obj/item/organ/external/chest)) + var/obj/item/organ/external/chest/C = O + if(BP_IS_ROBOTIC(O)) + robotic_slab_count += C.butchering_capacity + else + slab_count += C.butchering_capacity + continue + + if(BP_IS_ROBOTIC(O)) + robotic_slab_count++ + else + slab_count++ + + if(slab_count > 0) + if(issmall(victim)) + slab_nutrition *= 0.5 + + slab_nutrition /= slab_count + + var/reagent_transfer_amt + if(victim.reagents) + reagent_transfer_amt = round(victim.reagents.total_volume / slab_count, 1) + + for(var/i = 1 to slab_count) + var/obj/item/reagent_containers/food/meat/new_meat = new slab_type(src, rand(3, 8)) + if(!istype(new_meat)) + continue + + new_meat.SetName("[slab_owner] [new_meat.name]") + new_meat.reagents.add_reagent(/datum/reagent/nutriment, slab_nutrition) + if(!victim.reagents) + continue + + victim.reagents.trans_to_obj(new_meat, reagent_transfer_amt) + + for(var/i = 1 to robotic_slab_count) + new /obj/item/stack/material/steel(src, rand(3, 5)) + +/obj/machinery/gibber/proc/finish_processing(mob/user, slipshod = TRUE, gore = TRUE) + for(var/mob/pig in mobs_to_process) + if(user) admin_attack_log(user, pig, "Gibbed the victim", "Was gibbed", "gibbed") + pig.gib(do_gibs = gore) + qdel(pig) + + operating = FALSE + + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + LAZYCLEARLIST(mobs_to_process) + update_icon() + + for(var/obj/O in contents - component_parts) + if(istype(O, /obj/item/organ) && prob(80)) + qdel(O) + continue + + O.dropInto(loc) + if(!slipshod || !throw_dir) + continue + + O.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(0, 3), 0.5) + +#define GIBBER_THINK_DELTA (15 SECONDS) + +/obj/machinery/gibber/industrial + name = "Industrial Gibber" + + icon_state = "ind_gibber" + + component_types = list( + /obj/item/circuitboard/industrial_gibber, + /obj/item/stock_parts/micro_laser, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/matter_bin + ) + + gib_throw_dir = null + + var/scoops_per_attempt = 1 + +/obj/machinery/gibber/industrial/on_update_icon() + ClearOverlays() + if(stat & (NOPOWER|BROKEN)) + return + + if(operating) + AddOverlays("ind_gibber-use") + else if(length(mobs_to_process)) + AddOverlays("ind_gibber-jam") + + var/should_glow = update_glow() + if(should_glow) + if(operating || length(mobs_to_process)) + AddOverlays(emissive_appearance(icon, "[icon_state]_usejam_ea")) + else + AddOverlays(emissive_appearance(icon, "[icon_state]_ea")) + +/obj/machinery/gibber/industrial/update_glow() + if(stat & MAINT) + set_light(0) + return FALSE + + var/color = COLOR_NT_RED + if(operating) + color = COLOR_GREEN + + set_light(0.7, 0.1, 1, 2, color) + return TRUE + +/obj/machinery/gibber/industrial/Initialize() + . = ..() + + set_next_think(world.time) + add_think_ctx("pickup", CALLBACK(src, nameof(.proc/perform_pickup)), world.time + GIBBER_THINK_DELTA) + +/obj/machinery/gibber/industrial/RefreshParts() + . = ..() + + var/scoop_modifier = 0 + for(var/obj/item/stock_parts/manipulator/MM in component_parts) + scoop_modifier += MM.rating + scoops_per_attempt = scoop_modifier + +/obj/machinery/gibber/industrial/finish_processing(mob/user, slipshod = FALSE, gore = FALSE) + . = ..(user, slipshod, gore) + flick("ind_gibber-out", src) + set_next_think_ctx("pickup", world.time + GIBBER_THINK_DELTA) + +/obj/machinery/gibber/industrial/proc/perform_pickup() + if(operating) + return + + var/scoops_left = scoops_per_attempt + for(var/mob/living/possible_prey in range(1, src)) + if(scoops_left <= 0) + break + + if(!possible_prey?.is_ic_dead() || !do_move_inside_checks(null, possible_prey, FALSE)) + continue + + move_inside(possible_prey) + scoops_left-- + + if(scoops_left <= 0) + flick("ind_gibber-in", src) + process_mobs() + return + + set_next_think_ctx("pickup", world.time + GIBBER_THINK_DELTA) + +#undef GIBBER_THINK_DELTA diff --git a/code/modules/cooking/coocking_appliances/grill.dm b/code/modules/cooking/coocking_appliances/grill.dm new file mode 100644 index 00000000000..ccf17dfa41d --- /dev/null +++ b/code/modules/cooking/coocking_appliances/grill.dm @@ -0,0 +1,465 @@ +#define ICON_SPLIT_X 16 + +/obj/machinery/cooking_with_jane/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/cwj_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. + + circuit = /obj/item/electronics/circuitboard/cooking_with_jane/grill + + var/obj/effect/flick_light_overlay/hopper_insert //flick_light_overlay found in machinery/autolathe/autolathe.dm + +/obj/machinery/cooking_with_jane/grill/Initialize() + . = ..() + hopper_insert = new(src) + +//Did not want to use this... +/obj/machinery/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/grill/examine(var/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/cooking_with_jane/grill/proc/cook_checkin(var/input) + + if(items[input]) + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/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/cooking_with_jane/grill/proc/handle_burning(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + container.handle_burning() + +/obj/machinery/cooking_with_jane/grill/proc/handle_ignition(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + if(container.handle_ignition()) + on_fire = TRUE + +//Retrieve which half of the baking pan is being used. +/obj/machinery/cooking_with_jane/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/cooking_with_jane/grill/attackby(var/obj/item/used_item, var/mob/user, params) + if(default_deconstruction(used_item, user)) + 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/cooking_with_jane/cooking_container/container = items[input] + container.process_item(used_item, params) + + else if(istype(used_item, /obj/item/reagent_containers/cooking_with_jane/cooking_container/grill_grate)) + to_chat(usr, SPAN_NOTICE("You put a [used_item] on the grill.")) + if(usr.canUnEquip(used_item)) + usr.unEquip(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/cooking_with_jane/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/cooking_with_jane/grill/CtrlClick(var/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/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/cooking_with_jane/grill/CtrlShiftClick(var/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/grill/CtrlClick called on burner [input]") + #endif + handle_switch(user, input) + +//Empty a container without a tool +/obj/machinery/cooking_with_jane/grill/AltClick(var/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/cooking_with_jane/cooking_container))) + return + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/grill/AltClick called on burner [input] [container]") + #endif + container.do_empty(user) + +/obj/machinery/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/grill/proc/timer_act(var/mob/user, var/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/lighter.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/cooking_with_jane/grill/proc/handle_switch(user, input) + playsound(src, 'sound/items/lighter.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/cooking_with_jane/grill/proc/handle_cooking(var/mob/user, var/input, set_timer=FALSE) + + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/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/cooking_with_jane/grill/update_icon() + cut_overlays() + + 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 + add_overlay(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/cooking_with_jane/grill/proc/add_to_visible(var/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/cooking_with_jane/grill/proc/remove_from_visible(var/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/cooking_with_jane/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("/cooking_with_jane/grill/verb/toggle_burner_1() called to toggle burner 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 1) + +/obj/machinery/cooking_with_jane/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("/cooking_with_jane/grill/verb/toggle_burner_2() called to toggle burner 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_switch(usr, 2) + +/obj/machinery/cooking_with_jane/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("/cooking_with_jane/grill/verb/change_temperature_1() called to change temperature on 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 1) + +/obj/machinery/cooking_with_jane/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("/cooking_with_jane/grill/verb/change_temperature_2() called to change temperature on 2") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_temperature(usr, 2) + +/obj/machinery/cooking_with_jane/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("/cooking_with_jane/grill/verb/change_timer_1() called to change timer on 1") + #endif + if(!ishuman(usr) && !isrobot(usr)) + return + handle_timer(usr, 1) + +/obj/machinery/cooking_with_jane/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("/cooking_with_jane/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 diff --git a/code/modules/cooking/coocking_appliances/icecream.dm b/code/modules/cooking/coocking_appliances/icecream.dm new file mode 100644 index 00000000000..9fdae51bf53 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/icecream.dm @@ -0,0 +1,209 @@ +#define ICECREAM_VANILLA 1 +#define ICECREAM_CHOCOLATE 2 +#define ICECREAM_STRAWBERRY 3 +#define ICECREAM_BLUE 4 +#define ICECREAM_CHERRY 5 +#define ICECREAM_BANANA 6 +#define CONE_WAFFLE 7 +#define CONE_CHOC 8 + +// Ported wholesale from Apollo Station. + +/obj/machinery/icecream_vat + name = "icecream vat" + desc = "A heavy metal container used to produce and store ice cream." + icon = 'icons/obj/kitchen.dmi' + icon_state = "icecream_vat" + density = 1 + anchored = 0 + atom_flags = ATOM_FLAG_NO_REACT | ATOM_FLAG_OPEN_CONTAINER + + var/list/product_types = list() + var/dispense_flavour = ICECREAM_VANILLA + var/flavour_name = "vanilla" + +/obj/machinery/icecream_vat/proc/get_ingredient_list(type) + switch(type) + if(ICECREAM_CHOCOLATE) + return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/nutriment/coco) + if(ICECREAM_STRAWBERRY) + return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/drink/juice/berry) + if(ICECREAM_BLUE) + return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/ethanol/singulo) + if(ICECREAM_CHERRY) + return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/nutriment/cherryjelly) + if(ICECREAM_BANANA) + return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/drink/juice/banana) + if(CONE_WAFFLE) + return list(/datum/reagent/nutriment/flour, /datum/reagent/sugar) + if(CONE_CHOC) + return list(/datum/reagent/nutriment/flour, /datum/reagent/sugar, /datum/reagent/nutriment/coco) + else + return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice) + +/obj/machinery/icecream_vat/proc/get_flavour_name(flavour_type) + switch(flavour_type) + if(ICECREAM_CHOCOLATE) + return "chocolate" + if(ICECREAM_STRAWBERRY) + return "strawberry" + if(ICECREAM_BLUE) + return "blue" + if(ICECREAM_CHERRY) + return "cherry" + if(ICECREAM_BANANA) + return "banana" + if(CONE_WAFFLE) + return "waffle" + if(CONE_CHOC) + return "chocolate" + else + return "vanilla" + +/obj/machinery/icecream_vat/Initialize() + . = ..() + create_reagents(100) + while(product_types.len < 8) + product_types.Add(5) + reagents.add_reagent(/datum/reagent/drink/milk, 5) + reagents.add_reagent(/datum/reagent/nutriment/flour, 5) + reagents.add_reagent(/datum/reagent/sugar, 5) + reagents.add_reagent(/datum/reagent/drink/ice, 5) + +/obj/machinery/icecream_vat/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/obj/machinery/icecream_vat/interact(mob/user as mob) + var/dat + dat += "ICECREAM
" + dat += "Dispensing: [flavour_name] icecream

" + dat += "Vanilla icecream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)
" + dat += "Strawberry icecream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)
" + dat += "Chocolate icecream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)
" + dat += "Blue icecream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)
" + dat += "Cherry icecream: Select Make x5 [product_types[ICECREAM_CHERRY]] dollops left. (Ingredients: milk, ice, cherry jelly)
" + dat += "Banana icecream: Select Make x5 [product_types[ICECREAM_BANANA]] dollops left. (Ingredients: milk, ice, banana)
" + dat += "
CONES
" + dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
" + dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)
" + dat += "
" + dat += "VAT CONTENT
" + for(var/datum/reagent/R in reagents.reagent_list) + dat += "[R.name]: [R.volume]" + dat += "Purge
" + dat += "Refresh Close" + + var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src) + popup.set_content(dat) + popup.open() + +/obj/machinery/icecream_vat/attackby(obj/item/O as obj, mob/user as mob) + if(istype(O, /obj/item/reagent_containers/food/icecream)) + var/obj/item/reagent_containers/food/icecream/I = O + if(!I.ice_creamed) + if(product_types[dispense_flavour] > 0) + src.visible_message("\icon[src] [user] scoops delicious [flavour_name] icecream into [I].") + product_types[dispense_flavour] -= 1 + I.add_ice_cream(flavour_name) + // if(beaker) + // beaker.reagents.trans_to(I, 10) + if(I.reagents.total_volume < 10) + I.reagents.add_reagent(/datum/reagent/sugar, 10 - I.reagents.total_volume) + else + to_chat(user, "There is not enough icecream left!") + else + to_chat(user, "[O] already has icecream in it.") + return 1 + else if(O.is_open_container()) + return + else + ..() + +/obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount) + for(var/R in get_ingredient_list(make_type)) + if(reagents.has_reagent(R, amount)) + continue + amount = 0 + break + if(amount) + for(var/R in get_ingredient_list(make_type)) + reagents.remove_reagent(R, amount) + product_types[make_type] += amount + var/flavour = get_flavour_name(make_type) + if(make_type > 6) + src.visible_message("[user] cooks up some [flavour] cones.") + else + src.visible_message("[user] whips up some [flavour] icecream.") + else + to_chat(user, "You don't have the ingredients to make this.") + +/obj/machinery/icecream_vat/OnTopic(user, href_list) + if(href_list["close"]) + close_browser(usr, "window=icecreamvat") + return TOPIC_HANDLED + + if(href_list["select"]) + dispense_flavour = text2num(href_list["select"]) + flavour_name = get_flavour_name(dispense_flavour) + src.visible_message("[user] sets [src] to dispense [flavour_name] flavoured icecream.") + . = TOPIC_HANDLED + + else if(href_list["cone"]) + var/dispense_cone = text2num(href_list["cone"]) + var/cone_name = get_flavour_name(dispense_cone) + if(product_types[dispense_cone] >= 1) + product_types[dispense_cone] -= 1 + var/obj/item/reagent_containers/food/icecream/I = new(src.loc) + I.cone_type = cone_name + I.icon_state = "icecream_cone_[cone_name]" + I.desc = "Delicious [cone_name] cone, but no ice cream." + src.visible_message("[user] dispenses a crunchy [cone_name] cone from [src].") + else + to_chat(user, "There are no [cone_name] cones left!") + . = TOPIC_REFRESH + + else if(href_list["make"]) + var/amount = (text2num(href_list["amount"])) + var/C = text2num(href_list["make"]) + make(user, C, amount) + . = TOPIC_REFRESH + + else if(href_list["disposeI"]) + var/datum/reagent/R = locate(href_list["disposeI"]) in reagents.reagent_list + if(R) + reagents.del_reagent(R.type) + . = TOPIC_REFRESH + + if(href_list["refresh"] || . == TOPIC_REFRESH) + interact(user) + +/obj/item/reagent_containers/food/icecream + name = "ice cream cone" + desc = "Delicious waffle cone, but no ice cream." + icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time + layer = ABOVE_OBJ_LAYER + bitesize = 3 + + var/ice_creamed = 0 + var/cone_type + +/obj/item/reagent_containers/food/icecream/Initialize() + . = ..() + create_reagents(20) + reagents.add_reagent(/datum/reagent/nutriment, 5) + +/obj/item/reagent_containers/food/icecream/proc/add_ice_cream(flavour_name) + name = "[flavour_name] icecream" + AddOverlays("icecream_[flavour_name]") + desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream." + ice_creamed = 1 + +#undef ICECREAM_VANILLA +#undef ICECREAM_CHOCOLATE +#undef ICECREAM_STRAWBERRY +#undef ICECREAM_BLUE +#undef ICECREAM_CHERRY +#undef ICECREAM_BANANA +#undef CONE_WAFFLE +#undef CONE_CHOC diff --git a/code/modules/cooking/coocking_appliances/machinery.dm b/code/modules/cooking/coocking_appliances/machinery.dm new file mode 100644 index 00000000000..af5c59b79bb --- /dev/null +++ b/code/modules/cooking/coocking_appliances/machinery.dm @@ -0,0 +1,3 @@ +/obj/machinery/cooking_with_jane + var/list/scan_types = list() + var/quality_mod = 1 diff --git a/code/modules/cooking/coocking_appliances/microwave.dm b/code/modules/cooking/coocking_appliances/microwave.dm new file mode 100644 index 00000000000..a9da12d160d --- /dev/null +++ b/code/modules/cooking/coocking_appliances/microwave.dm @@ -0,0 +1,429 @@ + +/obj/machinery/microwave + name = "microwave" + icon = 'icons/obj/kitchen.dmi' + icon_state = "mw" + layer = BELOW_OBJ_LAYER + density = 1 + anchored = 1 + idle_power_usage = 5 WATTS + active_power_usage = 100 WATTS + atom_flags = ATOM_FLAG_NO_REACT + atom_flags = ATOM_FLAG_OPEN_CONTAINER + var/operating = 0 // Is it on? + var/dirty = 0 // = {0..100} Does it need cleaning? + var/broken = 0 // ={0,1,2} How broken is it??? + var/global/list/datum/recipe/available_recipes // List of the recipes you can use + var/global/list/acceptable_items // List of the items you can put in + var/global/list/acceptable_reagents // List of the reagents you can put in + var/global/max_n_of_items = 0 + var/cook_speed = 1 + + component_types = list( + /obj/item/circuitboard/microwave, + /obj/item/stock_parts/micro_laser = 3, + /obj/item/stock_parts/manipulator + ) + +// see code/modules/food/recipes_microwave.dm for recipes + +/******************* +* Initialising +********************/ + +/obj/machinery/microwave/Initialize() + . = ..() + create_reagents(100) + if (!available_recipes) + available_recipes = new + for (var/type in (typesof(/datum/recipe)-/datum/recipe)) + available_recipes+= new type + acceptable_items = new + acceptable_reagents = new + for (var/datum/recipe/recipe in available_recipes) + for (var/item in recipe.items) + acceptable_items |= item + for (var/reagent in recipe.reagents) + acceptable_reagents |= reagent + if (recipe.items) + max_n_of_items = max(max_n_of_items, length(recipe.items)) + // This will do until I can think of a fun recipe to use dionaea in - + // will also allow anything using the holder item to be microwaved into + // impure carbon. ~Z + acceptable_items |= /obj/item/holder + acceptable_items |= /obj/item/reagent_containers/food/grown + acceptable_items |= /obj/item/organ + +/******************* +* Item Adding +********************/ + +/obj/machinery/microwave/attackby(obj/item/O as obj, mob/user as mob) + if(src.broken > 0) + if(src.broken == 2 && isScrewdriver(O)) // If it's broken and they're using a screwdriver + user.visible_message( \ + SPAN("notice", "\The [user] starts to fix part of the microwave."), \ + SPAN("notice", "You start to fix part of the microwave.") \ + ) + if (do_after(user, 20, src)) + user.visible_message( \ + SPAN("notice", "\The [user] fixes part of the microwave."), \ + SPAN("notice", "You have fixed part of the microwave.") \ + ) + src.broken = 1 // Fix it a bit + else if(src.broken == 1 && isWrench(O)) // If it's broken and they're doing the wrench + user.visible_message( \ + SPAN("notice", "\The [user] starts to fix part of the microwave."), \ + SPAN("notice", "You start to fix part of the microwave.") \ + ) + if (do_after(user, 20, src)) + user.visible_message( \ + SPAN("notice", "\The [user] fixes the microwave."), \ + SPAN("notice", "You have fixed the microwave.") \ + ) + src.broken = 0 // Fix it! + src.dirty = 0 // just to be sure + src.update_icon() + src.atom_flags = ATOM_FLAG_OPEN_CONTAINER + else + to_chat(user, SPAN("warning", "It's broken!")) + return 1 + else if(src.dirty == 100) // The microwave is all dirty so can't be used! + if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/reagent_containers/rag)) // If they're trying to clean it then let them + user.visible_message( \ + SPAN("notice", "\The [user] starts to clean the microwave."), \ + SPAN("notice", "You start to clean the microwave.") \ + ) + if (do_after(user, 20, src)) + user.visible_message( \ + SPAN("notice", "\The [user] has cleaned the microwave."), \ + SPAN("notice", "You have cleaned the microwave.") \ + ) + src.dirty = 0 // It's clean! + src.broken = 0 // just to be sure + src.update_icon() + src.atom_flags = ATOM_FLAG_OPEN_CONTAINER + else //Otherwise bad luck!! + to_chat(user, SPAN("warning", "It's dirty!")) + return 1 + + else if(default_deconstruction_screwdriver(user, O)) + return + else if(default_deconstruction_crowbar(user, O)) + return + else if(default_part_replacement(user, O)) + return + + else if(isWrench(O)) + user.visible_message( \ + SPAN("notice", "\The [user] begins [src.anchored ? "unsecuring" : "securing"] the microwave."), \ + SPAN("notice", "You attempt to [src.anchored ? "unsecure" : "secure"] the microwave.") + ) + if(do_after(user,20, src)) + src.anchored = !src.anchored + user.visible_message( \ + SPAN("notice", "\The [user] [src.anchored ? "secures" : "unsecures"] the microwave."), \ + SPAN("notice", "You [src.anchored ? "secure" : "unsecure"] the microwave.") + ) + else + to_chat(user, SPAN("notice", "You decide not to do that.")) + return 1 + + else if(panel_open) // Don't cook with open panel + src.updateUsrDialog() + return + + else if(is_type_in_list(O,acceptable_items)) + if (length(InsertedContents()) >= max_n_of_items) + to_chat(user, SPAN("warning", "This [src] is full of ingredients, you cannot put more.")) + return 1 + if(istype(O, /obj/item/stack)) // This is bad, but I can't think of how to change it + var/obj/item/stack/S = O + if(S.get_amount() > 1) + new O.type(src) + S.use(1) + else if(!user.drop(O, src)) + return + user.visible_message( \ + SPAN("notice", "\The [user] has added one of [O] to \the [src]."), \ + SPAN("notice", "You add one of [O] to \the [src].")) + return + else + if(!user.drop(O, src)) + return + user.visible_message( \ + SPAN("notice", "\The [user] has added \the [O] to \the [src]."), \ + SPAN("notice", "You add \the [O] to \the [src].")) + return + else if(istype(O,/obj/item/reagent_containers/vessel)) + if (!O.reagents) + return 1 + for (var/datum/reagent/R in O.reagents.reagent_list) + if (!(R.type in acceptable_reagents)) + to_chat(user, SPAN("warning", "Your [O] contains components unsuitable for cookery.")) + return 1 + return + else if(istype(O,/obj/item/grab)) + var/obj/item/grab/G = O + to_chat(user, SPAN("warning", "This is ridiculous. You can not fit \the [G.affecting] in this [src].")) + return 1 + else + to_chat(user, SPAN("warning", "You have no idea what you can cook with this [O].")) + ..() + src.updateUsrDialog() + +/obj/machinery/microwave/attack_ai(mob/user as mob) + if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) + attack_hand(user) + +/obj/machinery/microwave/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/******************* +* Microwave Menu +********************/ + +/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu + var/dat = list() + if(!anchored) + dat += "Secure the microwave first!" + else if(src.panel_open) + dat += "Panel is open!" + else if(src.broken > 0) + dat += "Bzzzzttttt" + else if(src.operating) + dat += "Microwaving in progress!
Please wait...!
" + else if(src.dirty==100) + dat += "This microwave is dirty!
Please clean it before use!
" + else + var/list/items_counts = new + var/list/items_measures = new + var/list/items_measures_p = new + dat += "

Ingredients:

" + for(var/obj/O in InsertedContents()) + if(O in component_types) + continue + var/display_name = O.name + if(istype(O,/obj/item/reagent_containers/food/egg)) + items_measures[display_name] = "egg" + items_measures_p[display_name] = "eggs" + if(istype(O,/obj/item/reagent_containers/food/tofu)) + items_measures[display_name] = "tofu chunk" + items_measures_p[display_name] = "tofu chunks" + if(istype(O,/obj/item/reagent_containers/food/meat)) //any meat + items_measures[display_name] = "slab of meat" + items_measures_p[display_name] = "slabs of meat" + if(istype(O,/obj/item/reagent_containers/food/donkpocket)) + display_name = "Turnovers" + items_measures[display_name] = "turnover" + items_measures_p[display_name] = "turnovers" + if(istype(O,/obj/item/reagent_containers/food/carpmeat)) + items_measures[display_name] = "fillet of meat" + items_measures_p[display_name] = "fillets of meat" + items_counts[display_name]++ + for(var/O in items_counts) + var/N = items_counts[O] + if(!(O in items_measures)) + dat += "[capitalize(O)]: [N] [lowertext(O)]\s" + else + if(N == 1) + dat += "[capitalize(O)]: [N] [items_measures[O]]" + else + dat += "[capitalize(O)]: [N] [items_measures_p[O]]" + + for(var/datum/reagent/R in reagents.reagent_list) + var/display_name = R.name + if(R.type == /datum/reagent/capsaicin) + display_name = "Hotsauce" + if(R.type == /datum/reagent/frostoil) + display_name = "Coldsauce" + dat += "[display_name]: [R.volume] unit\s" + + if(!length(items_counts) && !length(reagents.reagent_list)) + dat += "The microwave is empty" + dat += "

Turn on!
Eject ingredients!" + + show_browser(user, "Microwave Controls[jointext(dat,"
")]
", "window=microwave") + onclose(user, "microwave") + return + + + +/*********************************** +* Microwave Menu Handling/Cooking +************************************/ + +/obj/machinery/microwave/proc/cook() + if(stat & (NOPOWER|BROKEN)) + return + start() + if (reagents.total_volume == 0 && !length(InsertedContents())) //dry run + if (!wzhzhzh(10)) + abort() + return + stop() + return + + var/datum/recipe/recipe = select_recipe(available_recipes,src) + var/obj/cooked + if (!recipe) + dirty += 1 + if (prob(max(10, dirty * 5))) + if (!wzhzhzh(4)) + abort() + return + muck_start() + wzhzhzh(4) + muck_finish() + cooked = fail() + cooked.dropInto(loc) + return + else if (has_extra_item()) + if (!wzhzhzh(4)) + abort() + return + broke() + cooked = fail() + cooked.dropInto(loc) + return + else + if (!wzhzhzh(10)) + abort() + return + stop() + cooked = fail() + cooked.dropInto(loc) + return + else + var/halftime = round(recipe.time / 20) + if (!wzhzhzh(halftime)) + abort() + return + if (!wzhzhzh(halftime)) + abort() + cooked = fail() + cooked.dropInto(loc) + return + cooked = recipe.make_food(src) + stop() + if(cooked) + cooked.dropInto(loc) + return + +/obj/machinery/microwave/proc/wzhzhzh(seconds as num) // Whoever named this proc is fucking literally Satan. ~ Z + seconds = max(round(seconds / cook_speed), 1) + for (var/i = 1 to seconds) + if (stat & (NOPOWER|BROKEN)) + return 0 + use_power_oneoff(500) + sleep(10) + return 1 + +/obj/machinery/microwave/proc/has_extra_item() + for (var/obj/O in InsertedContents()) + if (!istype(O,/obj/item/reagent_containers/food) && !istype(O, /obj/item/grown)) + return 1 + return 0 + +/obj/machinery/microwave/proc/start() + src.visible_message(SPAN("notice", "The microwave turns on."), SPAN("notice", "You hear a microwave.")) + src.operating = 1 + src.updateUsrDialog() + src.update_icon() + +/obj/machinery/microwave/proc/abort() + src.operating = 0 // Turn it off again aferwards + src.updateUsrDialog() + src.update_icon() + +/obj/machinery/microwave/proc/stop() + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + src.operating = 0 // Turn it off again aferwards + src.updateUsrDialog() + src.update_icon() + +/obj/machinery/microwave/proc/dispose() + for (var/obj/O in InsertedContents()) + O.dropInto(loc) + if (src.reagents.total_volume) + src.dirty++ + src.reagents.clear_reagents() + to_chat(usr, SPAN("notice", "You dispose of the microwave contents.")) + src.updateUsrDialog() + +/obj/machinery/microwave/proc/muck_start() + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound + src.update_icon() + +/obj/machinery/microwave/proc/muck_finish() + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + src.visible_message(SPAN("warning", "The microwave gets covered in muck!")) + src.dirty = 100 // Make it dirty so it can't be used util cleaned + src.obj_flags = null //So you can't add condiments + src.operating = 0 // Turn it off again aferwards + src.updateUsrDialog() + src.update_icon() + +/obj/machinery/microwave/proc/broke() + var/datum/effect/effect/system/spark_spread/s = new + s.set_up(2, 1, src) + s.start() + src.visible_message(SPAN("warning", "The microwave breaks!")) //Let them know they're stupid + src.broken = 2 // Make it broken so it can't be used util fixed + src.obj_flags = null //So you can't add condiments + src.operating = 0 // Turn it off again aferwards + src.updateUsrDialog() + src.update_icon() + +/obj/machinery/microwave/on_update_icon() + if(dirty == 100) + src.icon_state = "mwbloody[operating]" + else if(broken) + src.icon_state = "mwb" + else + src.icon_state = "mw[operating]" + +/obj/machinery/microwave/proc/fail() + var/amount = 0 + for (var/obj/O in InsertedContents()) + amount++ + if (O.reagents) + var/reagent_type = O.reagents.get_master_reagent_type() + if (reagent_type) + amount+=O.reagents.get_reagent_amount(reagent_type) + qdel(O) + src.reagents.clear_reagents() + var/obj/item/reagent_containers/food/badrecipe/ffuu = new(src) + ffuu.reagents.add_reagent(/datum/reagent/carbon, amount) + ffuu.reagents.add_reagent(/datum/reagent/toxin, amount/10) + return ffuu + +/obj/machinery/microwave/Topic(href, href_list) + if(..()) + return 1 + + usr.set_machine(src) + if(src.operating) + src.updateUsrDialog() + return + + switch(href_list["action"]) + if ("cook") + cook() + + if ("dispose") + dispose() + +/obj/machinery/microwave/RefreshParts() + ..() + var/ml_rating = 0 + var/man_rating = 0 + for(var/obj/item/stock_parts/P in component_parts) + if(ismicrolaser(P)) + ml_rating += P.rating + else if(ismanipulator(P)) + man_rating += P.rating + + active_power_usage = (100 WATTS) - ml_rating * 6 // Normally, 72 power usage with 10 max power usage with max micro lasers + cook_speed = man_rating // More -> better diff --git a/code/modules/cooking/coocking_appliances/oven.dm b/code/modules/cooking/coocking_appliances/oven.dm new file mode 100644 index 00000000000..355bdc73d2a --- /dev/null +++ b/code/modules/cooking/coocking_appliances/oven.dm @@ -0,0 +1,405 @@ + + +/obj/machinery/cooking_with_jane/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/cwj_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. + + circuit = /obj/item/electronics/circuitboard/cooking_with_jane/oven + +//Did not want to use this... +/obj/machinery/cooking_with_jane/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(power_cost) + +/obj/machinery/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/oven/proc/handle_burning() + if(!(items && istype(items, /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + container.handle_burning() + +/obj/machinery/cooking_with_jane/oven/proc/handle_ignition() + if(!(items && istype(items, /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + if(container.handle_ignition()) + on_fire = TRUE +/obj/machinery/cooking_with_jane/oven/attackby(var/obj/item/used_item, var/mob/user, params) + if(default_deconstruction(used_item, user)) + return + + var/center_selected = getInput(params) + + if(opened && center_selected) + if(items != null) + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + container.process_item(used_item, params) + + else if(istype(used_item, /obj/item/reagent_containers/cooking_with_jane/cooking_container)) + to_chat(usr, SPAN_NOTICE("You put a [used_item] on the oven.")) + if(usr.canUnEquip(used_item)) + usr.unEquip(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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/oven/CtrlClick(var/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/cooking_with_jane/oven/CtrlShiftClick(var/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/cooking_with_jane/oven/AltClick(var/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/cooking_with_jane/cooking_container))) + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + + #ifdef CWJ_DEBUG + log_debug("/cooking_with_jane/oven/AltClick called on [container]") + #endif + container.do_empty(user) + +/obj/machinery/cooking_with_jane/oven/proc/handle_open(var/mob/user) + if(opened) + opened = FALSE + else + opened = TRUE + if(switches == 1) + handle_switch(user) + +/obj/machinery/cooking_with_jane/oven/proc/handle_temperature(var/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/cooking_with_jane/oven/proc/handle_timer(var/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/cooking_with_jane/oven/proc/timer_act(var/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/lighter.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/cooking_with_jane/oven/proc/handle_switch(user) + + if(switches == 1) + playsound(src, 'sound/items/lighter.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/lighter.ogg', 100, 1, 0) + switches = 1 + cooking_timestamp = world.time + cook_checkin(user) + if(timer != 0) + timer_act(user) + update_icon() + + + +/obj/machinery/cooking_with_jane/oven/proc/handle_cooking(var/mob/user, set_timer=FALSE) + + if(!(items && istype(items, /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/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/cooking_with_jane/oven/update_icon() + cut_overlays() + 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) + add_overlay(image(src.icon, icon_state="oven_hatch[switches?"_on":""]", layer=ABOVE_OBJ_LAYER)) + +/obj/machinery/cooking_with_jane/oven/proc/add_to_visible(var/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/cooking_with_jane/oven/proc/remove_from_visible(var/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/modules/cooking/coocking_appliances/stove.dm b/code/modules/cooking/coocking_appliances/stove.dm new file mode 100644 index 00000000000..22d55fc7941 --- /dev/null +++ b/code/modules/cooking/coocking_appliances/stove.dm @@ -0,0 +1,511 @@ +#define ICON_SPLIT_X 16 +#define ICON_SPLIT_Y 21 + +/obj/machinery/cooking_with_jane/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/cwj_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. + + circuit = /obj/item/electronics/circuitboard/cooking_with_jane/stove + +//Did not want to use this... +/obj/machinery/cooking_with_jane/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(used_power) + +/obj/machinery/cooking_with_jane/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/cooking_with_jane/stove/proc/cook_checkin(var/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/cooking_with_jane/stove/proc/handle_burning(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + container.handle_burning() + +/obj/machinery/cooking_with_jane/stove/proc/handle_ignition(input) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + if(container.handle_ignition()) + on_fire = TRUE + +//Retrieve which quadrant of the baking pan is being used. +/obj/machinery/cooking_with_jane/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/cooking_with_jane/stove/attackby(var/obj/item/used_item, var/mob/user, params) + if(default_deconstruction(used_item, user)) + return + + var/input = getInput(params) + + if(items[input] != null) + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + container.process_item(used_item, params) + + else if(istype(used_item, /obj/item/reagent_containers/cooking_with_jane/cooking_container)) + to_chat(usr, SPAN_NOTICE("You put a [used_item] on the stove.")) + if(usr.canUnEquip(used_item)) + usr.unEquip(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/cooking_with_jane/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/cooking_with_jane/stove/CtrlClick(var/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/cooking_with_jane/stove/CtrlShiftClick(var/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/cooking_with_jane/stove/AltClick(var/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/cooking_with_jane/cooking_container))) + return + var/obj/item/reagent_containers/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/stove/proc/timer_act(var/mob/user, var/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/lighter.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/cooking_with_jane/stove/proc/handle_switch(user, input) + playsound(src, 'sound/items/lighter.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/cooking_with_jane/stove/proc/handle_cooking(var/mob/user, var/input, set_timer=FALSE) + + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + return + + var/obj/item/reagent_containers/cooking_with_jane/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/cooking_with_jane/stove/update_icon() + cut_overlays() + + 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 + add_overlay(image(src.icon, icon_state="[panel_open?"open_":""]burner_[i]")) + + if(stove_on) + add_overlay(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) + add_overlay(image(src.icon, icon_state="steam_[i]", layer=ABOVE_OBJ_LAYER)) + +/obj/machinery/cooking_with_jane/stove/proc/add_to_visible(var/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/cooking_with_jane/stove/proc/remove_from_visible(var/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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 From 24e9ac8c0a7915dda5f10688cf9307d75ec8fa1d Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:12 +0300 Subject: [PATCH 03/22] Create smartfridge.dm --- .../coocking_appliances/smartfridge.dm | 414 ++++++++++++++++++ 1 file changed, 414 insertions(+) create mode 100644 code/modules/cooking/coocking_appliances/smartfridge.dm diff --git a/code/modules/cooking/coocking_appliances/smartfridge.dm b/code/modules/cooking/coocking_appliances/smartfridge.dm new file mode 100644 index 00000000000..b77a66807bc --- /dev/null +++ b/code/modules/cooking/coocking_appliances/smartfridge.dm @@ -0,0 +1,414 @@ + +/* SmartFridge. Much todo +*/ +/obj/machinery/smartfridge + name = "\improper SmartFridge" + icon = 'icons/obj/machines/vending/smartfridge.dmi' + icon_state = "smartfridge" + layer = BELOW_OBJ_LAYER + density = 1 + anchored = 1 + idle_power_usage = 5 WATTS + active_power_usage = 100 WATTS + atom_flags = ATOM_FLAG_NO_REACT + var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. + var/icon_on = "smartfridge" + var/icon_off = "smartfridge-off" + var/icon_panel = "smartfridge-panel" + var/list/item_records = list() + var/datum/stored_items/currently_vending = null //What we're putting out of the machine. + var/seconds_electrified = 0; + var/shoot_inventory = 0 + var/locked = 0 + var/scan_id = 1 + var/is_secure = 0 + var/shows_number_of_items = TRUE // Most machines of this type may show an approximate number of items in their storage + var/datum/wires/smartfridge/wires = null + +/obj/machinery/smartfridge/secure + is_secure = 1 + +/obj/machinery/smartfridge/New() + ..() + if(is_secure) + wires = new /datum/wires/smartfridge/secure(src) + else + wires = new /datum/wires/smartfridge(src) + +/obj/machinery/smartfridge/Destroy() + qdel(wires) + wires = null + for(var/datum/stored_items/S in item_records) + qdel(S) + item_records = null + return ..() + +/obj/machinery/smartfridge/proc/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/reagent_containers/food/grown/) || istype(O,/obj/item/seeds/)) + return 1 + return 0 + +/obj/machinery/smartfridge/seeds + name = "\improper MegaSeed Servitor" + desc = "When you need seeds fast!" + icon = 'icons/obj/machines/vending/seeds.dmi' + icon_state = "seeds" + icon_on = "seeds" + icon_off = "seeds-off" + shows_number_of_items = FALSE + +/obj/machinery/smartfridge/seeds/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/seeds/)) + return 1 + return 0 + +/obj/machinery/smartfridge/secure/extract + name = "\improper Metroid Extract Storage" + desc = "A refrigerated storage unit for metroid extracts." + req_access = list(access_research) + +/obj/machinery/smartfridge/secure/extract/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/metroid_extract)) + return TRUE + + if(istype(O,/obj/item/metroidcross)) + return TRUE + + return FALSE + +/obj/machinery/smartfridge/secure/medbay + name = "\improper Refrigerated Medicine Storage" + desc = "A refrigerated storage unit for storing medicine and chemicals." + icon_state = "smartfridge" //To fix the icon in the map editor. + icon_on = "smartfridge_chem" + req_one_access = list(access_medical,access_chemistry) + +/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O as obj) + if(istype(O, /obj/item/reagent_containers/vessel)) + return 1 + if(istype(O, /obj/item/storage/pill_bottle)) + return 1 + if(istype(O, /obj/item/reagent_containers/pill)) + return 1 + return 0 + +/obj/machinery/smartfridge/secure/virology + name = "\improper Refrigerated Virus Storage" + desc = "A refrigerated storage unit for storing viral material." + req_access = list(access_virology) + icon_state = "smartfridge_virology" + icon_on = "smartfridge_virology" + +/obj/machinery/smartfridge/secure/virology/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/reagent_containers/vessel/beaker/vial/)) + return 1 + if(istype(O,/obj/item/virusdish/)) + return 1 + return 0 + +/obj/machinery/smartfridge/chemistry + name = "\improper Smart Chemical Storage" + desc = "A refrigerated storage unit for medicine and chemical storage." + +/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers)) + return 1 + return 0 + +/obj/machinery/smartfridge/chemistry/virology + name = "\improper Smart Virus Storage" + desc = "A refrigerated storage unit for volatile sample storage." + +/obj/machinery/smartfridge/secure/blood + name = "\improper Smart Blood Storage" + desc = "A refrigerated storage unit for IV bags, usualy with blood." + icon_state = "smartfridge_blood" + icon_on = "smartfridge_blood" + icon_off = "smartfridge_blood-off" + req_one_access = list(access_medical,access_chemistry) + shows_number_of_items = FALSE + +/obj/machinery/smartfridge/secure/blood/filled/Initialize() + . = ..() + for(var/item_path in starts_with) + var/quantity = starts_with[item_path] + for(var/i = 1 to quantity) + stock_item(new item_path(src)) + +/obj/machinery/smartfridge/secure/blood/filled + var/list/starts_with = list( + /obj/item/reagent_containers/ivbag/blood/OPlus = 1, + /obj/item/reagent_containers/ivbag/blood/OMinus = 1, + /obj/item/reagent_containers/ivbag/blood/APlus = 2, + /obj/item/reagent_containers/ivbag/blood/AMinus = 2, + /obj/item/reagent_containers/ivbag/blood/BPlus = 2, + /obj/item/reagent_containers/ivbag/blood/BMinus = 2, + /obj/item/reagent_containers/ivbag = 2 + ) + +/obj/machinery/smartfridge/secure/blood/accept_check(obj/item/O) + if(istype(O, /obj/item/reagent_containers/ivbag)) + return TRUE + return FALSE + +/obj/machinery/smartfridge/drinks + name = "\improper Drink Showcase" + desc = "A refrigerated storage unit for tasty tasty alcohol." + +/obj/machinery/smartfridge/drinks/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/reagent_containers/vessel)) + return 1 + +/obj/machinery/smartfridge/secure/food + name = "\improper Refrigerated Food Showcase" + desc = "A refrigerated storage unit for tasty tasty food." + req_access = list(access_kitchen) + +/obj/machinery/smartfridge/secure/food/accept_check(obj/item/O as obj) + if(istype(O,/obj/item/reagent_containers/food)) + return 1 + return 0 + +/obj/machinery/smartfridge/drying_rack + name = "\improper Drying Rack" + desc = "A machine for drying plants." + icon = 'icons/obj/machines/vending/drying.dmi' + icon_state = "drying_rack" + icon_on = "drying_rack_on" + icon_off = "drying_rack" + +/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O as obj) + if(istype(O, /obj/item/reagent_containers/food/)) + var/obj/item/reagent_containers/food/S = O + if (S.dried_type) + return 1 + return 0 + +/obj/machinery/smartfridge/drying_rack/Process() + ..() + if(inoperable()) + return + if(contents.len) + dry() + update_icon() + +/obj/machinery/smartfridge/drying_rack/on_update_icon() + ClearOverlays() + if(inoperable()) + icon_state = icon_off + else + icon_state = icon_on + if(contents.len) + AddOverlays("drying_rack_filled") + if(!inoperable()) + AddOverlays("drying_rack_drying") + +/obj/machinery/smartfridge/drying_rack/proc/dry() + for(var/datum/stored_items/I in item_records) + for(var/obj/item/reagent_containers/food/S in I.instances) + if(S.dry || !I.get_specific_product(get_turf(src), S)) continue + if(S.dried_type == S.type) + S.dry = 1 + S.SetName("dried [S.name]") + S.color = "#a38463" + stock_item(S) + else + var/D = S.dried_type + new D(get_turf(src)) + qdel(S) + return + +/obj/machinery/smartfridge/Process() + if(stat & (BROKEN|NOPOWER)) + return + if(src.seconds_electrified > 0) + src.seconds_electrified-- + if(src.shoot_inventory && prob(2)) + src.throw_item() + +/obj/machinery/smartfridge/on_update_icon() + if(stat & (BROKEN|NOPOWER)) + icon_state = icon_off // Some of them don't have any display cases thus not requiring an overlay + else + icon_state = icon_on + if(shows_number_of_items) + ClearOverlays() + if(stat & (BROKEN|NOPOWER)) + AddOverlays(icon_off) // The use of overlays allows us to see how much is stored inside, even if the machine happens to be unpowered + switch(contents.len) + if(0) + icon_state = icon_on + if(1 to 25) + icon_state = "[icon_on]1" // 1/4 loaded + if(26 to 75) + icon_state = "[icon_on]2" // half-loaded + if(76 to INFINITY) + icon_state = "[icon_on]3" // "full" + else +/******************* +* Item Adding +********************/ + +/obj/machinery/smartfridge/attackby(obj/item/O as obj, mob/user as mob) + if(isScrewdriver(O)) + panel_open = !panel_open + user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].") + ClearOverlays() + if(panel_open) + AddOverlays(image(icon, icon_panel)) + SSnano.update_uis(src) + return + + if(isMultitool(O) || isWirecutter(O)) + if(panel_open) + attack_hand(user) + return + + if(stat & NOPOWER) + to_chat(user, SPAN_NOTICE("\The [src] is unpowered and useless.")) + return + + if(accept_check(O)) + if(!user.drop(O)) + return + stock_item(O) + update_icon() + user.visible_message(SPAN_NOTICE("\The [user] has added \the [O] to \the [src]."), SPAN_NOTICE("You add \the [O] to \the [src].")) + + else if(istype(O, /obj/item/storage)) + var/obj/item/storage/bag/P = O + var/plants_loaded = 0 + for(var/obj/G in P.contents) + if(accept_check(G) && P.remove_from_storage(G, src)) + plants_loaded++ + stock_item(G) + update_icon() + + if(plants_loaded) + user.visible_message(SPAN_NOTICE("\The [user] loads \the [src] with the contents of \the [P]."), SPAN_NOTICE("You load \the [src] with the contents of \the [P].")) + if(P.contents.len > 0) + to_chat(user, SPAN_NOTICE("Some items were refused.")) + + else + to_chat(user, SPAN_NOTICE("\The [src] smartly refuses [O].")) + return 1 + +/obj/machinery/smartfridge/secure/emag_act(remaining_charges, mob/user) + if(!emagged) + playsound(src.loc, 'sound/effects/computer_emag.ogg', 25) + emagged = 1 + locked = -1 + to_chat(user, "You short out the product lock on [src].") + return 1 + +/obj/machinery/smartfridge/proc/stock_item(obj/item/O) + for(var/datum/stored_items/I in item_records) + if(istype(O, I.item_path) && O.name == I.item_name) + stock(I, O) + return + + var/datum/stored_items/I = new /datum/stored_items(src, O.type, O.name) + dd_insertObjectList(item_records, I) + stock(I, O) + +/obj/machinery/smartfridge/proc/stock(datum/stored_items/I, obj/item/O) + I.add_product(O) + SSnano.update_uis(src) + +/obj/machinery/smartfridge/attack_ai(mob/user) + attack_hand(user) + +/obj/machinery/smartfridge/attack_hand(mob/user as mob) + if(stat & (NOPOWER|BROKEN)) + return + wires.Interact(user) + ui_interact(user) + +/******************* +* SmartFridge Menu +********************/ + +/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + user.set_machine(src) + + var/data[0] + data["contents"] = null + data["electrified"] = seconds_electrified > 0 + data["shoot_inventory"] = shoot_inventory + data["locked"] = locked + data["secure"] = is_secure + + var/list/items[0] + for (var/i=1 to length(item_records)) + var/datum/stored_items/I = item_records[i] + var/count = I.get_amount() + if(count > 0) + items.Add(list(list("display_name" = html_encode(capitalize(I.item_name)), "vend" = i, "quantity" = count))) + + if(items.len > 0) + data["contents"] = items + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500) + ui.set_initial_data(data) + ui.open() + +/obj/machinery/smartfridge/Topic(href, href_list) + if(..()) return 0 + + var/mob/user = usr + var/datum/nanoui/ui = SSnano.get_open_ui(user, src, "main") + + if(href_list["close"]) + user.unset_machine() + ui.close() + return 0 + + if(href_list["vend"]) + var/index = text2num(href_list["vend"]) + var/amount = text2num(href_list["amount"]) + var/datum/stored_items/I = item_records[index] + var/count = I.get_amount() + + // Sanity check, there are probably ways to press the button when it shouldn't be possible. + if(count > 0) + if((count - amount) < 0) + amount = count + for(var/i = 1 to amount) + I.get_product(get_turf(src), user) + update_icon() + + return 1 + return 0 + +/obj/machinery/smartfridge/proc/throw_item() + var/obj/throw_item = null + var/mob/living/target = locate() in view(7,src) + if(!target) + return 0 + + for(var/datum/stored_items/I in src.item_records) + throw_item = I.get_product(loc) + if (!throw_item) + continue + break + + if(!throw_item) + return 0 + throw_item.throw_at(target, 16, null, src) + update_icon() + visible_message(SPAN_WARNING("[src] launches [throw_item.name] at [target.name]!")) + return 1 + +/************************ +* Secure SmartFridges +*************************/ + +/obj/machinery/smartfridge/secure/Topic(href, href_list) + if(stat & (NOPOWER|BROKEN)) return 0 + if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) + if(!allowed(usr) && !emagged && scan_id && href_list["vend"]) + to_chat(usr, SPAN_WARNING("Access denied.")) + return 0 + return ..() From 04d7ac5aa7bb79ec9977ebceb581c7401f47e4ef Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:15 +0300 Subject: [PATCH 04/22] Create cooking_catalog.dm --- code/modules/cooking/cooking_catalog.dm | 214 ++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 code/modules/cooking/cooking_catalog.dm diff --git a/code/modules/cooking/cooking_catalog.dm b/code/modules/cooking/cooking_catalog.dm new file mode 100644 index 00000000000..92ae1413e4e --- /dev/null +++ b/code/modules/cooking/cooking_catalog.dm @@ -0,0 +1,214 @@ +/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_with_jane/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_with_jane/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_with_jane/recipe/recipe + +/datum/catalog_entry/cooking/New(var/datum/cooking_with_jane/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_with_jane/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 + ..() From 8e09238edb12dfd73b4928484bc037fb32e365ee Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:17 +0300 Subject: [PATCH 05/22] Create cooking.dm --- code/modules/cooking/cooking.dm | 792 ++++++++++++++++++++++++++++++++ 1 file changed, 792 insertions(+) create mode 100644 code/modules/cooking/cooking.dm diff --git a/code/modules/cooking/cooking.dm b/code/modules/cooking/cooking.dm new file mode 100644 index 00000000000..cc98da8dddb --- /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 = GLOB.chemical_reagents_list[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(!is_reagent_with_id_exist(step_list[2])) + 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(!is_reagent_with_id_exist(step_list[2])) + 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/id in step_list["exclude_reagents"]) + if(!is_reagent_with_id_exist(id)) + reason="exclude_reagents list has nonexistant reagent id [id]" + + 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(var/reagent_id, var/amount, var/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(var/item_type, var/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(var/item_type, var/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(var/produce, var/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(var/type, var/quality, var/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(var/heat, var/time, var/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(var/heat, var/time, var/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(var/heat, var/time, var/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(var/new_description) + last_created_step.desc = new_description + +/datum/cooking/recipe/proc/set_step_max_quality(var/quality) + last_created_step.flags |= CWJ_BASE_QUALITY_ENABLED + last_created_step.max_quality_award = quality + +/datum/cooking/recipe/proc/set_step_base_quality(var/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(var/new_description) + last_created_step.custom_result_desc = new_description + + +/datum/cooking/recipe/proc/set_exact_type_required(var/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(var/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(var/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(var/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(var/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(var/datum/cooking/recipe_step/step, var/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(var/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(max=1000000, A=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(var/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(var/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" From c71f6f2585546ceeb6a858cee5c2176b262d96f3 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:21 +0300 Subject: [PATCH 06/22] Create cooking_init.dm --- code/modules/cooking/cooking_init.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 code/modules/cooking/cooking_init.dm diff --git a/code/modules/cooking/cooking_init.dm b/code/modules/cooking/cooking_init.dm new file mode 100644 index 00000000000..2074490ed1c --- /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_with_jane/recipe) + recipe_paths -= /datum/cooking_with_jane/recipe + for (var/path in recipe_paths) + var/datum/cooking_with_jane/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 \ No newline at end of file From 0095065d56e61f177179a1b0080b50e9d5f69719 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:24 +0300 Subject: [PATCH 07/22] Create cooking_tracker.dm --- code/modules/cooking/cooking_tracker.dm | 455 ++++++++++++++++++++++++ 1 file changed, 455 insertions(+) create mode 100644 code/modules/cooking/cooking_tracker.dm diff --git a/code/modules/cooking/cooking_tracker.dm b/code/modules/cooking/cooking_tracker.dm new file mode 100644 index 00000000000..75f80fd6d58 --- /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_with_jane/recipe_tracker + var/datum/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_with_jane/recipe_tracker/New(var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/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_with_jane/recipe_tracker/proc/apply_flat_penalty(var/penalty) + if(active_recipe_pointers.len == 0) + return + + for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_pointers) + pointer.tracked_quality -= penalty + +//Generate recipe_pointer objects based on the global list +/datum/cooking_with_jane/recipe_tracker/proc/generate_pointers() + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/generate_pointers") + #endif + var/obj/item/reagent_containers/cooking_with_jane/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_with_jane/recipe_pointer(container.appliancetype, key, src) + +//Generate next steps +/datum/cooking_with_jane/recipe_tracker/proc/get_step_options() + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/get_step_options") + #endif + var/list/options = list() + for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_pointers) + options += pointer.get_possible_steps() + + #ifdef CWJ_DEBUG + log_debug("/datum/cooking_with_jane/recipe_tracker/proc/get_step_options returned [options.len] options") + #endif + return options + + +/datum/cooking_with_jane/recipe_tracker/proc/populate_step_flags() + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/populate_step_flags") + #endif + step_flags = 0 + for (var/datum/cooking_with_jane/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_with_jane/recipe_tracker/proc/has_recipes() + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/has_recipes") + #endif + return active_recipe_pointers.len + +//Wrapper function for analyzing process_item internally. +/datum/cooking_with_jane/recipe_tracker/proc/process_item_wrap(var/obj/used_object, var/mob/user) + + #ifdef CWJ_DEBUG + log_debug("/datum/cooking_with_jane/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_with_jane/recipe_tracker/proc/process_item(var/obj/used_object, var/mob/user) + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/process_item") + #endif + if(completion_lockout) + #ifdef CWJ_DEBUG + log_debug("/datum/cooking_with_jane/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_with_jane/recipe_pointer/pointer in active_recipe_pointers) + var/option_list = list() + option_list += pointer.get_possible_steps() + for (var/datum/cooking_with_jane/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_with_jane/recipe_pointer/pointer in active_recipe_pointers) + var/used_id = FALSE + var/list/option_list = pointer.get_possible_steps() + for (var/datum/cooking_with_jane/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_with_jane/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_with_jane/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_with_jane/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_with_jane/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_with_jane/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_with_jane/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_with_jane/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_with_jane/recipe_pointer + var/datum/cooking_with_jane/recipe/current_recipe //The recipe being followed here. + var/datum/cooking_with_jane/recipe_step/current_step //The current step in the recipe we are following. + + var/datum/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_with_jane/recipe_pointer/New(start_type, recipe_id, var/datum/cooking_with_jane/recipe_tracker/parent) + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/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_with_jane/recipe_pointer/proc/get_possible_steps() + + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/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_with_jane/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_with_jane/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_with_jane/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_with_jane/recipe_pointer/proc/get_step_flags() + #ifdef CWJ_DEBUG + log_debug("Called /datum/cooking_with_jane/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_with_jane/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_with_jane/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_with_jane/recipe_pointer/proc/has_option_by_id(var/id) + if(!GLOB.cwj_step_dictionary["[id]"]) + return FALSE + var/datum/cooking_with_jane/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_with_jane/recipe_pointer/proc/traverse(var/id, var/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_with_jane/recipe_tracker/tracker = parent_ref.resolve() + var/datum/cooking_with_jane/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_with_jane/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 From f1d98b37c0bb06ce46bdca029ba11295f81cf4a3 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:29 +0300 Subject: [PATCH 08/22] Create food_overrides.dm --- code/modules/cooking/food_overrides.dm | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 code/modules/cooking/food_overrides.dm diff --git a/code/modules/cooking/food_overrides.dm b/code/modules/cooking/food_overrides.dm new file mode 100644 index 00000000000..0b68b8ac079 --- /dev/null +++ b/code/modules/cooking/food_overrides.dm @@ -0,0 +1,21 @@ +/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!")) From a57d271e117d668fc8d5aec65aeb26347ff63d2e Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:42 +0300 Subject: [PATCH 09/22] added recipes --- code/modules/cooking/recipes/_read_me.dm | 123 ++ .../cooking/recipes/example_recipes.dm | 122 ++ code/modules/cooking/recipes/recipe.dm | 1908 +++++++++++++++++ code/modules/cooking/recipes/recipe_donuts.dm | 61 + .../cooking/recipes/recipes_to_covert.dm | 154 ++ 5 files changed, 2368 insertions(+) create mode 100644 code/modules/cooking/recipes/_read_me.dm create mode 100644 code/modules/cooking/recipes/example_recipes.dm create mode 100644 code/modules/cooking/recipes/recipe.dm create mode 100644 code/modules/cooking/recipes/recipe_donuts.dm create mode 100644 code/modules/cooking/recipes/recipes_to_covert.dm diff --git a/code/modules/cooking/recipes/_read_me.dm b/code/modules/cooking/recipes/_read_me.dm new file mode 100644 index 00000000000..33512aa7770 --- /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/breadslice) + + 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/breadslice) + + + 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/breadslice, 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..c0cbd42aabf --- /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_with_jane/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/breadslice, 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/breadslice, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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/breadslice, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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/breadslice, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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/breadslice, qmod=0.5) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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/breadslice, qmod=0.5) + ) + appear_in_default_catalog = FALSE + + +/datum/cooking_with_jane/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/breadslice, 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/breadslice) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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/breadslice) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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/breadslice) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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/breadslice, 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, "sodiumchloride", 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice) + ) + appear_in_default_catalog = FALSE + +/datum/cooking_with_jane/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_with_jane/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.dm b/code/modules/cooking/recipes/recipe.dm new file mode 100644 index 00000000000..08ac88559fd --- /dev/null +++ b/code/modules/cooking/recipes/recipe.dm @@ -0,0 +1,1908 @@ + +//Example Recipes +/datum/cooking_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_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, "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, "capsaicin", 5, base=6, prod_desc="The steak was Spiced with chili powder."), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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/meatball, qmod=0.5), + list(CWJ_ADD_REAGENT, "thermite", 1) //So it cooks inhand, totally. + ) + +/datum/cooking_with_jane/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, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/cooked_meatball + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/meatball + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawmeatball, qmod=0.5), + list(CWJ_ADD_REAGENT, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_LO, 20 SECONDS) + ) + +/datum/cooking_with_jane/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, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_GRILL, J_LO, 10 SECONDS) + ) + +/datum/cooking_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_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, "honey", 3, base=3), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, "capsaicin", 5, base=6, prod_desc="The chicken was Spiced with chili powder."), + list(CWJ_ADD_REAGENT_OPTIONAL, "lemonjuice", 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_with_jane/recipe/porkchops + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/porkchops + + 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, "sodiumchloride", 1), + list(CWJ_ADD_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, "capsaicin", 5, base=6, prod_desc="The pork was Spiced with chili powder."), + // list(CWJ_ADD_REAGENT_OPTIONAL, "pineapplejuice", 5, remain_percent=0.1, base=5, prod_desc="The pork was rosted in pineapple juice."), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 5, remain_percent=0.1 ,base=3, prod_desc="The pork was glazed with honey"), + // list(CWJ_ADD_REAGENT_OPTIONAL, "bbqsauce", 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_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_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_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT, "blackpepper", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/bacon + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/bacon + step_builder = list( + list(CWJ_ADD_REAGENT, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT, "cornoil", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawbacon, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/baconegg + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/baconeggs + step_builder = list( + list(CWJ_ADD_REAGENT, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT, "cornoil", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/friedegg, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) + +/datum/cooking_with_jane/recipe/benedict + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/benedict + step_builder = list( + list(CWJ_ADD_REAGENT, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT, "cornoil", 1), + list(CWJ_ADD_REAGENT, "egg", 3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bacon, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/omelette + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/omelette + step_builder = list( + list(CWJ_ADD_REAGENT, "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, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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, "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_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT, "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_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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/rawmeatball), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawbacon), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + list(CWJ_USE_GRILL, J_MED, 10 SECONDS) + ) + +/datum/cooking_with_jane/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/xenomeat, qmod=0.5), + list(CWJ_ADD_REAGENT, "soysauce", 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/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/meat/carp, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/carp, qmod=0.5), + list(CWJ_ADD_REAGENT, "soysauce", 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT, "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_with_jane/recipe/kabob + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/kabob + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/stack/rods = 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/humankabob + cooking_container = GRILL + product_type = /obj/item/reagent_containers/food/kabob + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/stack/rods = 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/human, qmod=0.5), + 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_with_jane/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, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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_with_jane/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/xenomeat), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xenomeat), + 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_with_jane/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_with_jane/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_with_jane/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, "milk", 2), + list(CWJ_ADD_REAGENT, "sugar", 15), + list(CWJ_ADD_PRODUCE, "banana", 1), + list(CWJ_USE_OVEN, J_MED, 40 SECONDS) + ) +/datum/cooking_with_jane/recipe/baguette + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/baguette + step_builder = list( + list(CWJ_ADD_REAGENT, "blackpepper", 1), + list(CWJ_ADD_REAGENT, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/cracker + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/cracker + step_builder = list( + list(CWJ_ADD_REAGENT, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "woodpulp", 1), + list(CWJ_USE_OVEN, J_HI, 5 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 1), + list(CWJ_USE_OVEN, J_HI, 5 SECONDS) + ) + +/datum/cooking_with_jane/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/breadslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "wine", 5) + ) + +/datum/cooking_with_jane/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, "sugar", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), + list(CWJ_ADD_REAGENT, "milk", 5, base=1), + list(CWJ_ADD_REAGENT, "flour", 5, base=1), + list(CWJ_USE_OVEN, J_LO, 15 SECONDS) + ) + +/datum/cooking_with_jane/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, "sugar", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), + list(CWJ_ADD_REAGENT, "milk", 5, base=1), + list(CWJ_ADD_REAGENT, "flour", 5, base=1), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) + +/datum/cooking_with_jane/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, "lean", 5, base=6, remain_percent=0.5, prod_desc="Normally not for breakfast."), + list(CWJ_ADD_REAGENT_OPTIONAL, "mindbreaker", 5, base=6, remain_percent=0.1, prod_desc="Not for waking up to."), + // list(CWJ_ADD_REAGENT_OPTIONAL, "psi_juice", 5, base=6, prod_desc="For when you wake up feeling droggy still."), + CWJ_END_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT, "sugar", 5), + list(CWJ_USE_OVEN, J_LO, 5 SECONDS) + ) + +/datum/cooking_with_jane/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/breadslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "cherryjelly", 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/recipe/amanitajellytoast + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jelliedtoast/amanita + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/jelly/amanita, qmod=0.5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/recipe/slimetoast + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jelliedtoast/slime + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "slimejelly", 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT, "blackpepper", 1), + list(CWJ_ADD_REAGENT, "water", 5), + ) + +/datum/cooking_with_jane/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_with_jane/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, "milk", 5), + list(CWJ_ADD_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_with_jane/recipe/boiledrice + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledrice + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT, "rice", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/ricepudding + cooking_container = BOWL + product_type = /obj/item/reagent_containers/food/ricepudding + step_builder = list( + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "cream", 10), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledrice, qmod=0.5) + ) + +//**Burgers**// +/datum/cooking_with_jane/recipe/burger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/monkeyburger + + 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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/vital/brain) + ) + +/datum/cooking_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/xenomeat) + ) + +/datum/cooking_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/carp) + ) + +/datum/cooking_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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/monkeyburger, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), + list(CWJ_ADD_REAGENT_OPTIONAL, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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, "cherryjelly", 5) + ) + +/datum/cooking_with_jane/recipe/amanitajellyburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellyburger/amanita + + 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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/jelly/amanita, qmod=0.5) + ) + +/datum/cooking_with_jane/recipe/slimeburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellyburger/slime + + 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, "ketchup", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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, "slimejelly", 5) + ) + +//**Sandwiches**// +/datum/cooking_with_jane/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/breadslice, 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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + ) + +/datum/cooking_with_jane/recipe/slimesandwich + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellysandwich/slime + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "slimejelly", 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + ) + +/datum/cooking_with_jane/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/breadslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "cherryjelly", 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + ) + +/datum/cooking_with_jane/recipe/amanitajellysandwich + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jellysandwich/amanita + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/jelly/amanita, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + ) + +/datum/cooking_with_jane/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/breadslice, 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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + ) + +/datum/cooking_with_jane/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/breadslice, 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/breadslice, qmod=0.5), + list(CWJ_USE_GRILL, J_LO, 5 SECONDS) + ) + +/datum/cooking_with_jane/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) + ) + +//**Erisian Cuisine**// +//Left out due to never having existed previously: Spider burgers, Kraftwerk, Benzin +/datum/cooking_with_jane/recipe/boiled_roach_egg + cooking_container = POT + product_type = /obj/item/reagent_containers/food/roach_egg + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/roach_egg, qmod=0.5), + list(CWJ_ADD_REAGENT, "water", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/kampferburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/kampferburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat) + ) + +/datum/cooking_with_jane/recipe/seucheburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/seucheburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/seuche) + ) + +/datum/cooking_with_jane/recipe/panzerburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/panzerburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/panzer) + ) + +/datum/cooking_with_jane/recipe/jagerburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/jagerburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/jager) + ) + +/datum/cooking_with_jane/recipe/bigroachburger //Difference: Requires boiled roach egg + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/bigroachburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/roach_egg), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/seuche), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/panzer), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/jager) + ) + +/datum/cooking_with_jane/recipe/fuhrerburger //Difference: Requires boiled roach egg + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/fuhrerburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/roach_egg), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/fuhrer) + ) + +/datum/cooking_with_jane/recipe/kaiserburger //Difference: Requires boiled roach egg + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/kaiserburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/roach_egg), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/kaiser) + ) + +/datum/cooking_with_jane/recipe/wormburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/wormburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/moecube/worm) + ) + +/datum/cooking_with_jane/recipe/geneburger + cooking_container = CUTTING_BOARD + product_type = /obj/item/reagent_containers/food/geneburger + + 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, "ketchup", 1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/moecube) + ) + +//**Pastas**// +/datum/cooking_with_jane/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, "flour", 1, base=1), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/recipe/boiledspaghetti + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledspaghetti + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/pastatomato + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/pastatomato + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/meatballspaghetti + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/meatballspaghetti + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/meatball, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato", qmod=0.4), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking_with_jane/recipe/spesslaw + cooking_container = PAN + product_type = /obj/item/reagent_containers/food/spesslaw + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/meatball, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), + list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato", qmod=0.4), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +//**Pizzas**// +/datum/cooking_with_jane/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_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, "water", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + list(CWJ_USE_OVEN, J_MED, 35 SECONDS) + ) + +/datum/cooking_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 5), + list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), + list(CWJ_USE_OVEN, J_MED, 35 SECONDS) + ) + +/datum/cooking_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "woodpulp", 1, base=1), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 1, base=1), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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/xenomeat, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1, base=1), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "sugar", 5, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "sugar", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "sugar", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "amatoxin", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "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_with_jane/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, "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_with_jane/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, "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_with_jane/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, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "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/meatball, qmod=0.5), + ) +//**Soups**// Possibly replaced by Handyman's Soup project, which'll be based on cauldron soup kitchen aesthetic +/datum/cooking_with_jane/recipe/tomatosoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/tomatosoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_PRODUCE, "tomato"), + CWJ_BEGIN_EXCLUSIVE_OPTIONS, + list(CWJ_ADD_REAGENT_OPTIONAL, "cream", 5, base=3, prod_desc="The soup turns a lighter red and thickens with the cream."), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/meatballsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/meatballsoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, 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_with_jane/recipe/vegetablesoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/vegetablesoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/nettlesoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/nettlesoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_PRODUCE, "potato"), + list(CWJ_ADD_PRODUCE, "nettle"), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking_with_jane/recipe/wishsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/wishsoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 20), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +/datum/cooking_with_jane/recipe/coldchili + cooking_container = POT + product_type = /obj/item/reagent_containers/food/coldchili + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/hotchili + cooking_container = POT + product_type = /obj/item/reagent_containers/food/coldchili + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/bearchili + cooking_container = POT + product_type = /obj/item/reagent_containers/food/bearchili + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_PRODUCE, "chili"), + list(CWJ_ADD_PRODUCE, "tomato"), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/bearmeat, qmod=0.5), + list(CWJ_USE_STOVE, J_LO, 30 SECONDS) + ) + +/datum/cooking_with_jane/recipe/stew + cooking_container = POT + product_type = /obj/item/reagent_containers/food/stew + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/milosoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/milosoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/beetsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/beetsoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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, "cream", 5, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/mushroomsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/mushroomsoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT, "cream", 5), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_REAGENT, "sodiumchloride", 1), + list(CWJ_ADD_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_with_jane/recipe/mysterysoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/mysterysoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/recipe/bloodsoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/bloodsoup + step_builder = list( + list(CWJ_ADD_REAGENT, "blood", 30), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/slimesoup + cooking_container = POT + product_type = /obj/item/reagent_containers/food/slimesoup + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT, "slimejelly", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 15 SECONDS) + ) + +/datum/cooking_with_jane/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, "flour", 5), + list(CWJ_ADD_REAGENT, "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_with_jane/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, "flour", 5), + list(CWJ_ADD_REAGENT, "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_with_jane/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, "milk", 2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/butterslice, base=10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_USE_TOOL, QUALITY_HAMMERING, 15) + ) + +/datum/cooking_with_jane/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, "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_with_jane/recipe/fries + cooking_container = PAN + 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, "cornoil", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) + +/datum/cooking_with_jane/recipe/cheesyfries + cooking_container = PAN + 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_with_jane/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_with_jane/recipe/stewedsoymeat + cooking_container = POT + product_type = /obj/item/reagent_containers/food/stewedsoymeat + step_builder = list( + list(CWJ_ADD_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, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) + +//**Cakes**// +/datum/cooking_with_jane/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, "sugar", 15), + list(CWJ_ADD_REAGENT, "flour", 15), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_REAGENT, "egg", 9), + list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "coco", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 1, base=1), + list(CWJ_USE_STOVE, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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/vital/brain, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/butterstick, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 5), + list(CWJ_USE_OVEN, J_MED, 30 SECONDS) + ) + +/datum/cooking_with_jane/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, "sugar", 15), + list(CWJ_ADD_REAGENT, "coco", 10), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_REAGENT, "egg", 9), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/chocolatebar, qmod=0.5), + list(CWJ_ADD_REAGENT_OPTIONAL, "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_with_jane/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, "sugar", 5), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT, "sugar", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + list(CWJ_USE_STOVE, J_LO, 15 SECONDS) + ) + +/datum/cooking_with_jane/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, "cornoil", 2), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_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_with_jane/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, "sugar", 5), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_REAGENT, "flour", 10), + list(CWJ_ADD_REAGENT, "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_with_jane/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, "water", 5), + list(CWJ_ADD_REAGENT, "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_with_jane/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, "cornoil", 2), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_USE_STOVE, J_LO, 5 SECONDS) + ) + +//UNSORTED +//missing: spacylibertyduff +/datum/cooking_with_jane/recipe/boiledslimeextract + cooking_container = POT + product_type = /obj/item/reagent_containers/food/boiledslimecore + step_builder = list( + list(CWJ_ADD_REAGENT, "water", 10), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_ITEM, /obj/item/slime_extract, qmod=0.5), + list(CWJ_USE_STOVE, J_HI, 15 SECONDS) + ) diff --git a/code/modules/cooking/recipes/recipe_donuts.dm b/code/modules/cooking/recipes/recipe_donuts.dm new file mode 100644 index 00000000000..a1c0b26f555 --- /dev/null +++ b/code/modules/cooking/recipes/recipe_donuts.dm @@ -0,0 +1,61 @@ +/datum/cooking_with_jane/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, "sugar", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) + ) + +/datum/cooking_with_jane/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, "cornoil", 1), + list(CWJ_ADD_REAGENT, "sugar", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + list(CWJ_USE_OVEN, J_LO, 10 SECONDS) + ) + +/datum/cooking_with_jane/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, "cornoil", 1), + list(CWJ_ADD_REAGENT, "berryjuice", 5), + list(CWJ_ADD_REAGENT, "sugar", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + list(CWJ_USE_OVEN, J_LO, 20 SECONDS) + ) + +/datum/cooking_with_jane/recipe/slime_jellydonut + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/donut/slimejelly + step_builder = list( + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/doughslice, qmod=0.5), + list(CWJ_ADD_REAGENT, "cornoil", 1), + list(CWJ_ADD_REAGENT, "slimejelly", 5), + list(CWJ_ADD_REAGENT, "sugar", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + list(CWJ_USE_OVEN, J_LO, 20 SECONDS) + ) + +/datum/cooking_with_jane/recipe/cinnamonroll + cooking_container = OVEN + product_type = /obj/item/reagent_containers/food/cinnamonroll + 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, "cinnamonpowder", 5), + list(CWJ_ADD_REAGENT, "sugar", 10), + list(CWJ_ADD_REAGENT, "milk", 5), + list(CWJ_ADD_REAGENT, "egg", 3), + list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + list(CWJ_USE_OVEN, J_LO, 20 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..802df71a1a2 --- /dev/null +++ b/code/modules/cooking/recipes/recipes_to_covert.dm @@ -0,0 +1,154 @@ + + +/datum/recipe/dumplings //Missing Recipe + fruit = list("cabbage" = 1) // A recipe that ACTUALLY uses cabbage. + reagents = list("soysauce" = 5, "sodiumchloride" = 1, "blackpepper" = 1, "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 + items = list( + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/meatball + ) + result = /obj/item/reagent_containers/food/donkpocket //SPECIAL + proc/warm_up(var/obj/item/reagent_containers/food/donkpocket/being_cooked) + being_cooked.heat() + make_food(var/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(var/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/soylenviridians + fruit = list("soybeans" = 1) + reagents = list("flour" = 10) + result = /obj/item/reagent_containers/food/soylenviridians + +/datum/recipe/soylentgreen + reagents = list("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("frostoil" = 5, "capsaicin" = 5, "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/meat/carp + ) + result = /obj/item/reagent_containers/food/cubancarp + +/datum/recipe/fortunecookie + reagents = list("sugar" = 5) + items = list( + /obj/item/reagent_containers/food/doughslice, + /obj/item/paper, + ) + result = /obj/item/reagent_containers/food/fortunecookie + make_food(var/obj/container as obj) + var/obj/item/paper/paper = locate() in container + paper.loc = null //prevent deletion + var/obj/item/reagent_containers/food/fortunecookie/being_cooked = ..(container) + paper.loc = being_cooked + being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn + return being_cooked + check_items(var/obj/container as obj) + . = ..() + if (.) + var/obj/item/paper/paper = locate() in container + if (!paper || !paper.info) + return 0 + return . + +/datum/recipe/friedchicken + reagents = list("cornoil" = 5, "sodiumchloride" = 1, "blackpepper" = 1, "flour" = 5) + items = list(/obj/item/reagent_containers/food/chickenbreast) + result = /obj/item/reagent_containers/food/friedchicken + +/datum/recipe/tonkatsu + reagents = list("sodiumchloride" = 1, "flour" = 5, "egg" = 3, "cornoil" = 2) + items = list( + /obj/item/reagent_containers/food/meat/pork, + ) + result = /obj/item/reagent_containers/food/tonkatsu + +/datum/recipe/spacylibertyduff + reagents = list("water" = 5, "vodka" = 5, "psilocybin" = 5) + result = /obj/item/reagent_containers/food/spacylibertyduff + +/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("sodiumchloride" = 1, "blackpepper" = 1, "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/fishfingers, + ) + result = /obj/item/reagent_containers/food/fishandchips + +/datum/recipe/katsudon + reagents = list("egg" = 3, "soysauce" = 5) + items = list( + /obj/item/reagent_containers/food/boiledrice, + /obj/item/reagent_containers/food/tonkatsu, + ) + result = /obj/item/reagent_containers/food/katsudon + +/datum/recipe/fishfingers + reagents = list("flour" = 5, "egg" = 3, "cornoil" = 2) + items = list( + /obj/item/reagent_containers/food/meat/carp, + ) + result = /obj/item/reagent_containers/food/fishfingers + +/datum/recipe/honey_bun + reagents = list("sugar" = 3, "honey" = 5, "cream" = 5) + items = list( + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/butterslice, + ) + result = /obj/item/reagent_containers/food/honeybuns + +/datum/recipe/honey_pudding + reagents = list("sugar" = 3, "honey" = 15, "cream" = 5) + items = list( + /obj/item/reagent_containers/food/chocolatebar, + ) + result = /obj/item/reagent_containers/food/honeypudding From c0953826e36baf1a3d204e91283e5fedc0ddf6f8 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:36:55 +0300 Subject: [PATCH 10/22] added steps --- code/modules/cooking/step_defines.dm | 105 ++++++++++++++++++ code/modules/cooking/step_types/add_item.dm | 73 ++++++++++++ .../modules/cooking/step_types/add_produce.dm | 64 +++++++++++ .../modules/cooking/step_types/add_reagent.dm | 83 ++++++++++++++ .../cooking/step_types/recipe_start.dm | 11 ++ code/modules/cooking/step_types/use_grill.dm | 67 +++++++++++ code/modules/cooking/step_types/use_item.dm | 42 +++++++ code/modules/cooking/step_types/use_oven.dm | 65 +++++++++++ code/modules/cooking/step_types/use_stove.dm | 66 +++++++++++ code/modules/cooking/step_types/use_tool.dm | 46 ++++++++ 10 files changed, 622 insertions(+) create mode 100644 code/modules/cooking/step_defines.dm create mode 100644 code/modules/cooking/step_types/add_item.dm create mode 100644 code/modules/cooking/step_types/add_produce.dm create mode 100644 code/modules/cooking/step_types/add_reagent.dm create mode 100644 code/modules/cooking/step_types/recipe_start.dm create mode 100644 code/modules/cooking/step_types/use_grill.dm create mode 100644 code/modules/cooking/step_types/use_item.dm create mode 100644 code/modules/cooking/step_types/use_oven.dm create mode 100644 code/modules/cooking/step_types/use_stove.dm create mode 100644 code/modules/cooking/step_types/use_tool.dm diff --git a/code/modules/cooking/step_defines.dm b/code/modules/cooking/step_defines.dm new file mode 100644 index 00000000000..2c1c87da2e9 --- /dev/null +++ b/code/modules/cooking/step_defines.dm @@ -0,0 +1,105 @@ +//A step in a recipe, whether optional or required +/datum/cooking_with_jane/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_with_jane/recipe_step/next_step + + //The previous required step for the current recipe + var/datum/cooking_with_jane/recipe_step/previous_step + + var/auto_complete_enabled = FALSE //If the step can be completed without any further input. + + + +/datum/cooking_with_jane/recipe_step/New(var/datum/cooking_with_jane/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_with_jane/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_with_jane/recipe_step/proc/calculate_quality(var/obj/added_item, var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) + return 0 + +//Check if the conditions of a recipe step was followed correctly. +/datum/cooking_with_jane/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_with_jane/recipe_step/proc/in_option_chain(var/datum/cooking_with_jane/recipe_step/step) + if(!step) + return FALSE + if(!(flags & CWJ_IS_OPTION_CHAIN) || !(step.flags & CWJ_IS_OPTION_CHAIN)) + return FALSE + + var/datum/cooking_with_jane/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_with_jane/recipe_step/proc/clamp_quality(var/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_with_jane/recipe_step/proc/get_step_result_text(var/obj/used_obj, step_quality) + if(custom_result_desc) + return custom_result_desc + else + return "skip" + +/datum/cooking_with_jane/recipe_step/proc/follow_step(var/obj/added_item, var/obj/item/reagent_containers/cooking_with_jane/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_with_jane/recipe_step/proc/is_complete(var/obj/added_item, var/datum/cooking_with_jane/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..53d98ca1dc0 --- /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_with_jane/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_with_jane/recipe_step/add_item/New(var/item_type, var/datum/cooking_with_jane/recipe/our_recipe) + + #ifdef CWJ_DEBUG + if(!ispath(item_type, /obj/item)) + log_debug("/datum/cooking_with_jane/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_with_jane/recipe_step/add_item/New(): item [item_type] couldn't be created.") + #endif + ..(our_recipe) + + +/datum/cooking_with_jane/recipe_step/add_item/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/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_with_jane/recipe_step/add_item/calculate_quality(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + var/raw_quality = added_item?:food_quality * inherited_quality_modifier + return clamp_quality(raw_quality) + +/datum/cooking_with_jane/recipe_step/add_item/follow_step(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + #ifdef CWJ_DEBUG + log_debug("Called: /datum/cooking_with_jane/recipe_step/add_item/follow_step") + #endif + var/obj/item/container = tracker.holder_ref.resolve() + if(container) + if(usr.canUnEquip(added_item)) + usr.unEquip(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..831a5573ce4 --- /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_with_jane/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_with_jane/recipe_step/add_produce/New(var/produce, var/datum/cooking_with_jane/recipe/our_recipe) + if(!plant_controller) + CRASH("/datum/cooking_with_jane/recipe_step/add_produce/New: Plant controller not initialized! Exiting.") + if(produce && plant_controller && plant_controller.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 = plant_controller.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(plant_controller.plant_icon_cache[icon_key]) + tooltip_image = plant_controller.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_with_jane/recipe_step/add_produce/New: Seed [produce] not found. Exiting.") + ..(base_quality_award, our_recipe) + +/datum/cooking_with_jane/recipe_step/add_produce/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/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_with_jane/recipe_step/add_produce/calculate_quality(var/obj/added_item, var/datum/cooking_with_jane/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_with_jane/recipe_step/add_produce/follow_step(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + #ifdef CWJ_DEBUG + log_debug("Called: /datum/cooking_with_jane/recipe_step/add_produce/follow_step") + #endif + var/obj/item/container = tracker.holder_ref.resolve() + if(container) + if(usr.canUnEquip(added_item)) + usr.unEquip(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..2c14da9b4ee --- /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_with_jane/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_with_jane/recipe_step/add_reagent/New(var/reagent_id, var/amount, var/datum/cooking_with_jane/recipe/our_recipe) + + var/datum/reagent/global_reagent = GLOB.chemical_reagents_list[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_with_jane/recipe_step/add/reagent/New(): Reagent [reagent_id] not found. Recipe: [our_recipe]") + + ..(our_recipe) + + +/datum/cooking_with_jane/recipe_step/add_reagent/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/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.reagent_flags & OPENCONTAINER)) + 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_with_jane/recipe/proc/calculate_reagent_quality +/datum/cooking_with_jane/recipe_step/add_reagent/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/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_with_jane/recipe_step/add_reagent/follow_step(var/obj/used_item, var/datum/cooking_with_jane/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_with_jane/recipe_step/add_reagent/is_complete(var/obj/used_item, var/datum/cooking_with_jane/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..a03b5c953a4 --- /dev/null +++ b/code/modules/cooking/step_types/recipe_start.dm @@ -0,0 +1,11 @@ +//The default starting step. +//Doesn't do anything, just holds the item. + +/datum/cooking_with_jane/recipe_step/start + class = CWJ_START + var/required_container + +/datum/cooking_with_jane/recipe_step/start/New(var/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..45b47d6a54e --- /dev/null +++ b/code/modules/cooking/step_types/use_grill.dm @@ -0,0 +1,67 @@ +//A cooking step that involves adding a reagent to the food. +/datum/cooking_with_jane/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_with_jane/recipe_step/use_grill/New(var/set_heat, var/set_time, var/datum/cooking_with_jane/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_with_jane/recipe_step/use_grill/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + + if(!istype(used_item, /obj/machinery/cooking_with_jane/grill)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated prior to object creation +/datum/cooking_with_jane/recipe_step/use_grill/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() + + var/obj/machinery/cooking_with_jane/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_with_jane/recipe_step/use_grill/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + return CWJ_SUCCESS + +/datum/cooking_with_jane/recipe_step/use_grill/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + + var/obj/item/reagent_containers/cooking_with_jane/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..726f47df9ee --- /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_with_jane/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_with_jane/recipe_step/use_item/New(var/item_type, var/datum/cooking_with_jane/recipe/our_recipe) + #ifdef CWJ_DEBUG + if(!ispath(item_type)) + log_debug("/datum/cooking_with_jane/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_with_jane/recipe_step/add_item/New(): item [item_type] couldn't be created.") + #endif + ..(our_recipe) + + +/datum/cooking_with_jane/recipe_step/use_item/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/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_with_jane/recipe_step/use_item/calculate_quality(var/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..985acfd0de9 --- /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_with_jane/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_with_jane/recipe_step/use_oven/New(var/set_heat, var/set_time, var/datum/cooking_with_jane/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_with_jane/recipe_step/use_oven/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + + if(!istype(used_item, /obj/machinery/cooking_with_jane/oven)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated prior to object creation +/datum/cooking_with_jane/recipe_step/use_oven/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() + + var/obj/machinery/cooking_with_jane/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_with_jane/recipe_step/use_oven/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + return CWJ_SUCCESS + +/datum/cooking_with_jane/recipe_step/use_oven/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + + var/obj/item/reagent_containers/cooking_with_jane/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..e2561ac8f92 --- /dev/null +++ b/code/modules/cooking/step_types/use_stove.dm @@ -0,0 +1,66 @@ +//A cooking step that involves adding a reagent to the food. +/datum/cooking_with_jane/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_with_jane/recipe_step/use_stove/New(var/set_heat, var/set_time, var/datum/cooking_with_jane/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_with_jane/recipe_step/use_stove/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + + if(!istype(used_item, /obj/machinery/cooking_with_jane/stove)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +//Reagents are calculated prior to object creation +/datum/cooking_with_jane/recipe_step/use_stove/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() + + var/obj/machinery/cooking_with_jane/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_with_jane/recipe_step/use_stove/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + return CWJ_SUCCESS + +/datum/cooking_with_jane/recipe_step/use_stove/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + + var/obj/item/reagent_containers/cooking_with_jane/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..9edf6ddfc8b --- /dev/null +++ b/code/modules/cooking/step_types/use_tool.dm @@ -0,0 +1,46 @@ +//A cooking step that involves using an item on the food. +/datum/cooking_with_jane/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_with_jane/recipe_step/use_tool/New(var/type, var/quality, var/datum/cooking_with_jane/recipe/our_recipe) + + desc = "Use \a [type] tool of quality [quality] or higher." + + tool_type = type + tool_quality = quality + + ..(our_recipe) + + +/datum/cooking_with_jane/recipe_step/use_tool/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) + if(!istype(added_item, /obj/item/tool )) + return CWJ_CHECK_INVALID + + var/obj/item/tool/our_tool = added_item + if(!our_tool.has_quality(tool_type)) + return CWJ_CHECK_INVALID + + return CWJ_CHECK_VALID + +/datum/cooking_with_jane/recipe_step/use_tool/follow_step(var/obj/added_item, var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) + var/obj/item/tool/our_tool = added_item + if(our_tool.worksound && our_tool.worksound != NO_WORKSOUND) + playsound(usr.loc, our_tool.worksound, 50, 1) + to_chat(usr, SPAN_NOTICE("You use the [added_item] according to the recipe.")) + + 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_with_jane/recipe_step/use_tool/calculate_quality(var/obj/added_item) + var/obj/item/tool/our_tool = added_item + var/raw_quality = (our_tool.get_tool_quality(tool_type) - tool_quality) * inherited_quality_modifier + return clamp_quality(raw_quality) From 279ba2c443f63e8f5bf3cf7612b30cb5110af140 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:37:04 +0300 Subject: [PATCH 11/22] cooking items --- .../cooking_items/cooking_containers.dm | 364 ++++++++++++++++++ code/modules/cooking/cooking_items/dollop.dm | 24 ++ .../modules/cooking/cooking_items/frosting.dm | 87 +++++ code/modules/cooking/cooking_items/spatula.dm | 11 + 4 files changed, 486 insertions(+) create mode 100644 code/modules/cooking/cooking_items/cooking_containers.dm create mode 100644 code/modules/cooking/cooking_items/dollop.dm create mode 100644 code/modules/cooking/cooking_items/frosting.dm create mode 100644 code/modules/cooking/cooking_items/spatula.dm 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..b1ae309ef7d --- /dev/null +++ b/code/modules/cooking/cooking_items/cooking_containers.dm @@ -0,0 +1,364 @@ +//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/cooking_with_jane/cooking_container + icon = 'icons/obj/cwj_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_with_jane/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 + + reagent_flags = OPENCONTAINER | NO_REACT + 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/cooking_with_jane/cooking_container/Initialize() + .=..() + appearance_flags |= KEEP_TOGETHER + + +/obj/item/reagent_containers/cooking_with_jane/cooking_container/examine(var/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/cooking_with_jane/cooking_container/proc/get_content_info() + var/string = "It contains:
  • " + string += jointext(contents, "
  • ") + "
" + return string + +/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/get_reagent_info() + return "It contains [reagents.total_volume] units of reagents." + +/obj/item/reagent_containers/cooking_with_jane/cooking_container/attackby(var/obj/item/used_item, var/mob/user) + + #ifdef CWJ_DEBUG + log_debug("cooking_container/attackby() called!") + #endif + + if(istype(used_item, /obj/item/tool/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/cooking_with_jane/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/cooking_with_jane/cooking_container/afterattack(var/obj/target, var/mob/user, var/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/cooking_with_jane/cooking_container/proc/process_item(var/obj/I, var/mob/user, var/lower_quality_on_fail = 0, var/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_with_jane/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_with_jane/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/cooking_with_jane/cooking_container/proc/handle_burning() + return + +//TODO: Handle the contents of the container lighting on actual fire. +/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/handle_ignition() + return FALSE + +/obj/item/reagent_containers/cooking_with_jane/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/cooking_with_jane/cooking_container/proc/do_empty(mob/user, var/atom/target = null, var/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/cooking_with_jane/cooking_container/AltClick(var/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/cooking_container/proc/label(var/number, var/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/cooking_with_jane/cooking_container/update_icon() + cut_overlays() + 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) + add_overlay(image(src.icon, icon_state=lip, layer=ABOVE_OBJ_LAYER)) + +/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/add_to_visible(var/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/cooking_with_jane/cooking_container/proc/remove_from_visible(var/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/cooking_with_jane/cooking_container/plate + icon = 'icons/obj/cwj_cooking/eris_kitchen.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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/weapons/smash.ogg' + appliancetype = PAN + +/obj/item/reagent_containers/cooking_with_jane/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/weapons/smash.ogg' + removal_penalty = 5 + appliancetype = POT + w_class = ITEM_SIZE_BULKY + +/obj/item/reagent_containers/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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/cooking_with_jane/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..151d3009944 --- /dev/null +++ b/code/modules/cooking/cooking_items/dollop.dm @@ -0,0 +1,24 @@ +/obj/item/reagent_containers/food/dollop + name = "dollop of frosting" + desc = "A fresh serving of just frosting and nothing but frosting." + icon = 'icons/obj/cwj_cooking/kitchen.dmi' + icon_state = "dollop" + bitesize = 4 + var/reagent_id = "frosting" + preloaded_reagents = list("frosting" = 30) + +/obj/item/reagent_containers/food/dollop/New(var/loc, var/new_reagent_id = "frosting", var/new_amount = 30) + . = ..() + if(new_reagent_id) + var/reagent_name = get_reagent_name_by_id(reagent_id) + if(reagent_name) + name = "dollop of [reagent_name]" + desc = "A fresh serving of just [reagent_name] and nothing but [reagent_name]." + preloaded_reagents = list("[new_reagent_id]" = 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..aea474a7146 --- /dev/null +++ b/code/modules/cooking/cooking_items/spatula.dm @@ -0,0 +1,11 @@ +/obj/item/tool/shovel/spatula + name = "spatula" + desc = "A Hydrodynamic Spatula. Port and Starboard attachments not included." + icon = 'icons/obj/cwj_cooking/kitchen.dmi' + icon_state = "spatula" + item_state = "spatula" + force = WEAPON_FORCE_WEAK + w_class = ITEM_SIZE_SMALL + attack_verb = list("smacked", "slapped", "spanked", "whapped", "whacked") + hitsound = 'sound/weapons/punch3.ogg' + tool_qualities = list(QUALITY_SHOVELING = 5, QUALITY_DIGGING = 5, QUALITY_HAMMERING = 1) From b5d9e41ca3d2cc368bfb76ed6b7c1c91ea3856c2 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:37:25 +0300 Subject: [PATCH 12/22] containers & chemistry --- code/modules/reagents/Chemistry-Recipes.dm | 22 +++++++- .../reagents/reagent_containers/food/_food.dm | 51 +++++++++++++++++++ .../reagents/reagent_containers/food/meat.dm | 9 ++++ .../reagent_containers/food/sliceable.dm | 20 ++++++++ .../reagent_containers/food/unsorted.dm | 27 ++++++++++ .../reagent_containers/vessel/condiment.dm | 9 ++++ 6 files changed, 137 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index fb0e194260a..0375b2615b1 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/rawmeatball(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("sugar" = 5, "frostoil" = 5) + result_amount = 1 + +/datum/chemical_reaction/mint/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/reagent_containers/food/snacks/mint(location) + +/datum/chemical_reaction/candy_corn + result = null + required_reagents = list("sugar" = 5, "cornoil" = 5) + result_amount = 1 + +/datum/chemical_reaction/candy_corn/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/reagent_containers/food/snacks/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..d14828c1565 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,8 @@ 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)) + slice.food_quality = src.food_quality qdel(src) return return ..() @@ -276,3 +287,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..91cb6816a28 100644 --- a/code/modules/reagents/reagent_containers/food/meat.dm +++ b/code/modules/reagents/reagent_containers/food/meat.dm @@ -75,3 +75,12 @@ return else ..() + +/obj/item/reagent_containers/food/snacks/meat/chicken + name = "poultry" + desc = "Poultry meat, might be chicken or any other avian species." + icon_state = "meat_bird" + filling_color = "#EDA897" + preloaded_reagents = list("protein" = 8) + slice_path = /obj/item/reagent_containers/food/snacks/chickenbreast + slices_num = 4 diff --git a/code/modules/reagents/reagent_containers/food/sliceable.dm b/code/modules/reagents/reagent_containers/food/sliceable.dm index bf602a3f04d..8ad745a9103 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable.dm @@ -58,6 +58,26 @@ nutriment_amt = 1 bitesize = 2 +// Dough slice + rolling pin = flat dough slice +/obj/item/reagent_containers/food/snacks/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/snacks/flatdoughslice(src) + to_chat(user, "You flatten the dough slice.") + qdel(src) + +/obj/item/reagent_containers/food/snacks/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/snacks/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/salami name = "Salami" diff --git a/code/modules/reagents/reagent_containers/food/unsorted.dm b/code/modules/reagents/reagent_containers/food/unsorted.dm index 15152dafc54..497ef4285d1 100644 --- a/code/modules/reagents/reagent_containers/food/unsorted.dm +++ b/code/modules/reagents/reagent_containers/food/unsorted.dm @@ -420,6 +420,22 @@ startswith = list(/datum/reagent/nutriment/protein = 3) bitesize = 2 +/obj/item/reagent_containers/food/snacks/rawmeatball + name = "raw meatball" + desc = "A raw meatball." + icon = 'icons/obj/food_ingredients.dmi' + icon_state = "meatball_raw" + bitesize = 3 + center_of_mass = list("x"=16, "y"=15) + preloaded_reagents = list("protein" = 2) + taste_tag = list(MEAT_FOOD) + +/obj/item/reagent_containers/food/snacks/rawmeatball/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/material/kitchen/rollingpin)) + new /obj/item/reagent_containers/food/snacks/patty_raw(src) + to_chat(user, "You flatten the raw meatball.") + qdel(src) + /obj/item/reagent_containers/food/sausage name = "Sausage" desc = "A piece of mixed, long meat." @@ -2277,3 +2293,14 @@ 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 + cooked = TRUE + matter = list(MATERIAL_BIOMATTER = 5) diff --git a/code/modules/reagents/reagent_containers/vessel/condiment.dm b/code/modules/reagents/reagent_containers/vessel/condiment.dm index a9fbe9b826d..567b57301dc 100644 --- a/code/modules/reagents/reagent_containers/vessel/condiment.dm +++ b/code/modules/reagents/reagent_containers/vessel/condiment.dm @@ -346,3 +346,12 @@ /obj/item/reagent_containers/vessel/condiment/pack/creamer name = "creamer" startswith = list(/datum/reagent/drink/milk/cream) + +/obj/item/reagent_containers/food/condiment/soysauce + preloaded_reagents = list("soysauce" = 50) + +/obj/item/reagent_containers/food/condiment/coldsauce + preloaded_reagents = list("frostoil" = 50) + +/obj/item/reagent_containers/food/condiment/cornoil + preloaded_reagents = list("cornoil" = 50) From a9de1c21db4917c81138837ad9a7584de88ad6bc Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:37:27 +0300 Subject: [PATCH 13/22] Update baystation12.dme --- baystation12.dme | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/baystation12.dme b/baystation12.dme index 2827ded638c..f8022228532 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" @@ -1842,6 +1844,43 @@ #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\cereal.dm" +#include "code\modules\cooking\coocking_appliances\cooking_circuits.dm" +#include "code\modules\cooking\coocking_appliances\fryer.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.dm" +#include "code\modules\cooking\recipes\recipe_donuts.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" From 3722b0db5f82aea2a0744062f9162c32d292cd55 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 21:38:26 +0300 Subject: [PATCH 14/22] Update _food.dm --- code/modules/reagents/reagent_containers/food/_food.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/food/_food.dm b/code/modules/reagents/reagent_containers/food/_food.dm index d14828c1565..44cedd4d42a 100644 --- a/code/modules/reagents/reagent_containers/food/_food.dm +++ b/code/modules/reagents/reagent_containers/food/_food.dm @@ -258,7 +258,8 @@ var/obj/slice = new slice_path(src.loc) reagents.trans_to_obj(slice, reagents_per_slice) if(istype(slice, /obj/item/reagent_containers/food)) - slice.food_quality = src.food_quality + var/obj/item/reagent_containers/food/F = slice + F.food_quality = src.food_quality qdel(src) return return ..() From 2d229365830c7ba2b3acd870473dc522acef0384 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 22 Jun 2024 22:09:43 +0300 Subject: [PATCH 15/22] i've fucked up --- baystation12.dme | 2 ++ code/_global_vars/lists/reagents.dm | 3 +++ code/_helpers/reagents.dm | 27 +++++++++++++++++++++ code/modules/reagents/Chemistry-Reagents.dm | 11 +++++++++ 4 files changed, 43 insertions(+) create mode 100644 code/_global_vars/lists/reagents.dm create mode 100644 code/_helpers/reagents.dm diff --git a/baystation12.dme b/baystation12.dme index f8022228532..e2a69e7a5dd 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -144,6 +144,7 @@ #include "code\_global_vars\lists\objects.dm" #include "code\_global_vars\lists\pipe_dispenser.dm" #include "code\_global_vars\lists\rcd.dm" +#include "code\_global_vars\lists\reagents.dm" #include "code\_global_vars\lists\russian.dm" #include "code\_global_vars\lists\traitor_uplink.dm" #include "code\_global_vars\lists\wheelcannon.dm" @@ -177,6 +178,7 @@ #include "code\_helpers\preferences.dm" #include "code\_helpers\pronouns.dm" #include "code\_helpers\radio.dm" +#include "code\_helpers\reagents.dm" #include "code\_helpers\roundend.dm" #include "code\_helpers\russian.dm" #include "code\_helpers\sanitize_values.dm" diff --git a/code/_global_vars/lists/reagents.dm b/code/_global_vars/lists/reagents.dm new file mode 100644 index 00000000000..b57485ab0f4 --- /dev/null +++ b/code/_global_vars/lists/reagents.dm @@ -0,0 +1,3 @@ +GLOBAL_LIST_EMPTY(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions +GLOBAL_LIST_EMPTY(chemical_reactions_list_by_result) //list of all /datum/chemical_reaction datums. But this one indexed by chemical result instead of reagents +GLOBAL_LIST_EMPTY(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff diff --git a/code/_helpers/reagents.dm b/code/_helpers/reagents.dm new file mode 100644 index 00000000000..d3532d5571f --- /dev/null +++ b/code/_helpers/reagents.dm @@ -0,0 +1,27 @@ +/proc/get_reagent_name_by_id(id) + if(!GLOB.chemical_reagents_list.len) + return "REAGENTS NOT INITIALISED" + var/datum/reagent/D = GLOB.chemical_reagents_list[id] + if(D) + return D.name + + return "REAGENT NOT FOUND" + +/proc/get_reagent_type_by_id(id) + if(!GLOB.chemical_reagents_list.len) + return "REAGENTS NOT INITIALISED" + var/datum/reagent/D = GLOB.chemical_reagents_list[id] + if(D) + return D.type + + return "REAGENT NOT FOUND" + +/proc/is_reagent_with_id_exist(id) + if(!GLOB.chemical_reagents_list.len) + error("REAGENTS NOT INITIALISED") + return FALSE + var/datum/reagent/D = GLOB.chemical_reagents_list[id] + if(D) + return TRUE + + return FALSE diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 3e94743865f..0bb78de1ec3 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 @@ -31,6 +32,16 @@ if(!istype(holder)) CRASH("Invalid reagents holder: [log_info_line(holder)]") src.holder = holder + + if(!GLOB.chemical_reagents_list) + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + var/paths = typesof(/datum/reagent) - /datum/reagent + GLOB.chemical_reagents_list = list() + for(var/path in paths) + var/datum/reagent/D = new path() + if(!D.name) + continue + GLOB.chemical_reagents_list[D.id] = D ..() /datum/reagent/proc/remove_self(amount) // Shortcut From 6e8b414b496e942b1817d7172a1ef43bc4b91e19 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 27 Jun 2024 23:31:01 +0300 Subject: [PATCH 16/22] i don't wanna live --- baystation12.dme | 4 - code/game/machinery/kitchen/gibber.dm | 432 ------------------ code/game/machinery/kitchen/icecream.dm | 209 --------- code/game/machinery/kitchen/microwave.dm | 429 ----------------- code/game/machinery/kitchen/smartfridge.dm | 414 ----------------- .../cooking/coocking_appliances/grill.dm | 22 +- .../cooking/coocking_appliances/oven.dm | 22 +- .../cooking/coocking_appliances/stove.dm | 22 +- code/modules/cooking/cooking.dm | 44 +- code/modules/cooking/cooking_catalog.dm | 13 +- code/modules/cooking/cooking_init.dm | 8 +- .../cooking_items/cooking_containers.dm | 82 ++-- code/modules/cooking/cooking_items/dollop.dm | 8 +- code/modules/cooking/cooking_items/spatula.dm | 5 +- code/modules/cooking/cooking_tracker.dm | 116 ++--- .../cooking/recipes/example_recipes.dm | 22 +- code/modules/cooking/recipes/recipe.dm | 286 ++++++------ code/modules/cooking/recipes/recipe_donuts.dm | 10 +- code/modules/cooking/step_defines.dm | 28 +- code/modules/cooking/step_types/add_item.dm | 20 +- .../modules/cooking/step_types/add_produce.dm | 20 +- .../modules/cooking/step_types/add_reagent.dm | 18 +- .../cooking/step_types/recipe_start.dm | 6 +- code/modules/cooking/step_types/use_grill.dm | 17 +- code/modules/cooking/step_types/use_item.dm | 12 +- code/modules/cooking/step_types/use_oven.dm | 16 +- code/modules/cooking/step_types/use_stove.dm | 17 +- code/modules/cooking/step_types/use_tool.dm | 24 +- icons/obj/cooking/eris_kitchen.dmi | Bin 0 -> 1435 bytes icons/obj/cooking/grill.dmi | Bin 0 -> 2055 bytes icons/obj/cooking/kitchen.dmi | Bin 0 -> 4331 bytes icons/obj/cooking/oven.dmi | Bin 0 -> 1886 bytes icons/obj/cooking/scan.dmi | Bin 0 -> 4496 bytes icons/obj/cooking/stove.dmi | Bin 0 -> 9120 bytes 34 files changed, 425 insertions(+), 1901 deletions(-) delete mode 100644 code/game/machinery/kitchen/gibber.dm delete mode 100644 code/game/machinery/kitchen/icecream.dm delete mode 100644 code/game/machinery/kitchen/microwave.dm delete mode 100644 code/game/machinery/kitchen/smartfridge.dm create mode 100644 icons/obj/cooking/eris_kitchen.dmi create mode 100644 icons/obj/cooking/grill.dmi create mode 100644 icons/obj/cooking/kitchen.dmi create mode 100644 icons/obj/cooking/oven.dmi create mode 100644 icons/obj/cooking/scan.dmi create mode 100644 icons/obj/cooking/stove.dmi diff --git a/baystation12.dme b/baystation12.dme index e2a69e7a5dd..15c379afd1b 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -919,10 +919,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" diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm deleted file mode 100644 index 0df342a4b25..00000000000 --- a/code/game/machinery/kitchen/gibber.dm +++ /dev/null @@ -1,432 +0,0 @@ -/obj/machinery/gibber - name = "gibber" - desc = "The name isn't descriptive enough?" - - icon = 'icons/obj/machines/gibber.dmi' - icon_state = "gibber" - layer = BELOW_OBJ_LAYER - - density = TRUE - anchored = TRUE - - idle_power_usage = 2 WATTS - active_power_usage = 500 WATTS - - component_types = list( - /obj/item/stock_parts/micro_laser, - /obj/item/stock_parts/matter_bin, - /obj/item/circuitboard/gibber - ) - - /// Direction to spit meat and gibs in. - var/gib_throw_dir = WEST - - /// Time to gib a single entity. - var/gib_time - /// Whether the machine is processing pigs. - var/operating = FALSE - /// Max mount of mobs that can fit into the machine. - var/mob_capacity - /// List of mobs to be gibbed. - var/list/mob/mobs_to_process - -/obj/machinery/gibber/on_update_icon() - ClearOverlays() - if(panel_open) - AddOverlays("gibber-panel") - - if(stat & (NOPOWER|BROKEN)) - return - - if(operating) - AddOverlays("gibber-use") - else if(length(mobs_to_process)) - AddOverlays("gibber-jam") - else - AddOverlays("gibber-idle") - - var/should_glow = update_glow() - if(should_glow) - AddOverlays(emissive_appearance(icon, "[icon_state]_ea")) - -/obj/machinery/gibber/proc/update_glow() - if(inoperable(MAINT)) - set_light(0) - return FALSE - - var/color = COLOR_YELLOW - if(operating) - color = COLOR_GREEN - if(length(mobs_to_process)) - color = COLOR_NT_RED - - set_light(0.7, 0.1, 1, 2, color) - return TRUE - -/obj/machinery/gibber/RefreshParts() - var/time_modifier = 0 - for(var/obj/item/stock_parts/micro_laser/ML in component_parts) - time_modifier += ML.rating - gib_time = max(4 SECONDS - 10 * (time_modifier - 1), 1 SECOND) - - var/capacity_modifier = 0 - for(var/obj/item/stock_parts/matter_bin/MB in component_parts) - capacity_modifier += MB.rating - mob_capacity = clamp(capacity_modifier * (capacity_modifier - 1), 1, 12) - -/obj/machinery/gibber/Initialize() - . = ..() - - add_think_ctx("finish_processing", CALLBACK(src, nameof(.proc/finish_processing)), 0) - update_icon() - RefreshParts() - -/obj/machinery/gibber/Destroy() - if(operating) - for(var/atom/A in contents - mobs_to_process - component_parts) - qdel(A) // No drops for cheaters... - if(length(mobs_to_process)) - for(var/mob/M in mobs_to_process) - M.forceMove(loc) - return ..() - -/obj/machinery/gibber/attack_hand(mob/user) - if(stat & (NOPOWER|BROKEN)) - return - - if(operating) - to_chat(user, SPAN("danger", "\The [src] is locked and running, wait for it to finish!")) - return - - if(!length(mobs_to_process)) - to_chat(user, SPAN("danger", "\The [src] has nothing grindable inside!")) - return - - process_mobs(user) - -/obj/machinery/gibber/attackby(obj/item/W, mob/user) - if(operating) - return ..() - - if(default_deconstruction_screwdriver(user, W)) - return - - if(default_deconstruction_crowbar(user, W)) - return - - if(default_part_replacement(user, W)) - return - - if(istype(W, /obj/item/grab)) - var/obj/item/grab/G = W - if(!G.force_danger()) - to_chat(user, SPAN("danger", "You need a better grip to do that!")) - return - - add_to_contents(user, G.affecting) - G.delete_self() - return - - if(istype(W, /obj/item/organ)) - if(!user.drop(W)) - return - - user.visible_message(SPAN("danger", "\The [user] feeds \the [W] into \the [src], obliterating it.")) - qdel(W) - return - - return ..() - -/obj/machinery/gibber/relaymove(mob/user) - if(!empty_contents()) - return - - user.visible_message( - SPAN("danger", "[user] flies out from \the [src], thus emptying its contents"), - SPAN("warning", "You successfully knock out \the [src]s hatch, thus saving your life!") - ) - -/obj/machinery/gibber/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.restrained()) - return - - add_to_contents(user, target) - -/obj/machinery/gibber/verb/eject() - set category = "Object" - set name = "Empty Gibber" - set src in oview(1) - - if(usr.is_ic_dead()) - return - - if(usr.loc == src) - return - - empty_contents() - add_fingerprint(usr) - -/obj/machinery/gibber/proc/empty_contents() - if(operating) - return FALSE - - for(var/mob/M in mobs_to_process) - M.dropInto(loc) - if(M.client) - M.client.eye = M.client.mob - M.client.perspective = MOB_PERSPECTIVE - - LAZYCLEARLIST(mobs_to_process) - update_icon() - return TRUE - -/obj/machinery/gibber/proc/move_inside(mob/victim) - victim.forceMove(src) - LAZYADD(mobs_to_process, victim) - - if(victim.client) - victim.client.perspective = EYE_PERSPECTIVE - victim.client.eye = src - -/obj/machinery/gibber/proc/do_move_inside_checks(mob/user, mob/living/victim, loud = TRUE) - if(isnull(user) && loud) - return FALSE - - if(isnull(victim)) - return FALSE - - if(length(mobs_to_process) >= mob_capacity) - if(loud) to_chat(user, SPAN("danger", "\The [src] is full, empty it first!")) - return FALSE - - if(operating) - if(loud) to_chat(user, SPAN("danger","\The [src] is locked and running, wait for it to finish.")) - return FALSE - - if(!iscarbon(victim) && !isanimal(victim)) - if(loud) to_chat(user, SPAN("danger","This is not suitable for \the [src]!")) - return FALSE - - if(victim.abiotic(TRUE)) - if(loud) to_chat(user, SPAN("danger","\The [victim] may not have any abiotic items on.")) - return FALSE - - return TRUE - -/obj/machinery/gibber/proc/add_to_contents(mob/user, mob/living/victim) - if(!do_move_inside_checks(user, victim)) - return - - user.visible_message(SPAN("danger", "\The [user] starts to put \the [victim] into \the [src]!")) - add_fingerprint(user) - if(do_after(user, 30, src) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && length(mobs_to_process) < mob_capacity) - user.visible_message(SPAN("danger", "\The [user] stuffs \the [victim] into \the [src]!")) - move_inside(victim) - update_icon() - -/obj/machinery/gibber/proc/process_mobs(mob/user = null) - if(operating) - return - - if(!length(mobs_to_process)) - visible_message(SPAN("danger", "You hear a loud metallic grinding sound.")) - playsound(loc, 'sound/signals/error4.ogg', 50, TRUE) - return - - visible_message(SPAN("danger", "You hear a loud squelchy grinding sound.")) - playsound(loc, 'sound/machines/juicer.ogg', 50, TRUE) - use_power_oneoff(1000) - update_icon() - - operating = TRUE - for(var/mob/pig in mobs_to_process) - create_mob_drop(pig) - - set_next_think_ctx("finish_processing", world.time + length(mobs_to_process) * gib_time, user) - -/obj/machinery/gibber/proc/create_mob_drop(mob/victim) - if(istype(victim, /mob/living/simple_animal/hostile/faithless)) - new /obj/item/ectoplasm(src) - return - - if(ismetroid(victim)) - var/mob/living/carbon/metroid/M = victim - var/extract_type = M.GetCoreType() - new extract_type(src) - return - - var/slab_owner = victim.name - - var/slab_count = 3 - var/slab_nutrition = 20 - var/robotic_slab_count = 0 - var/slab_type = /obj/item/reagent_containers/food/meat - - if(iscarbon(victim)) - var/mob/living/carbon/C = victim - slab_nutrition = C.nutrition / 15 - if(isanimal(victim)) - var/mob/living/simple_animal/S = victim - if(S.meat_amount) - slab_count = S.meat_amount - if(S.meat_type) - slab_type = S.meat_type - if(ishuman(victim)) - var/mob/living/carbon/human/H = victim - slab_count = 0 - slab_owner = H.real_name - slab_type = H.species.meat_type - for(var/obj/item/organ/external/O in H.organs) - if(O.is_stump()) - continue - - if(istype(O, /obj/item/organ/external/chest)) - var/obj/item/organ/external/chest/C = O - if(BP_IS_ROBOTIC(O)) - robotic_slab_count += C.butchering_capacity - else - slab_count += C.butchering_capacity - continue - - if(BP_IS_ROBOTIC(O)) - robotic_slab_count++ - else - slab_count++ - - if(slab_count > 0) - if(issmall(victim)) - slab_nutrition *= 0.5 - - slab_nutrition /= slab_count - - var/reagent_transfer_amt - if(victim.reagents) - reagent_transfer_amt = round(victim.reagents.total_volume / slab_count, 1) - - for(var/i = 1 to slab_count) - var/obj/item/reagent_containers/food/meat/new_meat = new slab_type(src, rand(3, 8)) - if(!istype(new_meat)) - continue - - new_meat.SetName("[slab_owner] [new_meat.name]") - new_meat.reagents.add_reagent(/datum/reagent/nutriment, slab_nutrition) - if(!victim.reagents) - continue - - victim.reagents.trans_to_obj(new_meat, reagent_transfer_amt) - - for(var/i = 1 to robotic_slab_count) - new /obj/item/stack/material/steel(src, rand(3, 5)) - -/obj/machinery/gibber/proc/finish_processing(mob/user, slipshod = TRUE, gore = TRUE) - for(var/mob/pig in mobs_to_process) - if(user) admin_attack_log(user, pig, "Gibbed the victim", "Was gibbed", "gibbed") - pig.gib(do_gibs = gore) - qdel(pig) - - operating = FALSE - - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - LAZYCLEARLIST(mobs_to_process) - update_icon() - - for(var/obj/O in contents - component_parts) - if(istype(O, /obj/item/organ) && prob(80)) - qdel(O) - continue - - O.dropInto(loc) - if(!slipshod || !throw_dir) - continue - - O.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(0, 3), 0.5) - -#define GIBBER_THINK_DELTA (15 SECONDS) - -/obj/machinery/gibber/industrial - name = "Industrial Gibber" - - icon_state = "ind_gibber" - - component_types = list( - /obj/item/circuitboard/industrial_gibber, - /obj/item/stock_parts/micro_laser, - /obj/item/stock_parts/manipulator, - /obj/item/stock_parts/matter_bin - ) - - gib_throw_dir = null - - var/scoops_per_attempt = 1 - -/obj/machinery/gibber/industrial/on_update_icon() - ClearOverlays() - if(stat & (NOPOWER|BROKEN)) - return - - if(operating) - AddOverlays("ind_gibber-use") - else if(length(mobs_to_process)) - AddOverlays("ind_gibber-jam") - - var/should_glow = update_glow() - if(should_glow) - if(operating || length(mobs_to_process)) - AddOverlays(emissive_appearance(icon, "[icon_state]_usejam_ea")) - else - AddOverlays(emissive_appearance(icon, "[icon_state]_ea")) - -/obj/machinery/gibber/industrial/update_glow() - if(stat & MAINT) - set_light(0) - return FALSE - - var/color = COLOR_NT_RED - if(operating) - color = COLOR_GREEN - - set_light(0.7, 0.1, 1, 2, color) - return TRUE - -/obj/machinery/gibber/industrial/Initialize() - . = ..() - - set_next_think(world.time) - add_think_ctx("pickup", CALLBACK(src, nameof(.proc/perform_pickup)), world.time + GIBBER_THINK_DELTA) - -/obj/machinery/gibber/industrial/RefreshParts() - . = ..() - - var/scoop_modifier = 0 - for(var/obj/item/stock_parts/manipulator/MM in component_parts) - scoop_modifier += MM.rating - scoops_per_attempt = scoop_modifier - -/obj/machinery/gibber/industrial/finish_processing(mob/user, slipshod = FALSE, gore = FALSE) - . = ..(user, slipshod, gore) - flick("ind_gibber-out", src) - set_next_think_ctx("pickup", world.time + GIBBER_THINK_DELTA) - -/obj/machinery/gibber/industrial/proc/perform_pickup() - if(operating) - return - - var/scoops_left = scoops_per_attempt - for(var/mob/living/possible_prey in range(1, src)) - if(scoops_left <= 0) - break - - if(!possible_prey?.is_ic_dead() || !do_move_inside_checks(null, possible_prey, FALSE)) - continue - - move_inside(possible_prey) - scoops_left-- - - if(scoops_left <= 0) - flick("ind_gibber-in", src) - process_mobs() - return - - set_next_think_ctx("pickup", world.time + GIBBER_THINK_DELTA) - -#undef GIBBER_THINK_DELTA diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm deleted file mode 100644 index 9fdae51bf53..00000000000 --- a/code/game/machinery/kitchen/icecream.dm +++ /dev/null @@ -1,209 +0,0 @@ -#define ICECREAM_VANILLA 1 -#define ICECREAM_CHOCOLATE 2 -#define ICECREAM_STRAWBERRY 3 -#define ICECREAM_BLUE 4 -#define ICECREAM_CHERRY 5 -#define ICECREAM_BANANA 6 -#define CONE_WAFFLE 7 -#define CONE_CHOC 8 - -// Ported wholesale from Apollo Station. - -/obj/machinery/icecream_vat - name = "icecream vat" - desc = "A heavy metal container used to produce and store ice cream." - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_vat" - density = 1 - anchored = 0 - atom_flags = ATOM_FLAG_NO_REACT | ATOM_FLAG_OPEN_CONTAINER - - var/list/product_types = list() - var/dispense_flavour = ICECREAM_VANILLA - var/flavour_name = "vanilla" - -/obj/machinery/icecream_vat/proc/get_ingredient_list(type) - switch(type) - if(ICECREAM_CHOCOLATE) - return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/nutriment/coco) - if(ICECREAM_STRAWBERRY) - return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/drink/juice/berry) - if(ICECREAM_BLUE) - return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/ethanol/singulo) - if(ICECREAM_CHERRY) - return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/nutriment/cherryjelly) - if(ICECREAM_BANANA) - return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice, /datum/reagent/drink/juice/banana) - if(CONE_WAFFLE) - return list(/datum/reagent/nutriment/flour, /datum/reagent/sugar) - if(CONE_CHOC) - return list(/datum/reagent/nutriment/flour, /datum/reagent/sugar, /datum/reagent/nutriment/coco) - else - return list(/datum/reagent/drink/milk, /datum/reagent/drink/ice) - -/obj/machinery/icecream_vat/proc/get_flavour_name(flavour_type) - switch(flavour_type) - if(ICECREAM_CHOCOLATE) - return "chocolate" - if(ICECREAM_STRAWBERRY) - return "strawberry" - if(ICECREAM_BLUE) - return "blue" - if(ICECREAM_CHERRY) - return "cherry" - if(ICECREAM_BANANA) - return "banana" - if(CONE_WAFFLE) - return "waffle" - if(CONE_CHOC) - return "chocolate" - else - return "vanilla" - -/obj/machinery/icecream_vat/Initialize() - . = ..() - create_reagents(100) - while(product_types.len < 8) - product_types.Add(5) - reagents.add_reagent(/datum/reagent/drink/milk, 5) - reagents.add_reagent(/datum/reagent/nutriment/flour, 5) - reagents.add_reagent(/datum/reagent/sugar, 5) - reagents.add_reagent(/datum/reagent/drink/ice, 5) - -/obj/machinery/icecream_vat/attack_hand(mob/user as mob) - user.set_machine(src) - interact(user) - -/obj/machinery/icecream_vat/interact(mob/user as mob) - var/dat - dat += "ICECREAM
" - dat += "Dispensing: [flavour_name] icecream

" - dat += "Vanilla icecream:
Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)
" - dat += "Strawberry icecream: Select Make x5 [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)
" - dat += "Chocolate icecream: Select Make x5 [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)
" - dat += "Blue icecream: Select Make x5 [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)
" - dat += "Cherry icecream: Select Make x5 [product_types[ICECREAM_CHERRY]] dollops left. (Ingredients: milk, ice, cherry jelly)
" - dat += "Banana icecream: Select Make x5 [product_types[ICECREAM_BANANA]] dollops left. (Ingredients: milk, ice, banana)
" - dat += "
CONES
" - dat += "Waffle cones: Dispense Make x5 [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)
" - dat += "Chocolate cones: Dispense Make x5 [product_types[CONE_CHOC]] cones left. (Ingredients: flour, sugar, coco powder)
" - dat += "
" - dat += "VAT CONTENT
" - for(var/datum/reagent/R in reagents.reagent_list) - dat += "[R.name]: [R.volume]" - dat += "Purge
" - dat += "Refresh Close" - - var/datum/browser/popup = new(user, "icecreamvat","Icecream Vat", 700, 500, src) - popup.set_content(dat) - popup.open() - -/obj/machinery/icecream_vat/attackby(obj/item/O as obj, mob/user as mob) - if(istype(O, /obj/item/reagent_containers/food/icecream)) - var/obj/item/reagent_containers/food/icecream/I = O - if(!I.ice_creamed) - if(product_types[dispense_flavour] > 0) - src.visible_message("\icon[src] [user] scoops delicious [flavour_name] icecream into [I].") - product_types[dispense_flavour] -= 1 - I.add_ice_cream(flavour_name) - // if(beaker) - // beaker.reagents.trans_to(I, 10) - if(I.reagents.total_volume < 10) - I.reagents.add_reagent(/datum/reagent/sugar, 10 - I.reagents.total_volume) - else - to_chat(user, "There is not enough icecream left!") - else - to_chat(user, "[O] already has icecream in it.") - return 1 - else if(O.is_open_container()) - return - else - ..() - -/obj/machinery/icecream_vat/proc/make(mob/user, make_type, amount) - for(var/R in get_ingredient_list(make_type)) - if(reagents.has_reagent(R, amount)) - continue - amount = 0 - break - if(amount) - for(var/R in get_ingredient_list(make_type)) - reagents.remove_reagent(R, amount) - product_types[make_type] += amount - var/flavour = get_flavour_name(make_type) - if(make_type > 6) - src.visible_message("[user] cooks up some [flavour] cones.") - else - src.visible_message("[user] whips up some [flavour] icecream.") - else - to_chat(user, "You don't have the ingredients to make this.") - -/obj/machinery/icecream_vat/OnTopic(user, href_list) - if(href_list["close"]) - close_browser(usr, "window=icecreamvat") - return TOPIC_HANDLED - - if(href_list["select"]) - dispense_flavour = text2num(href_list["select"]) - flavour_name = get_flavour_name(dispense_flavour) - src.visible_message("[user] sets [src] to dispense [flavour_name] flavoured icecream.") - . = TOPIC_HANDLED - - else if(href_list["cone"]) - var/dispense_cone = text2num(href_list["cone"]) - var/cone_name = get_flavour_name(dispense_cone) - if(product_types[dispense_cone] >= 1) - product_types[dispense_cone] -= 1 - var/obj/item/reagent_containers/food/icecream/I = new(src.loc) - I.cone_type = cone_name - I.icon_state = "icecream_cone_[cone_name]" - I.desc = "Delicious [cone_name] cone, but no ice cream." - src.visible_message("[user] dispenses a crunchy [cone_name] cone from [src].") - else - to_chat(user, "There are no [cone_name] cones left!") - . = TOPIC_REFRESH - - else if(href_list["make"]) - var/amount = (text2num(href_list["amount"])) - var/C = text2num(href_list["make"]) - make(user, C, amount) - . = TOPIC_REFRESH - - else if(href_list["disposeI"]) - var/datum/reagent/R = locate(href_list["disposeI"]) in reagents.reagent_list - if(R) - reagents.del_reagent(R.type) - . = TOPIC_REFRESH - - if(href_list["refresh"] || . == TOPIC_REFRESH) - interact(user) - -/obj/item/reagent_containers/food/icecream - name = "ice cream cone" - desc = "Delicious waffle cone, but no ice cream." - icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time - layer = ABOVE_OBJ_LAYER - bitesize = 3 - - var/ice_creamed = 0 - var/cone_type - -/obj/item/reagent_containers/food/icecream/Initialize() - . = ..() - create_reagents(20) - reagents.add_reagent(/datum/reagent/nutriment, 5) - -/obj/item/reagent_containers/food/icecream/proc/add_ice_cream(flavour_name) - name = "[flavour_name] icecream" - AddOverlays("icecream_[flavour_name]") - desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream." - ice_creamed = 1 - -#undef ICECREAM_VANILLA -#undef ICECREAM_CHOCOLATE -#undef ICECREAM_STRAWBERRY -#undef ICECREAM_BLUE -#undef ICECREAM_CHERRY -#undef ICECREAM_BANANA -#undef CONE_WAFFLE -#undef CONE_CHOC diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm deleted file mode 100644 index a9da12d160d..00000000000 --- a/code/game/machinery/kitchen/microwave.dm +++ /dev/null @@ -1,429 +0,0 @@ - -/obj/machinery/microwave - name = "microwave" - icon = 'icons/obj/kitchen.dmi' - icon_state = "mw" - layer = BELOW_OBJ_LAYER - density = 1 - anchored = 1 - idle_power_usage = 5 WATTS - active_power_usage = 100 WATTS - atom_flags = ATOM_FLAG_NO_REACT - atom_flags = ATOM_FLAG_OPEN_CONTAINER - var/operating = 0 // Is it on? - var/dirty = 0 // = {0..100} Does it need cleaning? - var/broken = 0 // ={0,1,2} How broken is it??? - var/global/list/datum/recipe/available_recipes // List of the recipes you can use - var/global/list/acceptable_items // List of the items you can put in - var/global/list/acceptable_reagents // List of the reagents you can put in - var/global/max_n_of_items = 0 - var/cook_speed = 1 - - component_types = list( - /obj/item/circuitboard/microwave, - /obj/item/stock_parts/micro_laser = 3, - /obj/item/stock_parts/manipulator - ) - -// see code/modules/food/recipes_microwave.dm for recipes - -/******************* -* Initialising -********************/ - -/obj/machinery/microwave/Initialize() - . = ..() - create_reagents(100) - if (!available_recipes) - available_recipes = new - for (var/type in (typesof(/datum/recipe)-/datum/recipe)) - available_recipes+= new type - acceptable_items = new - acceptable_reagents = new - for (var/datum/recipe/recipe in available_recipes) - for (var/item in recipe.items) - acceptable_items |= item - for (var/reagent in recipe.reagents) - acceptable_reagents |= reagent - if (recipe.items) - max_n_of_items = max(max_n_of_items, length(recipe.items)) - // This will do until I can think of a fun recipe to use dionaea in - - // will also allow anything using the holder item to be microwaved into - // impure carbon. ~Z - acceptable_items |= /obj/item/holder - acceptable_items |= /obj/item/reagent_containers/food/grown - acceptable_items |= /obj/item/organ - -/******************* -* Item Adding -********************/ - -/obj/machinery/microwave/attackby(obj/item/O as obj, mob/user as mob) - if(src.broken > 0) - if(src.broken == 2 && isScrewdriver(O)) // If it's broken and they're using a screwdriver - user.visible_message( \ - SPAN("notice", "\The [user] starts to fix part of the microwave."), \ - SPAN("notice", "You start to fix part of the microwave.") \ - ) - if (do_after(user, 20, src)) - user.visible_message( \ - SPAN("notice", "\The [user] fixes part of the microwave."), \ - SPAN("notice", "You have fixed part of the microwave.") \ - ) - src.broken = 1 // Fix it a bit - else if(src.broken == 1 && isWrench(O)) // If it's broken and they're doing the wrench - user.visible_message( \ - SPAN("notice", "\The [user] starts to fix part of the microwave."), \ - SPAN("notice", "You start to fix part of the microwave.") \ - ) - if (do_after(user, 20, src)) - user.visible_message( \ - SPAN("notice", "\The [user] fixes the microwave."), \ - SPAN("notice", "You have fixed the microwave.") \ - ) - src.broken = 0 // Fix it! - src.dirty = 0 // just to be sure - src.update_icon() - src.atom_flags = ATOM_FLAG_OPEN_CONTAINER - else - to_chat(user, SPAN("warning", "It's broken!")) - return 1 - else if(src.dirty == 100) // The microwave is all dirty so can't be used! - if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/reagent_containers/rag)) // If they're trying to clean it then let them - user.visible_message( \ - SPAN("notice", "\The [user] starts to clean the microwave."), \ - SPAN("notice", "You start to clean the microwave.") \ - ) - if (do_after(user, 20, src)) - user.visible_message( \ - SPAN("notice", "\The [user] has cleaned the microwave."), \ - SPAN("notice", "You have cleaned the microwave.") \ - ) - src.dirty = 0 // It's clean! - src.broken = 0 // just to be sure - src.update_icon() - src.atom_flags = ATOM_FLAG_OPEN_CONTAINER - else //Otherwise bad luck!! - to_chat(user, SPAN("warning", "It's dirty!")) - return 1 - - else if(default_deconstruction_screwdriver(user, O)) - return - else if(default_deconstruction_crowbar(user, O)) - return - else if(default_part_replacement(user, O)) - return - - else if(isWrench(O)) - user.visible_message( \ - SPAN("notice", "\The [user] begins [src.anchored ? "unsecuring" : "securing"] the microwave."), \ - SPAN("notice", "You attempt to [src.anchored ? "unsecure" : "secure"] the microwave.") - ) - if(do_after(user,20, src)) - src.anchored = !src.anchored - user.visible_message( \ - SPAN("notice", "\The [user] [src.anchored ? "secures" : "unsecures"] the microwave."), \ - SPAN("notice", "You [src.anchored ? "secure" : "unsecure"] the microwave.") - ) - else - to_chat(user, SPAN("notice", "You decide not to do that.")) - return 1 - - else if(panel_open) // Don't cook with open panel - src.updateUsrDialog() - return - - else if(is_type_in_list(O,acceptable_items)) - if (length(InsertedContents()) >= max_n_of_items) - to_chat(user, SPAN("warning", "This [src] is full of ingredients, you cannot put more.")) - return 1 - if(istype(O, /obj/item/stack)) // This is bad, but I can't think of how to change it - var/obj/item/stack/S = O - if(S.get_amount() > 1) - new O.type(src) - S.use(1) - else if(!user.drop(O, src)) - return - user.visible_message( \ - SPAN("notice", "\The [user] has added one of [O] to \the [src]."), \ - SPAN("notice", "You add one of [O] to \the [src].")) - return - else - if(!user.drop(O, src)) - return - user.visible_message( \ - SPAN("notice", "\The [user] has added \the [O] to \the [src]."), \ - SPAN("notice", "You add \the [O] to \the [src].")) - return - else if(istype(O,/obj/item/reagent_containers/vessel)) - if (!O.reagents) - return 1 - for (var/datum/reagent/R in O.reagents.reagent_list) - if (!(R.type in acceptable_reagents)) - to_chat(user, SPAN("warning", "Your [O] contains components unsuitable for cookery.")) - return 1 - return - else if(istype(O,/obj/item/grab)) - var/obj/item/grab/G = O - to_chat(user, SPAN("warning", "This is ridiculous. You can not fit \the [G.affecting] in this [src].")) - return 1 - else - to_chat(user, SPAN("warning", "You have no idea what you can cook with this [O].")) - ..() - src.updateUsrDialog() - -/obj/machinery/microwave/attack_ai(mob/user as mob) - if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) - attack_hand(user) - -/obj/machinery/microwave/attack_hand(mob/user as mob) - user.set_machine(src) - interact(user) - -/******************* -* Microwave Menu -********************/ - -/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu - var/dat = list() - if(!anchored) - dat += "Secure the microwave first!" - else if(src.panel_open) - dat += "Panel is open!" - else if(src.broken > 0) - dat += "Bzzzzttttt" - else if(src.operating) - dat += "Microwaving in progress!
Please wait...!
" - else if(src.dirty==100) - dat += "This microwave is dirty!
Please clean it before use!
" - else - var/list/items_counts = new - var/list/items_measures = new - var/list/items_measures_p = new - dat += "

Ingredients:

" - for(var/obj/O in InsertedContents()) - if(O in component_types) - continue - var/display_name = O.name - if(istype(O,/obj/item/reagent_containers/food/egg)) - items_measures[display_name] = "egg" - items_measures_p[display_name] = "eggs" - if(istype(O,/obj/item/reagent_containers/food/tofu)) - items_measures[display_name] = "tofu chunk" - items_measures_p[display_name] = "tofu chunks" - if(istype(O,/obj/item/reagent_containers/food/meat)) //any meat - items_measures[display_name] = "slab of meat" - items_measures_p[display_name] = "slabs of meat" - if(istype(O,/obj/item/reagent_containers/food/donkpocket)) - display_name = "Turnovers" - items_measures[display_name] = "turnover" - items_measures_p[display_name] = "turnovers" - if(istype(O,/obj/item/reagent_containers/food/carpmeat)) - items_measures[display_name] = "fillet of meat" - items_measures_p[display_name] = "fillets of meat" - items_counts[display_name]++ - for(var/O in items_counts) - var/N = items_counts[O] - if(!(O in items_measures)) - dat += "[capitalize(O)]: [N] [lowertext(O)]\s" - else - if(N == 1) - dat += "[capitalize(O)]: [N] [items_measures[O]]" - else - dat += "[capitalize(O)]: [N] [items_measures_p[O]]" - - for(var/datum/reagent/R in reagents.reagent_list) - var/display_name = R.name - if(R.type == /datum/reagent/capsaicin) - display_name = "Hotsauce" - if(R.type == /datum/reagent/frostoil) - display_name = "Coldsauce" - dat += "[display_name]: [R.volume] unit\s" - - if(!length(items_counts) && !length(reagents.reagent_list)) - dat += "The microwave is empty" - dat += "

Turn on!
Eject ingredients!" - - show_browser(user, "Microwave Controls[jointext(dat,"
")]
", "window=microwave") - onclose(user, "microwave") - return - - - -/*********************************** -* Microwave Menu Handling/Cooking -************************************/ - -/obj/machinery/microwave/proc/cook() - if(stat & (NOPOWER|BROKEN)) - return - start() - if (reagents.total_volume == 0 && !length(InsertedContents())) //dry run - if (!wzhzhzh(10)) - abort() - return - stop() - return - - var/datum/recipe/recipe = select_recipe(available_recipes,src) - var/obj/cooked - if (!recipe) - dirty += 1 - if (prob(max(10, dirty * 5))) - if (!wzhzhzh(4)) - abort() - return - muck_start() - wzhzhzh(4) - muck_finish() - cooked = fail() - cooked.dropInto(loc) - return - else if (has_extra_item()) - if (!wzhzhzh(4)) - abort() - return - broke() - cooked = fail() - cooked.dropInto(loc) - return - else - if (!wzhzhzh(10)) - abort() - return - stop() - cooked = fail() - cooked.dropInto(loc) - return - else - var/halftime = round(recipe.time / 20) - if (!wzhzhzh(halftime)) - abort() - return - if (!wzhzhzh(halftime)) - abort() - cooked = fail() - cooked.dropInto(loc) - return - cooked = recipe.make_food(src) - stop() - if(cooked) - cooked.dropInto(loc) - return - -/obj/machinery/microwave/proc/wzhzhzh(seconds as num) // Whoever named this proc is fucking literally Satan. ~ Z - seconds = max(round(seconds / cook_speed), 1) - for (var/i = 1 to seconds) - if (stat & (NOPOWER|BROKEN)) - return 0 - use_power_oneoff(500) - sleep(10) - return 1 - -/obj/machinery/microwave/proc/has_extra_item() - for (var/obj/O in InsertedContents()) - if (!istype(O,/obj/item/reagent_containers/food) && !istype(O, /obj/item/grown)) - return 1 - return 0 - -/obj/machinery/microwave/proc/start() - src.visible_message(SPAN("notice", "The microwave turns on."), SPAN("notice", "You hear a microwave.")) - src.operating = 1 - src.updateUsrDialog() - src.update_icon() - -/obj/machinery/microwave/proc/abort() - src.operating = 0 // Turn it off again aferwards - src.updateUsrDialog() - src.update_icon() - -/obj/machinery/microwave/proc/stop() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.operating = 0 // Turn it off again aferwards - src.updateUsrDialog() - src.update_icon() - -/obj/machinery/microwave/proc/dispose() - for (var/obj/O in InsertedContents()) - O.dropInto(loc) - if (src.reagents.total_volume) - src.dirty++ - src.reagents.clear_reagents() - to_chat(usr, SPAN("notice", "You dispose of the microwave contents.")) - src.updateUsrDialog() - -/obj/machinery/microwave/proc/muck_start() - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound - src.update_icon() - -/obj/machinery/microwave/proc/muck_finish() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.visible_message(SPAN("warning", "The microwave gets covered in muck!")) - src.dirty = 100 // Make it dirty so it can't be used util cleaned - src.obj_flags = null //So you can't add condiments - src.operating = 0 // Turn it off again aferwards - src.updateUsrDialog() - src.update_icon() - -/obj/machinery/microwave/proc/broke() - var/datum/effect/effect/system/spark_spread/s = new - s.set_up(2, 1, src) - s.start() - src.visible_message(SPAN("warning", "The microwave breaks!")) //Let them know they're stupid - src.broken = 2 // Make it broken so it can't be used util fixed - src.obj_flags = null //So you can't add condiments - src.operating = 0 // Turn it off again aferwards - src.updateUsrDialog() - src.update_icon() - -/obj/machinery/microwave/on_update_icon() - if(dirty == 100) - src.icon_state = "mwbloody[operating]" - else if(broken) - src.icon_state = "mwb" - else - src.icon_state = "mw[operating]" - -/obj/machinery/microwave/proc/fail() - var/amount = 0 - for (var/obj/O in InsertedContents()) - amount++ - if (O.reagents) - var/reagent_type = O.reagents.get_master_reagent_type() - if (reagent_type) - amount+=O.reagents.get_reagent_amount(reagent_type) - qdel(O) - src.reagents.clear_reagents() - var/obj/item/reagent_containers/food/badrecipe/ffuu = new(src) - ffuu.reagents.add_reagent(/datum/reagent/carbon, amount) - ffuu.reagents.add_reagent(/datum/reagent/toxin, amount/10) - return ffuu - -/obj/machinery/microwave/Topic(href, href_list) - if(..()) - return 1 - - usr.set_machine(src) - if(src.operating) - src.updateUsrDialog() - return - - switch(href_list["action"]) - if ("cook") - cook() - - if ("dispose") - dispose() - -/obj/machinery/microwave/RefreshParts() - ..() - var/ml_rating = 0 - var/man_rating = 0 - for(var/obj/item/stock_parts/P in component_parts) - if(ismicrolaser(P)) - ml_rating += P.rating - else if(ismanipulator(P)) - man_rating += P.rating - - active_power_usage = (100 WATTS) - ml_rating * 6 // Normally, 72 power usage with 10 max power usage with max micro lasers - cook_speed = man_rating // More -> better diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm deleted file mode 100644 index b77a66807bc..00000000000 --- a/code/game/machinery/kitchen/smartfridge.dm +++ /dev/null @@ -1,414 +0,0 @@ - -/* SmartFridge. Much todo -*/ -/obj/machinery/smartfridge - name = "\improper SmartFridge" - icon = 'icons/obj/machines/vending/smartfridge.dmi' - icon_state = "smartfridge" - layer = BELOW_OBJ_LAYER - density = 1 - anchored = 1 - idle_power_usage = 5 WATTS - active_power_usage = 100 WATTS - atom_flags = ATOM_FLAG_NO_REACT - var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. - var/icon_on = "smartfridge" - var/icon_off = "smartfridge-off" - var/icon_panel = "smartfridge-panel" - var/list/item_records = list() - var/datum/stored_items/currently_vending = null //What we're putting out of the machine. - var/seconds_electrified = 0; - var/shoot_inventory = 0 - var/locked = 0 - var/scan_id = 1 - var/is_secure = 0 - var/shows_number_of_items = TRUE // Most machines of this type may show an approximate number of items in their storage - var/datum/wires/smartfridge/wires = null - -/obj/machinery/smartfridge/secure - is_secure = 1 - -/obj/machinery/smartfridge/New() - ..() - if(is_secure) - wires = new /datum/wires/smartfridge/secure(src) - else - wires = new /datum/wires/smartfridge(src) - -/obj/machinery/smartfridge/Destroy() - qdel(wires) - wires = null - for(var/datum/stored_items/S in item_records) - qdel(S) - item_records = null - return ..() - -/obj/machinery/smartfridge/proc/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/reagent_containers/food/grown/) || istype(O,/obj/item/seeds/)) - return 1 - return 0 - -/obj/machinery/smartfridge/seeds - name = "\improper MegaSeed Servitor" - desc = "When you need seeds fast!" - icon = 'icons/obj/machines/vending/seeds.dmi' - icon_state = "seeds" - icon_on = "seeds" - icon_off = "seeds-off" - shows_number_of_items = FALSE - -/obj/machinery/smartfridge/seeds/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/seeds/)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/extract - name = "\improper Metroid Extract Storage" - desc = "A refrigerated storage unit for metroid extracts." - req_access = list(access_research) - -/obj/machinery/smartfridge/secure/extract/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/metroid_extract)) - return TRUE - - if(istype(O,/obj/item/metroidcross)) - return TRUE - - return FALSE - -/obj/machinery/smartfridge/secure/medbay - name = "\improper Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_state = "smartfridge" //To fix the icon in the map editor. - icon_on = "smartfridge_chem" - req_one_access = list(access_medical,access_chemistry) - -/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O as obj) - if(istype(O, /obj/item/reagent_containers/vessel)) - return 1 - if(istype(O, /obj/item/storage/pill_bottle)) - return 1 - if(istype(O, /obj/item/reagent_containers/pill)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/virology - name = "\improper Refrigerated Virus Storage" - desc = "A refrigerated storage unit for storing viral material." - req_access = list(access_virology) - icon_state = "smartfridge_virology" - icon_on = "smartfridge_virology" - -/obj/machinery/smartfridge/secure/virology/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/reagent_containers/vessel/beaker/vial/)) - return 1 - if(istype(O,/obj/item/virusdish/)) - return 1 - return 0 - -/obj/machinery/smartfridge/chemistry - name = "\improper Smart Chemical Storage" - desc = "A refrigerated storage unit for medicine and chemical storage." - -/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers)) - return 1 - return 0 - -/obj/machinery/smartfridge/chemistry/virology - name = "\improper Smart Virus Storage" - desc = "A refrigerated storage unit for volatile sample storage." - -/obj/machinery/smartfridge/secure/blood - name = "\improper Smart Blood Storage" - desc = "A refrigerated storage unit for IV bags, usualy with blood." - icon_state = "smartfridge_blood" - icon_on = "smartfridge_blood" - icon_off = "smartfridge_blood-off" - req_one_access = list(access_medical,access_chemistry) - shows_number_of_items = FALSE - -/obj/machinery/smartfridge/secure/blood/filled/Initialize() - . = ..() - for(var/item_path in starts_with) - var/quantity = starts_with[item_path] - for(var/i = 1 to quantity) - stock_item(new item_path(src)) - -/obj/machinery/smartfridge/secure/blood/filled - var/list/starts_with = list( - /obj/item/reagent_containers/ivbag/blood/OPlus = 1, - /obj/item/reagent_containers/ivbag/blood/OMinus = 1, - /obj/item/reagent_containers/ivbag/blood/APlus = 2, - /obj/item/reagent_containers/ivbag/blood/AMinus = 2, - /obj/item/reagent_containers/ivbag/blood/BPlus = 2, - /obj/item/reagent_containers/ivbag/blood/BMinus = 2, - /obj/item/reagent_containers/ivbag = 2 - ) - -/obj/machinery/smartfridge/secure/blood/accept_check(obj/item/O) - if(istype(O, /obj/item/reagent_containers/ivbag)) - return TRUE - return FALSE - -/obj/machinery/smartfridge/drinks - name = "\improper Drink Showcase" - desc = "A refrigerated storage unit for tasty tasty alcohol." - -/obj/machinery/smartfridge/drinks/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/reagent_containers/vessel)) - return 1 - -/obj/machinery/smartfridge/secure/food - name = "\improper Refrigerated Food Showcase" - desc = "A refrigerated storage unit for tasty tasty food." - req_access = list(access_kitchen) - -/obj/machinery/smartfridge/secure/food/accept_check(obj/item/O as obj) - if(istype(O,/obj/item/reagent_containers/food)) - return 1 - return 0 - -/obj/machinery/smartfridge/drying_rack - name = "\improper Drying Rack" - desc = "A machine for drying plants." - icon = 'icons/obj/machines/vending/drying.dmi' - icon_state = "drying_rack" - icon_on = "drying_rack_on" - icon_off = "drying_rack" - -/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O as obj) - if(istype(O, /obj/item/reagent_containers/food/)) - var/obj/item/reagent_containers/food/S = O - if (S.dried_type) - return 1 - return 0 - -/obj/machinery/smartfridge/drying_rack/Process() - ..() - if(inoperable()) - return - if(contents.len) - dry() - update_icon() - -/obj/machinery/smartfridge/drying_rack/on_update_icon() - ClearOverlays() - if(inoperable()) - icon_state = icon_off - else - icon_state = icon_on - if(contents.len) - AddOverlays("drying_rack_filled") - if(!inoperable()) - AddOverlays("drying_rack_drying") - -/obj/machinery/smartfridge/drying_rack/proc/dry() - for(var/datum/stored_items/I in item_records) - for(var/obj/item/reagent_containers/food/S in I.instances) - if(S.dry || !I.get_specific_product(get_turf(src), S)) continue - if(S.dried_type == S.type) - S.dry = 1 - S.SetName("dried [S.name]") - S.color = "#a38463" - stock_item(S) - else - var/D = S.dried_type - new D(get_turf(src)) - qdel(S) - return - -/obj/machinery/smartfridge/Process() - if(stat & (BROKEN|NOPOWER)) - return - if(src.seconds_electrified > 0) - src.seconds_electrified-- - if(src.shoot_inventory && prob(2)) - src.throw_item() - -/obj/machinery/smartfridge/on_update_icon() - if(stat & (BROKEN|NOPOWER)) - icon_state = icon_off // Some of them don't have any display cases thus not requiring an overlay - else - icon_state = icon_on - if(shows_number_of_items) - ClearOverlays() - if(stat & (BROKEN|NOPOWER)) - AddOverlays(icon_off) // The use of overlays allows us to see how much is stored inside, even if the machine happens to be unpowered - switch(contents.len) - if(0) - icon_state = icon_on - if(1 to 25) - icon_state = "[icon_on]1" // 1/4 loaded - if(26 to 75) - icon_state = "[icon_on]2" // half-loaded - if(76 to INFINITY) - icon_state = "[icon_on]3" // "full" - else -/******************* -* Item Adding -********************/ - -/obj/machinery/smartfridge/attackby(obj/item/O as obj, mob/user as mob) - if(isScrewdriver(O)) - panel_open = !panel_open - user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].") - ClearOverlays() - if(panel_open) - AddOverlays(image(icon, icon_panel)) - SSnano.update_uis(src) - return - - if(isMultitool(O) || isWirecutter(O)) - if(panel_open) - attack_hand(user) - return - - if(stat & NOPOWER) - to_chat(user, SPAN_NOTICE("\The [src] is unpowered and useless.")) - return - - if(accept_check(O)) - if(!user.drop(O)) - return - stock_item(O) - update_icon() - user.visible_message(SPAN_NOTICE("\The [user] has added \the [O] to \the [src]."), SPAN_NOTICE("You add \the [O] to \the [src].")) - - else if(istype(O, /obj/item/storage)) - var/obj/item/storage/bag/P = O - var/plants_loaded = 0 - for(var/obj/G in P.contents) - if(accept_check(G) && P.remove_from_storage(G, src)) - plants_loaded++ - stock_item(G) - update_icon() - - if(plants_loaded) - user.visible_message(SPAN_NOTICE("\The [user] loads \the [src] with the contents of \the [P]."), SPAN_NOTICE("You load \the [src] with the contents of \the [P].")) - if(P.contents.len > 0) - to_chat(user, SPAN_NOTICE("Some items were refused.")) - - else - to_chat(user, SPAN_NOTICE("\The [src] smartly refuses [O].")) - return 1 - -/obj/machinery/smartfridge/secure/emag_act(remaining_charges, mob/user) - if(!emagged) - playsound(src.loc, 'sound/effects/computer_emag.ogg', 25) - emagged = 1 - locked = -1 - to_chat(user, "You short out the product lock on [src].") - return 1 - -/obj/machinery/smartfridge/proc/stock_item(obj/item/O) - for(var/datum/stored_items/I in item_records) - if(istype(O, I.item_path) && O.name == I.item_name) - stock(I, O) - return - - var/datum/stored_items/I = new /datum/stored_items(src, O.type, O.name) - dd_insertObjectList(item_records, I) - stock(I, O) - -/obj/machinery/smartfridge/proc/stock(datum/stored_items/I, obj/item/O) - I.add_product(O) - SSnano.update_uis(src) - -/obj/machinery/smartfridge/attack_ai(mob/user) - attack_hand(user) - -/obj/machinery/smartfridge/attack_hand(mob/user as mob) - if(stat & (NOPOWER|BROKEN)) - return - wires.Interact(user) - ui_interact(user) - -/******************* -* SmartFridge Menu -********************/ - -/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) - user.set_machine(src) - - var/data[0] - data["contents"] = null - data["electrified"] = seconds_electrified > 0 - data["shoot_inventory"] = shoot_inventory - data["locked"] = locked - data["secure"] = is_secure - - var/list/items[0] - for (var/i=1 to length(item_records)) - var/datum/stored_items/I = item_records[i] - var/count = I.get_amount() - if(count > 0) - items.Add(list(list("display_name" = html_encode(capitalize(I.item_name)), "vend" = i, "quantity" = count))) - - if(items.len > 0) - data["contents"] = items - - ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) - if(!ui) - ui = new(user, src, ui_key, "smartfridge.tmpl", src.name, 400, 500) - ui.set_initial_data(data) - ui.open() - -/obj/machinery/smartfridge/Topic(href, href_list) - if(..()) return 0 - - var/mob/user = usr - var/datum/nanoui/ui = SSnano.get_open_ui(user, src, "main") - - if(href_list["close"]) - user.unset_machine() - ui.close() - return 0 - - if(href_list["vend"]) - var/index = text2num(href_list["vend"]) - var/amount = text2num(href_list["amount"]) - var/datum/stored_items/I = item_records[index] - var/count = I.get_amount() - - // Sanity check, there are probably ways to press the button when it shouldn't be possible. - if(count > 0) - if((count - amount) < 0) - amount = count - for(var/i = 1 to amount) - I.get_product(get_turf(src), user) - update_icon() - - return 1 - return 0 - -/obj/machinery/smartfridge/proc/throw_item() - var/obj/throw_item = null - var/mob/living/target = locate() in view(7,src) - if(!target) - return 0 - - for(var/datum/stored_items/I in src.item_records) - throw_item = I.get_product(loc) - if (!throw_item) - continue - break - - if(!throw_item) - return 0 - throw_item.throw_at(target, 16, null, src) - update_icon() - visible_message(SPAN_WARNING("[src] launches [throw_item.name] at [target.name]!")) - return 1 - -/************************ -* Secure SmartFridges -*************************/ - -/obj/machinery/smartfridge/secure/Topic(href, href_list) - if(stat & (NOPOWER|BROKEN)) return 0 - if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) - if(!allowed(usr) && !emagged && scan_id && href_list["vend"]) - to_chat(usr, SPAN_WARNING("Access denied.")) - return 0 - return ..() diff --git a/code/modules/cooking/coocking_appliances/grill.dm b/code/modules/cooking/coocking_appliances/grill.dm index ccf17dfa41d..8d8f42ad337 100644 --- a/code/modules/cooking/coocking_appliances/grill.dm +++ b/code/modules/cooking/coocking_appliances/grill.dm @@ -4,7 +4,7 @@ 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/cwj_cooking/grill.dmi' + icon = 'icons/obj/cooking/grill.dmi' icon_state = "grill" density = FALSE anchored = TRUE @@ -119,17 +119,17 @@ handle_ignition(input) /obj/machinery/cooking_with_jane/grill/proc/handle_burning(input) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] container.handle_burning() /obj/machinery/cooking_with_jane/grill/proc/handle_ignition(input) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] if(container.handle_ignition()) on_fire = TRUE @@ -173,10 +173,10 @@ var/input = getInput(params) if(items[input] != null) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + 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/cooking_with_jane/cooking_container/grill_grate)) + 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.canUnEquip(used_item)) usr.unEquip(used_item, src) @@ -240,9 +240,9 @@ return var/input = getInput(params) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] #ifdef CWJ_DEBUG log_debug("/cooking_with_jane/grill/AltClick called on burner [input] [container]") @@ -314,10 +314,10 @@ /obj/machinery/cooking_with_jane/grill/proc/handle_cooking(var/mob/user, var/input, set_timer=FALSE) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] if(set_timer) reference_time = timer[input] else diff --git a/code/modules/cooking/coocking_appliances/oven.dm b/code/modules/cooking/coocking_appliances/oven.dm index 355bdc73d2a..e8a0754708f 100644 --- a/code/modules/cooking/coocking_appliances/oven.dm +++ b/code/modules/cooking/coocking_appliances/oven.dm @@ -4,7 +4,7 @@ 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/cwj_cooking/oven.dmi' + icon = 'icons/obj/cooking/oven.dmi' icon_state = "oven" density = TRUE anchored = TRUE @@ -87,17 +87,17 @@ handle_ignition() /obj/machinery/cooking_with_jane/oven/proc/handle_burning() - if(!(items && istype(items, /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + var/obj/item/reagent_containers/vessel/cooking_container/container = items container.handle_burning() /obj/machinery/cooking_with_jane/oven/proc/handle_ignition() - if(!(items && istype(items, /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + var/obj/item/reagent_containers/vessel/cooking_container/container = items if(container.handle_ignition()) on_fire = TRUE /obj/machinery/cooking_with_jane/oven/attackby(var/obj/item/used_item, var/mob/user, params) @@ -108,10 +108,10 @@ if(opened && center_selected) if(items != null) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + 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/cooking_with_jane/cooking_container)) + 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.canUnEquip(used_item)) usr.unEquip(used_item, src) @@ -212,8 +212,8 @@ 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/cooking_with_jane/cooking_container))) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + 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]") @@ -297,10 +297,10 @@ /obj/machinery/cooking_with_jane/oven/proc/handle_cooking(var/mob/user, set_timer=FALSE) - if(!(items && istype(items, /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items + var/obj/item/reagent_containers/vessel/cooking_container/container = items if(set_timer) reference_time = timer else diff --git a/code/modules/cooking/coocking_appliances/stove.dm b/code/modules/cooking/coocking_appliances/stove.dm index 22d55fc7941..39137fdf0c6 100644 --- a/code/modules/cooking/coocking_appliances/stove.dm +++ b/code/modules/cooking/coocking_appliances/stove.dm @@ -5,7 +5,7 @@ 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/cwj_cooking/stove.dmi' + icon = 'icons/obj/cooking/stove.dmi' icon_state = "stove" density = FALSE anchored = TRUE @@ -93,17 +93,17 @@ handle_ignition(input) /obj/machinery/cooking_with_jane/stove/proc/handle_burning(input) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] container.handle_burning() /obj/machinery/cooking_with_jane/stove/proc/handle_ignition(input) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] if(container.handle_ignition()) on_fire = TRUE @@ -134,10 +134,10 @@ var/input = getInput(params) if(items[input] != null) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + 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/cooking_with_jane/cooking_container)) + 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.canUnEquip(used_item)) usr.unEquip(used_item, src) @@ -199,9 +199,9 @@ return var/input = getInput(params) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + 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]") @@ -273,10 +273,10 @@ /obj/machinery/cooking_with_jane/stove/proc/handle_cooking(var/mob/user, var/input, set_timer=FALSE) - if(!(items[input] && istype(items[input], /obj/item/reagent_containers/cooking_with_jane/cooking_container))) + if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = items[input] + var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] if(set_timer) reference_time = timer[input] else diff --git a/code/modules/cooking/cooking.dm b/code/modules/cooking/cooking.dm index cc98da8dddb..b9f422de264 100644 --- a/code/modules/cooking/cooking.dm +++ b/code/modules/cooking/cooking.dm @@ -390,93 +390,93 @@ Food quality is calculated based on the steps taken. //----------------------------------------------------------------------------------- //Add reagent step shortcut commands -/datum/cooking/recipe/proc/create_step_add_reagent(var/reagent_id, var/amount, var/optional) +/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(var/item_type, var/optional) +/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(var/item_type, var/optional) +/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(var/produce, var/optional) +/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(var/type, var/quality, var/optional) +/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(var/heat, var/time, var/optional) +/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(var/heat, var/time, var/optional) +/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(var/heat, var/time, var/optional) +/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(var/new_description) +/datum/cooking/recipe/proc/set_step_desc(new_description) last_created_step.desc = new_description -/datum/cooking/recipe/proc/set_step_max_quality(var/quality) +/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(var/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(var/new_description) +/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(var/boolean) +/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(var/boolean) +/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(var/list/exclude_list) +/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(var/modifier) +/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(var/modifier) +/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 @@ -555,7 +555,7 @@ Food quality is calculated based on the steps taken. //----------------------------------------------------------------------------------- //Function that dynamically adds a step into a given recipe matrix. -/datum/cooking/recipe/proc/add_step(var/datum/cooking/recipe_step/step, var/optional) +/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. @@ -617,12 +617,12 @@ Food quality is calculated based on the steps taken. //----------------------------------------------------------------------------------- //default function for creating a product -/datum/cooking/recipe/proc/create_product(var/datum/cooking/recipe_pointer/pointer) +/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(max=1000000, A=container) + var/datum/reagents/slurry = new /datum/reagents(1000000, container) //Filter out reagents based on settings if(GLOB.cwj_step_dictionary_ordered["[CWJ_ADD_REAGENT]"]) @@ -745,7 +745,7 @@ Food quality is calculated based on the steps taken. //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(var/datum/cooking/recipe_pointer/pointer) +/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() @@ -768,7 +768,7 @@ Food quality is calculated based on the steps taken. //----------------------------------------------------------------------------------- -/datum/cooking/proc/get_class_string(var/code) +/datum/cooking/proc/get_class_string(code) switch(code) if(CWJ_ADD_ITEM) return "Add Item" diff --git a/code/modules/cooking/cooking_catalog.dm b/code/modules/cooking/cooking_catalog.dm index 92ae1413e4e..c65af8bb448 100644 --- a/code/modules/cooking/cooking_catalog.dm +++ b/code/modules/cooking/cooking_catalog.dm @@ -1,3 +1,5 @@ +//FIXME SHIT I GOTTA REWORK SOME COMPUTER CATALOG +/* /datum/computer_file/program/cook_catalog filename = "cook_catalog" filedesc = "Cooking Assistant" @@ -36,7 +38,7 @@ return 0 //=================================================================================== /proc/createCookingCatalogs() - for(var/datum/cooking_with_jane/recipe/our_recipe in GLOB.cwj_recipe_list) + 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) @@ -77,7 +79,7 @@ return cmp_catalog_entry_asc(a, b) -/proc/create_cooking_catalog_entry(var/datum/cooking_with_jane/recipe/our_recipe) +/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) @@ -92,9 +94,9 @@ /datum/catalog_entry/cooking associated_template = "catalog_entry_cooking.tmpl" - var/datum/cooking_with_jane/recipe/recipe + var/datum/cooking/recipe/recipe -/datum/catalog_entry/cooking/New(var/datum/cooking_with_jane/recipe/our_recipe) +/datum/catalog_entry/cooking/New(var/datum/cooking/recipe/our_recipe) thing_type = our_recipe.type title = our_recipe.name recipe = our_recipe @@ -193,7 +195,7 @@ keep_local_name = FALSE /datum/asset/simple/cooking_icons/register() - for(var/datum/cooking_with_jane/recipe/our_recipe in GLOB.cwj_recipe_list) + for(var/datum/cooking/recipe/our_recipe in GLOB.cwj_recipe_list) var/icon/I = null var/filename = null if(our_recipe.product_type) @@ -212,3 +214,4 @@ 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 index 2074490ed1c..70fda9dbc1f 100644 --- a/code/modules/cooking/cooking_init.dm +++ b/code/modules/cooking/cooking_init.dm @@ -1,11 +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_with_jane/recipe) - recipe_paths -= /datum/cooking_with_jane/recipe + var/list/recipe_paths = typesof(/datum/cooking/recipe) + recipe_paths -= /datum/cooking/recipe for (var/path in recipe_paths) - var/datum/cooking_with_jane/recipe/example_recipe = new path() + 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 \ No newline at end of file + 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 index b1ae309ef7d..62f022c49b8 100644 --- a/code/modules/cooking/cooking_items/cooking_containers.dm +++ b/code/modules/cooking/cooking_items/cooking_containers.dm @@ -7,32 +7,34 @@ //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/cooking_with_jane/cooking_container - icon = 'icons/obj/cwj_cooking/kitchen.dmi' +/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_with_jane/recipe_tracker/tracker = null //To be populated the first time the plate is interacted with. + 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 - reagent_flags = OPENCONTAINER | NO_REACT + 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/cooking_with_jane/cooking_container/Initialize() +/obj/item/reagent_containers/vessel/cooking_container/Initialize() .=..() appearance_flags |= KEEP_TOGETHER -/obj/item/reagent_containers/cooking_with_jane/cooking_container/examine(var/mob/user) +/obj/item/reagent_containers/vessel/cooking_container/examine(mob/user) if(!..(user, 1)) return FALSE if(contents) @@ -40,15 +42,15 @@ if(reagents.total_volume) to_chat(user, get_reagent_info()) -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/get_content_info() +/obj/item/reagent_containers/vessel/cooking_container/proc/get_content_info() var/string = "It contains:
  • " string += jointext(contents, "
  • ") + "
" return string -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/get_reagent_info() +/obj/item/reagent_containers/vessel/cooking_container/proc/get_reagent_info() return "It contains [reagents.total_volume] units of reagents." -/obj/item/reagent_containers/cooking_with_jane/cooking_container/attackby(var/obj/item/used_item, var/mob/user) +/obj/item/reagent_containers/vessel/cooking_container/attackby(obj/item/used_item, mob/user) #ifdef CWJ_DEBUG log_debug("cooking_container/attackby() called!") @@ -65,7 +67,7 @@ return TRUE -/obj/item/reagent_containers/cooking_with_jane/cooking_container/standard_pour_into(mob/user, atom/target) +/obj/item/reagent_containers/vessel/cooking_container/standard_pour_into(mob/user, atom/target) #ifdef CWJ_DEBUG @@ -88,7 +90,7 @@ . = ..(user, target) -/obj/item/reagent_containers/cooking_with_jane/cooking_container/afterattack(var/obj/target, var/mob/user, var/flag) +/obj/item/reagent_containers/vessel/cooking_container/afterattack(obj/target, mob/user, flag) if(!istype(target, /obj/item/reagent_containers)) return if(!flag) @@ -98,7 +100,7 @@ if(standard_pour_into(user, target)) return 1 -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/process_item(var/obj/I, var/mob/user, var/lower_quality_on_fail = 0, var/send_message = TRUE) +/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 @@ -111,7 +113,7 @@ for (var/obj/item/contained in contents) contained?:food_quality -= lower_quality_on_fail else - tracker = new /datum/cooking_with_jane/recipe_tracker(src) + tracker = new /datum/cooking/recipe_tracker(src) var/return_value = 0 switch(tracker.process_item_wrap(I, user)) @@ -119,7 +121,7 @@ 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_with_jane/recipe_pointer/pointer in tracker.active_recipe_pointers) + 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) @@ -151,21 +153,21 @@ return return_value //TODO: Handle the contents of the container being ruined via burning. -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/handle_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/cooking_with_jane/cooking_container/proc/handle_ignition() +/obj/item/reagent_containers/vessel/cooking_container/proc/handle_ignition() return FALSE -/obj/item/reagent_containers/cooking_with_jane/cooking_container/verb/empty() +/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/cooking_with_jane/cooking_container/proc/do_empty(mob/user, var/atom/target = null, var/reagent_clear = TRUE) +/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 @@ -206,12 +208,12 @@ to_chat(user, SPAN_NOTICE("You remove all the solid items from [src].")) -/obj/item/reagent_containers/cooking_with_jane/cooking_container/AltClick(var/mob/user) +/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/cooking_with_jane/cooking_container/proc/clear() +/obj/item/reagent_containers/vessel/cooking_container/proc/clear() QDEL_LIST(contents) contents=list() reagents.clear_reagents() @@ -221,11 +223,11 @@ clear_cooking_data() -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/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/cooking_with_jane/cooking_container/proc/label(var/number, var/CT = null) +/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 @@ -238,8 +240,8 @@ return . + O.name //Just append the name of the first object return . + "empty" -/obj/item/reagent_containers/cooking_with_jane/cooking_container/update_icon() - cut_overlays() +/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) @@ -247,9 +249,9 @@ var/obj/item/our_item = contents[i] src.add_to_visible(our_item) if(lip) - add_overlay(image(src.icon, icon_state=lip, layer=ABOVE_OBJ_LAYER)) + AddOverlays(image(src.icon, icon_state=lip, layer=ABOVE_OBJ_LAYER)) -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/add_to_visible(var/obj/item/our_item) +/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 @@ -257,14 +259,14 @@ our_item.transform *= 0.6 src.vis_contents += our_item -/obj/item/reagent_containers/cooking_with_jane/cooking_container/proc/remove_from_visible(var/obj/item/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/cooking_with_jane/cooking_container/plate - icon = 'icons/obj/cwj_cooking/eris_kitchen.dmi' +/obj/item/reagent_containers/vessel/cooking_container/plate + icon = 'icons/obj/cooking/eris_kitchen.dmi' name = "serving plate" shortname = "plate" desc = "A shitty serving plate. You probably shouldn't be seeing this." @@ -272,7 +274,7 @@ matter = list(MATERIAL_STEEL = 5) appliancetype = PLATE -/obj/item/reagent_containers/cooking_with_jane/cooking_container/board +/obj/item/reagent_containers/vessel/cooking_container/board name = "cutting board" shortname = "cutting_board" desc = "Good for making sandwiches on, too." @@ -281,7 +283,7 @@ matter = list(MATERIAL_WOOD = 5) appliancetype = CUTTING_BOARD -/obj/item/reagent_containers/cooking_with_jane/cooking_container/oven +/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." @@ -291,7 +293,7 @@ matter = list(MATERIAL_STEEL = 10) appliancetype = OVEN -/obj/item/reagent_containers/cooking_with_jane/cooking_container/pan +/obj/item/reagent_containers/vessel/cooking_container/pan name = "pan" desc = "An normal pan." @@ -299,10 +301,10 @@ lip = "pan_lip" item_state = "pan" matter = list(MATERIAL_PLASTEEL = 5) - hitsound = 'sound/weapons/smash.ogg' + hitsound = 'sound/effects/fighting/smash.ogg' appliancetype = PAN -/obj/item/reagent_containers/cooking_with_jane/cooking_container/pot +/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." @@ -312,12 +314,12 @@ item_state = "pot" matter = list(MATERIAL_STEEL = 5) - hitsound = 'sound/weapons/smash.ogg' + hitsound = 'sound/effects/fighting/smash.ogg' removal_penalty = 5 appliancetype = POT - w_class = ITEM_SIZE_BULKY + w_class = ITEM_SIZE_HUGE -/obj/item/reagent_containers/cooking_with_jane/cooking_container/deep_basket +/obj/item/reagent_containers/vessel/cooking_container/deep_basket name = "deep fryer basket" shortname = "basket" desc = "Cwispy! Warranty void if used." @@ -328,7 +330,7 @@ removal_penalty = 5 appliancetype = DF_BASKET -/obj/item/reagent_containers/cooking_with_jane/cooking_container/air_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." @@ -339,7 +341,7 @@ removal_penalty = 5 appliancetype = AF_BASKET -/obj/item/reagent_containers/cooking_with_jane/cooking_container/grill_grate +/obj/item/reagent_containers/vessel/cooking_container/grill_grate name = "grill grate" shortname = "grate" place_verb = "onto" @@ -350,7 +352,7 @@ appliancetype = GRILL -/obj/item/reagent_containers/cooking_with_jane/cooking_container/bowl +/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" diff --git a/code/modules/cooking/cooking_items/dollop.dm b/code/modules/cooking/cooking_items/dollop.dm index 151d3009944..9c0d7d03e34 100644 --- a/code/modules/cooking/cooking_items/dollop.dm +++ b/code/modules/cooking/cooking_items/dollop.dm @@ -1,20 +1,20 @@ /obj/item/reagent_containers/food/dollop name = "dollop of frosting" desc = "A fresh serving of just frosting and nothing but frosting." - icon = 'icons/obj/cwj_cooking/kitchen.dmi' + icon = 'icons/obj/cooking/kitchen.dmi' icon_state = "dollop" bitesize = 4 var/reagent_id = "frosting" - preloaded_reagents = list("frosting" = 30) + startswith = list(/datum/reagent/organic/sugar/frosting = 30) -/obj/item/reagent_containers/food/dollop/New(var/loc, var/new_reagent_id = "frosting", var/new_amount = 30) +/obj/item/reagent_containers/food/dollop/New(loc, new_reagent_id = "frosting", new_amount = 30) . = ..() if(new_reagent_id) var/reagent_name = get_reagent_name_by_id(reagent_id) if(reagent_name) name = "dollop of [reagent_name]" desc = "A fresh serving of just [reagent_name] and nothing but [reagent_name]." - preloaded_reagents = list("[new_reagent_id]" = new_amount) + startswith = list("[new_reagent_id]" = new_amount) /obj/item/reagent_containers/food/dollop/Initialize() . = ..() diff --git a/code/modules/cooking/cooking_items/spatula.dm b/code/modules/cooking/cooking_items/spatula.dm index aea474a7146..4dc8bbb5ada 100644 --- a/code/modules/cooking/cooking_items/spatula.dm +++ b/code/modules/cooking/cooking_items/spatula.dm @@ -1,11 +1,10 @@ /obj/item/tool/shovel/spatula name = "spatula" desc = "A Hydrodynamic Spatula. Port and Starboard attachments not included." - icon = 'icons/obj/cwj_cooking/kitchen.dmi' + icon = 'icons/obj/cooking/kitchen.dmi' icon_state = "spatula" item_state = "spatula" - force = WEAPON_FORCE_WEAK + force = 7 w_class = ITEM_SIZE_SMALL attack_verb = list("smacked", "slapped", "spanked", "whapped", "whacked") hitsound = 'sound/weapons/punch3.ogg' - tool_qualities = list(QUALITY_SHOVELING = 5, QUALITY_DIGGING = 5, QUALITY_HAMMERING = 1) diff --git a/code/modules/cooking/cooking_tracker.dm b/code/modules/cooking/cooking_tracker.dm index 75f80fd6d58..127757e100a 100644 --- a/code/modules/cooking/cooking_tracker.dm +++ b/code/modules/cooking/cooking_tracker.dm @@ -1,8 +1,8 @@ //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_with_jane/recipe_tracker - var/datum/weakref/holder_ref //The parent object holding the recipe tracker. +/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. @@ -11,30 +11,30 @@ 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_with_jane/recipe_tracker/New(var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) +/datum/cooking/recipe_tracker/New(obj/item/reagent_containers/vessel/cooking_container/container) #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_tracker/New") + log_debug("Called /datum/cooking/recipe_tracker/New") #endif - holder_ref = WEAKREF(container) + 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_with_jane/recipe_tracker/proc/apply_flat_penalty(var/penalty) +/datum/cooking/recipe_tracker/proc/apply_flat_penalty(penalty) if(active_recipe_pointers.len == 0) return - for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_pointers) + 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_with_jane/recipe_tracker/proc/generate_pointers() +/datum/cooking/recipe_tracker/proc/generate_pointers() #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/generate_pointers") + log_debug("Called /datum/cooking/recipe_tracker/proc/generate_pointers") #endif - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = holder_ref.resolve() + 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]") @@ -45,30 +45,30 @@ #ifdef CWJ_DEBUG log_debug("Loading [container.appliancetype] , [key] into pointer.") #endif - active_recipe_pointers += new /datum/cooking_with_jane/recipe_pointer(container.appliancetype, key, src) + active_recipe_pointers += new /datum/cooking/recipe_pointer(container.appliancetype, key, src) //Generate next steps -/datum/cooking_with_jane/recipe_tracker/proc/get_step_options() +/datum/cooking/recipe_tracker/proc/get_step_options() #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/get_step_options") + log_debug("Called /datum/cooking/recipe_tracker/proc/get_step_options") #endif var/list/options = list() - for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_pointers) + for (var/datum/cooking/recipe_pointer/pointer in active_recipe_pointers) options += pointer.get_possible_steps() #ifdef CWJ_DEBUG - log_debug("/datum/cooking_with_jane/recipe_tracker/proc/get_step_options returned [options.len] options") + log_debug("/datum/cooking/recipe_tracker/proc/get_step_options returned [options.len] options") #endif return options -/datum/cooking_with_jane/recipe_tracker/proc/populate_step_flags() +/datum/cooking/recipe_tracker/proc/populate_step_flags() #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/populate_step_flags") + log_debug("Called /datum/cooking/recipe_tracker/proc/populate_step_flags") #endif step_flags = 0 - for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_pointers) + 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]") @@ -76,17 +76,17 @@ step_flags |= flag_group //Check if a recipe tracker has recipes loaded. -/datum/cooking_with_jane/recipe_tracker/proc/has_recipes() +/datum/cooking/recipe_tracker/proc/has_recipes() #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/has_recipes") + 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_with_jane/recipe_tracker/proc/process_item_wrap(var/obj/used_object, var/mob/user) +/datum/cooking/recipe_tracker/proc/process_item_wrap(obj/used_object, mob/user) #ifdef CWJ_DEBUG - log_debug("/datum/cooking_with_jane/recipe_tracker/proc/process_item_wrap called!") + log_debug("/datum/cooking/recipe_tracker/proc/process_item_wrap called!") #endif var/response = process_item(used_object, user) @@ -97,13 +97,13 @@ return response //Core function that checks if a object meets all the requirements for certain recipe actions. -/datum/cooking_with_jane/recipe_tracker/proc/process_item(var/obj/used_object, var/mob/user) +/datum/cooking/recipe_tracker/proc/process_item(obj/used_object, mob/user) #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_tracker/proc/process_item") + log_debug("Called /datum/cooking/recipe_tracker/proc/process_item") #endif if(completion_lockout) #ifdef CWJ_DEBUG - log_debug("/datum/cooking_with_jane/recipe_tracker/proc/process_item held in lockout!") + log_debug("/datum/cooking/recipe_tracker/proc/process_item held in lockout!") #endif return CWJ_LOCKOUT var/list/valid_steps = list() @@ -111,10 +111,10 @@ var/use_class //Decide what action is being taken with the item, if any. - for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_pointers) + 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_with_jane/recipe_step/step in option_list) + 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 @@ -159,10 +159,10 @@ var/has_traversed = FALSE //traverse and cull pointers - for (var/datum/cooking_with_jane/recipe_pointer/pointer in active_recipe_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_with_jane/recipe_step/step in option_list) + for (var/datum/cooking/recipe_step/step in option_list) if(!(step.unique_id in valid_unique_id_list)) continue else @@ -182,7 +182,7 @@ if(completed_list.len && (completed_list.len != active_recipe_pointers.len)) var/recipe_string = null - for(var/datum/cooking_with_jane/recipe_pointer/pointer in completed_list) + for(var/datum/cooking/recipe_pointer/pointer in completed_list) if(!recipe_string) recipe_string = "\a [pointer.current_recipe.name]" else @@ -190,13 +190,13 @@ 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_with_jane/recipe_pointer/pointer in completed_list) + 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_with_jane/recipe_pointer/chosen_pointer = null + 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!") @@ -211,7 +211,7 @@ 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_with_jane/recipe_step/sample_step = valid_steps[1] + var/datum/cooking/recipe_step/sample_step = valid_steps[1] #ifdef CWJ_DEBUG log_debug("/recipe_tracker/proc/process_item: Calling follow_step") #endif @@ -235,7 +235,7 @@ //Sleep... My precious, monsterous child.... /* -/datum/cooking_with_jane/recipe_tracker/proc/attempt_complete_recursive( +/datum/cooking/recipe_tracker/proc/attempt_complete_recursive( var/obj/used_object, var/use_class, var/depth = 1, @@ -247,12 +247,12 @@ ourlist = considered_steps.Copy() log_debug("/recipe_tracker/proc/attempt_complete_recursive entered second recursion!") - for (var/datum/cooking_with_jane/recipe_pointer/pointer in ourlist) + 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_with_jane/recipe_step/step in option_list) + for (var/datum/cooking/recipe_step/step in option_list) if(step.class != use_class) continue @@ -282,23 +282,23 @@ //Points to a specific step in a recipe while considering the optional paths that recipe can take. -/datum/cooking_with_jane/recipe_pointer - var/datum/cooking_with_jane/recipe/current_recipe //The recipe being followed here. - var/datum/cooking_with_jane/recipe_step/current_step //The current step in the recipe we are following. +/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/datum/weakref/parent_ref + 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_with_jane/recipe_pointer/New(start_type, recipe_id, var/datum/cooking_with_jane/recipe_tracker/parent) +/datum/cooking/recipe_pointer/New(start_type, recipe_id, datum/cooking/recipe_tracker/parent) #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_pointer/pointer/New([start_type], [recipe_id], parent)") + log_debug("Called /datum/cooking/recipe_pointer/pointer/New([start_type], [recipe_id], parent)") #endif - parent_ref = WEAKREF(parent) + parent_ref = weakref(parent) #ifdef CWJ_DEBUG if(!GLOB.cwj_recipe_dictionary[start_type][recipe_id]) @@ -319,10 +319,10 @@ #endif //A list returning the next possible steps in a given recipe -/datum/cooking_with_jane/recipe_pointer/proc/get_possible_steps() +/datum/cooking/recipe_pointer/proc/get_possible_steps() #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_pointer/proc/get_possible_steps") + 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?") @@ -333,12 +333,12 @@ //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_with_jane/recipe_step/step in current_step.optional_step_list) + 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_with_jane/recipe_step/option_chain_step = step.next_step + 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 @@ -366,14 +366,14 @@ #ifdef CWJ_DEBUG - log_debug("/datum/cooking_with_jane/recipe_pointer/proc/get_possible_steps returned list of length [return_list.len]") + 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_with_jane/recipe_pointer/proc/get_step_flags() +/datum/cooking/recipe_pointer/proc/get_step_flags() #ifdef CWJ_DEBUG - log_debug("Called /datum/cooking_with_jane/recipe_pointer/proc/get_step_flags") + 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) @@ -383,12 +383,12 @@ //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_with_jane/recipe_step/step in current_step.optional_step_list) + 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_with_jane/recipe_step/option_chain_step = step.next_step + 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 @@ -409,27 +409,27 @@ return_flags |= step.class return return_flags -/datum/cooking_with_jane/recipe_pointer/proc/has_option_by_id(var/id) +/datum/cooking/recipe_pointer/proc/has_option_by_id(id) if(!GLOB.cwj_step_dictionary["[id]"]) return FALSE - var/datum/cooking_with_jane/recipe_step/active_step = GLOB.cwj_step_dictionary["[id]"] + 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_with_jane/recipe_pointer/proc/traverse(var/id, var/obj/used_obj) +/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_with_jane/recipe_tracker/tracker = parent_ref.resolve() - var/datum/cooking_with_jane/recipe_step/active_step = GLOB.cwj_step_dictionary["[id]"] + 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_with_jane/recipe_step/possible_step in 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 diff --git a/code/modules/cooking/recipes/example_recipes.dm b/code/modules/cooking/recipes/example_recipes.dm index c0cbd42aabf..bfc0efc852e 100644 --- a/code/modules/cooking/recipes/example_recipes.dm +++ b/code/modules/cooking/recipes/example_recipes.dm @@ -2,7 +2,7 @@ /* //Example of the same recipe, but for the grill, just to show off how compact everything is. -/datum/cooking_with_jane/recipe/sandwich_basic_bowl +/datum/cooking/recipe/sandwich_basic_bowl cooking_container = BOWL product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -12,7 +12,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_deep_fryer +/datum/cooking/recipe/sandwich_deep_fryer cooking_container = DF_BASKET product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -22,7 +22,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_air_fryer +/datum/cooking/recipe/sandwich_air_fryer cooking_container = AF_BASKET product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -32,7 +32,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_pot +/datum/cooking/recipe/sandwich_pot cooking_container = POT product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -42,7 +42,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_oven +/datum/cooking/recipe/sandwich_oven cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -53,7 +53,7 @@ appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_bad_with_tomato +/datum/cooking/recipe/sandwich_bad_with_tomato cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -64,7 +64,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_tofu_bad +/datum/cooking/recipe/sandwich_tofu_bad cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -77,7 +77,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_bad_stacked +/datum/cooking/recipe/sandwich_bad_stacked cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -88,7 +88,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_salted +/datum/cooking/recipe/sandwich_salted cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -99,7 +99,7 @@ ) appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_split +/datum/cooking/recipe/sandwich_split cooking_container = PAN product_type = /obj/item/reagent_containers/food/sandwich product_count = 2 @@ -110,7 +110,7 @@ appear_in_default_catalog = FALSE -/datum/cooking_with_jane/recipe/sandwich_toasted +/datum/cooking/recipe/sandwich_toasted cooking_container = GRILL product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( diff --git a/code/modules/cooking/recipes/recipe.dm b/code/modules/cooking/recipes/recipe.dm index 08ac88559fd..96d9ff34761 100644 --- a/code/modules/cooking/recipes/recipe.dm +++ b/code/modules/cooking/recipes/recipe.dm @@ -1,6 +1,12 @@ +var/list/cutting_tools = list( +) + +var/list/hammering_tools = list( + +) //Example Recipes -/datum/cooking_with_jane/recipe/steak_stove +/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" @@ -60,7 +66,7 @@ //**Meat and Seafood**// //Missing: cubancarp, friedchicken, tonkatsu, enchiladas, monkeysdelight, fishandchips, katsudon, fishfingers, -/datum/cooking_with_jane/recipe/donkpocket //Special interactions in recipes_microwave.dm, not sure if this is going to function as expected +/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 @@ -70,7 +76,7 @@ list(CWJ_ADD_REAGENT, "thermite", 1) //So it cooks inhand, totally. ) -/datum/cooking_with_jane/recipe/cooked_cutlet +/datum/cooking/recipe/cooked_cutlet cooking_container = GRILL product_type = /obj/item/reagent_containers/food/cutlet step_builder = list( @@ -80,7 +86,7 @@ list(CWJ_USE_STOVE, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/cooked_meatball +/datum/cooking/recipe/cooked_meatball cooking_container = PAN product_type = /obj/item/reagent_containers/food/meatball step_builder = list( @@ -90,7 +96,7 @@ list(CWJ_USE_STOVE, J_LO, 20 SECONDS) ) -/datum/cooking_with_jane/recipe/cooked_patty +/datum/cooking/recipe/cooked_patty cooking_container = GRILL product_type = /obj/item/reagent_containers/food/patty step_builder = list( @@ -100,7 +106,7 @@ list(CWJ_USE_GRILL, J_LO, 10 SECONDS) ) -/datum/cooking_with_jane/recipe/chickensteak +/datum/cooking/recipe/chickensteak cooking_container = PAN product_type = /obj/item/reagent_containers/food/chickensteak @@ -128,7 +134,7 @@ list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/porkchops +/datum/cooking/recipe/porkchops cooking_container = PAN product_type = /obj/item/reagent_containers/food/porkchops @@ -157,7 +163,7 @@ list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/roastchicken +/datum/cooking/recipe/roastchicken cooking_container = OVEN product_type = /obj/item/reagent_containers/food/roastchicken step_builder = list( @@ -168,7 +174,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/tofurkey //Not quite meat but cooked similar to roast chicken +/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( @@ -180,7 +186,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/boiled_egg +/datum/cooking/recipe/boiled_egg cooking_container = POT product_type = /obj/item/reagent_containers/food/boiledegg step_builder = list( @@ -190,7 +196,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/friedegg_basic +/datum/cooking/recipe/friedegg_basic cooking_container = PAN product_type = /obj/item/reagent_containers/food/friedegg step_builder = list( @@ -207,7 +213,7 @@ list(CWJ_USE_STOVE, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/bacon +/datum/cooking/recipe/bacon cooking_container = PAN product_type = /obj/item/reagent_containers/food/bacon step_builder = list( @@ -219,7 +225,7 @@ list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/baconegg +/datum/cooking/recipe/baconegg cooking_container = PAN product_type = /obj/item/reagent_containers/food/baconeggs step_builder = list( @@ -232,7 +238,7 @@ list(CWJ_USE_OVEN, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/benedict +/datum/cooking/recipe/benedict cooking_container = PAN product_type = /obj/item/reagent_containers/food/benedict step_builder = list( @@ -248,7 +254,7 @@ list(CWJ_USE_OVEN, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/omelette +/datum/cooking/recipe/omelette cooking_container = PAN product_type = /obj/item/reagent_containers/food/omelette step_builder = list( @@ -264,7 +270,7 @@ list(CWJ_USE_OVEN, J_LO, 10 SECONDS) ) -/datum/cooking_with_jane/recipe/taco +/datum/cooking/recipe/taco cooking_container = PAN product_type = /obj/item/reagent_containers/food/taco step_builder = list( @@ -278,7 +284,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/hotdog +/datum/cooking/recipe/hotdog cooking_container = GRILL product_type = /obj/item/reagent_containers/food/hotdog step_builder = list( @@ -293,7 +299,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/sausage +/datum/cooking/recipe/sausage cooking_container = GRILL product_type = /obj/item/reagent_containers/food/sausage step_builder = list( @@ -305,7 +311,7 @@ list(CWJ_USE_GRILL, J_MED, 10 SECONDS) ) -/datum/cooking_with_jane/recipe/wingfangchu +/datum/cooking/recipe/wingfangchu cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/wingfangchu step_builder = list( @@ -314,7 +320,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/sashimi +/datum/cooking/recipe/sashimi cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sashimi step_builder = list( @@ -324,7 +330,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/chawanmushi +/datum/cooking/recipe/chawanmushi cooking_container = OVEN product_type = /obj/item/reagent_containers/food/chawanmushi step_builder = list( @@ -336,7 +342,7 @@ list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/kabob +/datum/cooking/recipe/kabob cooking_container = GRILL product_type = /obj/item/reagent_containers/food/kabob step_builder = list( @@ -348,7 +354,7 @@ list(CWJ_USE_GRILL, J_MED, 20 SECONDS) ) -/datum/cooking_with_jane/recipe/tofukabob +/datum/cooking/recipe/tofukabob cooking_container = GRILL product_type = /obj/item/reagent_containers/food/tofukabob step_builder = list( @@ -360,7 +366,7 @@ list(CWJ_USE_GRILL, J_MED, 20 SECONDS) ) -/datum/cooking_with_jane/recipe/humankabob +/datum/cooking/recipe/humankabob cooking_container = GRILL product_type = /obj/item/reagent_containers/food/kabob step_builder = list( @@ -374,7 +380,7 @@ //**Cereals and Grains**// //missing: poppyprezel -/datum/cooking_with_jane/recipe/bread +/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." @@ -384,7 +390,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/meatbread +/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." @@ -398,7 +404,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/xenomeatbread +/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." @@ -412,7 +418,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/tofubread +/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." @@ -426,7 +432,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/creamcheesebread +/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." @@ -438,7 +444,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/bananabread +/datum/cooking/recipe/bananabread cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/bananabread @@ -453,7 +459,7 @@ list(CWJ_ADD_PRODUCE, "banana", 1), list(CWJ_USE_OVEN, J_MED, 40 SECONDS) ) -/datum/cooking_with_jane/recipe/baguette +/datum/cooking/recipe/baguette cooking_container = OVEN product_type = /obj/item/reagent_containers/food/baguette step_builder = list( @@ -465,7 +471,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/cracker +/datum/cooking/recipe/cracker cooking_container = OVEN product_type = /obj/item/reagent_containers/food/cracker step_builder = list( @@ -475,7 +481,7 @@ list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/bun +/datum/cooking/recipe/bun cooking_container = OVEN product_type = /obj/item/reagent_containers/food/bun product_count = 3 @@ -487,7 +493,7 @@ list(CWJ_USE_OVEN, J_HI, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/flatbread +/datum/cooking/recipe/flatbread cooking_container = OVEN product_type = /obj/item/reagent_containers/food/flatbread product_count = 3 @@ -497,7 +503,7 @@ list(CWJ_USE_OVEN, J_HI, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/twobread +/datum/cooking/recipe/twobread cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/twobread step_builder = list( @@ -506,7 +512,7 @@ list(CWJ_ADD_REAGENT, "wine", 5) ) -/datum/cooking_with_jane/recipe/pancakes +/datum/cooking/recipe/pancakes cooking_container = PAN product_type = /obj/item/reagent_containers/food/pancakes step_builder = list( @@ -520,7 +526,7 @@ list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/waffles +/datum/cooking/recipe/waffles cooking_container = PAN product_type = /obj/item/reagent_containers/food/waffles step_builder = list( @@ -535,7 +541,7 @@ list(CWJ_USE_OVEN, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/rofflewaffles +/datum/cooking/recipe/rofflewaffles cooking_container = PAN product_type = /obj/item/reagent_containers/food/rofflewaffles step_builder = list( @@ -552,7 +558,7 @@ list(CWJ_USE_OVEN, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/jelliedtoast +/datum/cooking/recipe/jelliedtoast cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jelliedtoast/cherry step_builder = list( @@ -561,7 +567,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/amanitajellytoast +/datum/cooking/recipe/amanitajellytoast cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jelliedtoast/amanita step_builder = list( @@ -570,7 +576,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/slimetoast +/datum/cooking/recipe/slimetoast cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jelliedtoast/slime step_builder = list( @@ -579,7 +585,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/stuffing +/datum/cooking/recipe/stuffing cooking_container = BOWL product_type = /obj/item/reagent_containers/food/stuffing product_count = 3 @@ -591,7 +597,7 @@ list(CWJ_ADD_REAGENT, "water", 5), ) -/datum/cooking_with_jane/recipe/tortilla +/datum/cooking/recipe/tortilla cooking_container = OVEN product_type = /obj/item/reagent_containers/food/tortilla product_count = 3 @@ -602,7 +608,7 @@ list(CWJ_USE_OVEN, J_HI, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/muffin +/datum/cooking/recipe/muffin cooking_container = OVEN product_type = /obj/item/reagent_containers/food/muffin step_builder = list( @@ -613,7 +619,7 @@ list(CWJ_USE_STOVE, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/boiledrice +/datum/cooking/recipe/boiledrice cooking_container = POT product_type = /obj/item/reagent_containers/food/boiledrice step_builder = list( @@ -623,7 +629,7 @@ list(CWJ_USE_STOVE, J_HI, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/ricepudding +/datum/cooking/recipe/ricepudding cooking_container = BOWL product_type = /obj/item/reagent_containers/food/ricepudding step_builder = list( @@ -633,7 +639,7 @@ ) //**Burgers**// -/datum/cooking_with_jane/recipe/burger +/datum/cooking/recipe/burger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/monkeyburger @@ -651,7 +657,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/patty) ) -/datum/cooking_with_jane/recipe/humanburger +/datum/cooking/recipe/humanburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/human/burger @@ -669,7 +675,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/human) ) -/datum/cooking_with_jane/recipe/brainburger +/datum/cooking/recipe/brainburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/brainburger @@ -687,7 +693,7 @@ list(CWJ_ADD_ITEM, /obj/item/organ/internal/vital/brain) ) -/datum/cooking_with_jane/recipe/roburger +/datum/cooking/recipe/roburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/roburger @@ -705,7 +711,7 @@ list(CWJ_ADD_ITEM, /obj/item/robot_parts/head) ) -/datum/cooking_with_jane/recipe/xenoburger +/datum/cooking/recipe/xenoburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/xenoburger @@ -723,7 +729,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xenomeat) ) -/datum/cooking_with_jane/recipe/fishburger +/datum/cooking/recipe/fishburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/fishburger @@ -741,7 +747,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/carp) ) -/datum/cooking_with_jane/recipe/tofuburger +/datum/cooking/recipe/tofuburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/tofuburger @@ -759,7 +765,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/tofu) ) -/datum/cooking_with_jane/recipe/clownburger +/datum/cooking/recipe/clownburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/clownburger @@ -777,7 +783,7 @@ list(CWJ_ADD_ITEM, /obj/item/clothing/mask/gas/clown_hat) ) -/datum/cooking_with_jane/recipe/mimeburger +/datum/cooking/recipe/mimeburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/mimeburger @@ -795,7 +801,7 @@ list(CWJ_ADD_ITEM, /obj/item/clothing/head/beret) ) -/datum/cooking_with_jane/recipe/bigbiteburger +/datum/cooking/recipe/bigbiteburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/bigbiteburger @@ -816,7 +822,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledegg, qmod=0.5) ) -/datum/cooking_with_jane/recipe/superbiteburger +/datum/cooking/recipe/superbiteburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/superbiteburger @@ -836,7 +842,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/boiledegg, qmod=0.5) ) -/datum/cooking_with_jane/recipe/jellyburger +/datum/cooking/recipe/jellyburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jellyburger @@ -854,7 +860,7 @@ list(CWJ_ADD_REAGENT, "cherryjelly", 5) ) -/datum/cooking_with_jane/recipe/amanitajellyburger +/datum/cooking/recipe/amanitajellyburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jellyburger/amanita @@ -872,7 +878,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/jelly/amanita, qmod=0.5) ) -/datum/cooking_with_jane/recipe/slimeburger +/datum/cooking/recipe/slimeburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jellyburger/slime @@ -891,7 +897,7 @@ ) //**Sandwiches**// -/datum/cooking_with_jane/recipe/sandwich_basic +/datum/cooking/recipe/sandwich_basic cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( @@ -905,7 +911,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) ) -/datum/cooking_with_jane/recipe/slimesandwich +/datum/cooking/recipe/slimesandwich cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jellysandwich/slime step_builder = list( @@ -914,7 +920,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) ) -/datum/cooking_with_jane/recipe/cherrysandwich +/datum/cooking/recipe/cherrysandwich cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jellysandwich/cherry step_builder = list( @@ -923,7 +929,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) ) -/datum/cooking_with_jane/recipe/amanitajellysandwich +/datum/cooking/recipe/amanitajellysandwich cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jellysandwich/amanita step_builder = list( @@ -932,7 +938,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) ) -/datum/cooking_with_jane/recipe/blt +/datum/cooking/recipe/blt cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/blt step_builder = list( @@ -946,7 +952,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) ) -/datum/cooking_with_jane/recipe/grilledcheese +/datum/cooking/recipe/grilledcheese cooking_container = GRILL product_type = /obj/item/reagent_containers/food/grilledcheese step_builder = list( @@ -957,7 +963,7 @@ list(CWJ_USE_GRILL, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/toastedsandwich +/datum/cooking/recipe/toastedsandwich cooking_container = GRILL product_type = /obj/item/reagent_containers/food/toastedsandwich step_builder = list( @@ -968,7 +974,7 @@ //**Erisian Cuisine**// //Left out due to never having existed previously: Spider burgers, Kraftwerk, Benzin -/datum/cooking_with_jane/recipe/boiled_roach_egg +/datum/cooking/recipe/boiled_roach_egg cooking_container = POT product_type = /obj/item/reagent_containers/food/roach_egg step_builder = list( @@ -978,7 +984,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/kampferburger +/datum/cooking/recipe/kampferburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/kampferburger @@ -992,7 +998,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat) ) -/datum/cooking_with_jane/recipe/seucheburger +/datum/cooking/recipe/seucheburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/seucheburger @@ -1006,7 +1012,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/seuche) ) -/datum/cooking_with_jane/recipe/panzerburger +/datum/cooking/recipe/panzerburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/panzerburger @@ -1020,7 +1026,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/panzer) ) -/datum/cooking_with_jane/recipe/jagerburger +/datum/cooking/recipe/jagerburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/jagerburger @@ -1034,7 +1040,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/jager) ) -/datum/cooking_with_jane/recipe/bigroachburger //Difference: Requires boiled roach egg +/datum/cooking/recipe/bigroachburger //Difference: Requires boiled roach egg cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/bigroachburger @@ -1052,7 +1058,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/jager) ) -/datum/cooking_with_jane/recipe/fuhrerburger //Difference: Requires boiled roach egg +/datum/cooking/recipe/fuhrerburger //Difference: Requires boiled roach egg cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/fuhrerburger @@ -1067,7 +1073,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/fuhrer) ) -/datum/cooking_with_jane/recipe/kaiserburger //Difference: Requires boiled roach egg +/datum/cooking/recipe/kaiserburger //Difference: Requires boiled roach egg cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/kaiserburger @@ -1082,7 +1088,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/kaiser) ) -/datum/cooking_with_jane/recipe/wormburger +/datum/cooking/recipe/wormburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/wormburger @@ -1096,7 +1102,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/moecube/worm) ) -/datum/cooking_with_jane/recipe/geneburger +/datum/cooking/recipe/geneburger cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/geneburger @@ -1111,7 +1117,7 @@ ) //**Pastas**// -/datum/cooking_with_jane/recipe/raw_spaghetti +/datum/cooking/recipe/raw_spaghetti cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/spaghetti step_builder = list( @@ -1120,7 +1126,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/boiledspaghetti +/datum/cooking/recipe/boiledspaghetti cooking_container = POT product_type = /obj/item/reagent_containers/food/boiledspaghetti step_builder = list( @@ -1130,7 +1136,7 @@ list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/pastatomato +/datum/cooking/recipe/pastatomato cooking_container = PAN product_type = /obj/item/reagent_containers/food/pastatomato step_builder = list( @@ -1142,7 +1148,7 @@ list(CWJ_USE_STOVE, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/meatballspaghetti +/datum/cooking/recipe/meatballspaghetti cooking_container = PAN product_type = /obj/item/reagent_containers/food/meatballspaghetti step_builder = list( @@ -1155,7 +1161,7 @@ list(CWJ_USE_STOVE, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/spesslaw +/datum/cooking/recipe/spesslaw cooking_container = PAN product_type = /obj/item/reagent_containers/food/spesslaw step_builder = list( @@ -1171,7 +1177,7 @@ ) //**Pizzas**// -/datum/cooking_with_jane/recipe/pizzamargherita +/datum/cooking/recipe/pizzamargherita cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/pizza/margherita step_builder = list( @@ -1186,7 +1192,7 @@ list(CWJ_USE_OVEN, J_MED, 35 SECONDS) ) -/datum/cooking_with_jane/recipe/meatpizza +/datum/cooking/recipe/meatpizza cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/pizza/meatpizza step_builder = list( @@ -1201,7 +1207,7 @@ list(CWJ_USE_OVEN, J_MED, 35 SECONDS) ) -/datum/cooking_with_jane/recipe/mushroompizza +/datum/cooking/recipe/mushroompizza cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/pizza/mushroompizza step_builder = list( @@ -1218,7 +1224,7 @@ list(CWJ_USE_OVEN, J_MED, 35 SECONDS) ) -/datum/cooking_with_jane/recipe/vegetablepizza +/datum/cooking/recipe/vegetablepizza cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/pizza/vegetablepizza step_builder = list( @@ -1235,7 +1241,7 @@ ) //**Pies**// -/datum/cooking_with_jane/recipe/meatpie +/datum/cooking/recipe/meatpie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/meatpie step_builder = list( @@ -1245,7 +1251,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/tofupie +/datum/cooking/recipe/tofupie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/tofupie step_builder = list( @@ -1255,7 +1261,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/xemeatpie +/datum/cooking/recipe/xemeatpie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/xemeatpie step_builder = list( @@ -1265,7 +1271,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/pie +/datum/cooking/recipe/pie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/pie step_builder = list( @@ -1277,7 +1283,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/cherrypie +/datum/cooking/recipe/cherrypie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/cherrypie step_builder = list( @@ -1289,7 +1295,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/berryclafoutis +/datum/cooking/recipe/berryclafoutis cooking_container = OVEN product_type = /obj/item/reagent_containers/food/berryclafoutis step_builder = list( @@ -1301,7 +1307,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/amanita_pie +/datum/cooking/recipe/amanita_pie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/amanita_pie step_builder = list( @@ -1312,7 +1318,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/plump_pie +/datum/cooking/recipe/plump_pie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/plump_pie step_builder = list( @@ -1323,7 +1329,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/pumpkinpie +/datum/cooking/recipe/pumpkinpie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/pumpkinpie step_builder = list( @@ -1334,7 +1340,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/applepie +/datum/cooking/recipe/applepie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/applepie step_builder = list( @@ -1346,7 +1352,7 @@ ) //**Salads**// -/datum/cooking_with_jane/recipe/tossedsalad +/datum/cooking/recipe/tossedsalad cooking_container = BOWL product_type = /obj/item/reagent_containers/food/tossedsalad step_builder = list( @@ -1361,7 +1367,7 @@ list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), ) -/datum/cooking_with_jane/recipe/aesirsalad +/datum/cooking/recipe/aesirsalad cooking_container = BOWL product_type = /obj/item/reagent_containers/food/aesirsalad step_builder = list( @@ -1373,7 +1379,7 @@ list(CWJ_ADD_PRODUCE, "goldapple", qmod=0.2), ) -/datum/cooking_with_jane/recipe/validsalad +/datum/cooking/recipe/validsalad cooking_container = BOWL product_type = /obj/item/reagent_containers/food/validsalad step_builder = list( @@ -1388,7 +1394,7 @@ list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), ) //**Soups**// Possibly replaced by Handyman's Soup project, which'll be based on cauldron soup kitchen aesthetic -/datum/cooking_with_jane/recipe/tomatosoup +/datum/cooking/recipe/tomatosoup cooking_container = POT product_type = /obj/item/reagent_containers/food/tomatosoup step_builder = list( @@ -1403,7 +1409,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/meatballsoup +/datum/cooking/recipe/meatballsoup cooking_container = POT product_type = /obj/item/reagent_containers/food/meatballsoup step_builder = list( @@ -1416,7 +1422,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/vegetablesoup +/datum/cooking/recipe/vegetablesoup cooking_container = POT product_type = /obj/item/reagent_containers/food/vegetablesoup step_builder = list( @@ -1429,7 +1435,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/nettlesoup +/datum/cooking/recipe/nettlesoup cooking_container = POT product_type = /obj/item/reagent_containers/food/nettlesoup step_builder = list( @@ -1440,7 +1446,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/wishsoup +/datum/cooking/recipe/wishsoup cooking_container = POT product_type = /obj/item/reagent_containers/food/wishsoup step_builder = list( @@ -1449,7 +1455,7 @@ list(CWJ_USE_STOVE, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/coldchili +/datum/cooking/recipe/coldchili cooking_container = POT product_type = /obj/item/reagent_containers/food/coldchili step_builder = list( @@ -1461,7 +1467,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/hotchili +/datum/cooking/recipe/hotchili cooking_container = POT product_type = /obj/item/reagent_containers/food/coldchili step_builder = list( @@ -1473,7 +1479,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/bearchili +/datum/cooking/recipe/bearchili cooking_container = POT product_type = /obj/item/reagent_containers/food/bearchili step_builder = list( @@ -1485,7 +1491,7 @@ list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/stew +/datum/cooking/recipe/stew cooking_container = POT product_type = /obj/item/reagent_containers/food/stew step_builder = list( @@ -1499,7 +1505,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/milosoup +/datum/cooking/recipe/milosoup cooking_container = POT product_type = /obj/item/reagent_containers/food/milosoup step_builder = list( @@ -1512,7 +1518,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/beetsoup +/datum/cooking/recipe/beetsoup cooking_container = POT product_type = /obj/item/reagent_containers/food/beetsoup step_builder = list( @@ -1527,7 +1533,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/mushroomsoup +/datum/cooking/recipe/mushroomsoup cooking_container = POT product_type = /obj/item/reagent_containers/food/mushroomsoup step_builder = list( @@ -1547,7 +1553,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/mysterysoup +/datum/cooking/recipe/mysterysoup cooking_container = POT product_type = /obj/item/reagent_containers/food/mysterysoup step_builder = list( @@ -1561,7 +1567,7 @@ list(CWJ_USE_STOVE, J_MED, 20 SECONDS) ) -/datum/cooking_with_jane/recipe/bloodsoup +/datum/cooking/recipe/bloodsoup cooking_container = POT product_type = /obj/item/reagent_containers/food/bloodsoup step_builder = list( @@ -1570,7 +1576,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/slimesoup +/datum/cooking/recipe/slimesoup cooking_container = POT product_type = /obj/item/reagent_containers/food/slimesoup step_builder = list( @@ -1580,7 +1586,7 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/beefcurry +/datum/cooking/recipe/beefcurry cooking_container = POT product_type = /obj/item/reagent_containers/food/beefcurry @@ -1599,7 +1605,7 @@ list(CWJ_USE_STOVE, J_MED, 40 SECONDS) ) -/datum/cooking_with_jane/recipe/chickencurry +/datum/cooking/recipe/chickencurry cooking_container = POT product_type = /obj/item/reagent_containers/food/chickencurry @@ -1620,7 +1626,7 @@ //**Vegetables**// //missing: soylenviridians, soylentgreen -/datum/cooking_with_jane/recipe/mashpotato +/datum/cooking/recipe/mashpotato cooking_container = BOWL product_type = /obj/item/reagent_containers/food/mashpotatoes @@ -1634,7 +1640,7 @@ list(CWJ_USE_TOOL, QUALITY_HAMMERING, 15) ) -/datum/cooking_with_jane/recipe/loadedbakedpotato +/datum/cooking/recipe/loadedbakedpotato cooking_container = OVEN product_type = /obj/item/reagent_containers/food/loadedbakedpotato @@ -1648,7 +1654,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/fries +/datum/cooking/recipe/fries cooking_container = PAN product_type = /obj/item/reagent_containers/food/fries step_builder = list( @@ -1658,7 +1664,7 @@ list(CWJ_USE_STOVE, J_HI, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/cheesyfries +/datum/cooking/recipe/cheesyfries cooking_container = PAN product_type = /obj/item/reagent_containers/food/cheesyfries step_builder = list( @@ -1667,7 +1673,7 @@ list(CWJ_USE_STOVE, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/eggplantparm +/datum/cooking/recipe/eggplantparm cooking_container = OVEN product_type = /obj/item/reagent_containers/food/eggplantparm step_builder = list( @@ -1684,7 +1690,7 @@ list(CWJ_USE_STOVE, J_HI, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/stewedsoymeat +/datum/cooking/recipe/stewedsoymeat cooking_container = POT product_type = /obj/item/reagent_containers/food/stewedsoymeat step_builder = list( @@ -1698,7 +1704,7 @@ ) //**Cakes**// -/datum/cooking_with_jane/recipe/plaincake +/datum/cooking/recipe/plaincake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/plaincake step_builder = list( @@ -1711,7 +1717,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/carrotcake +/datum/cooking/recipe/carrotcake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/carrotcake step_builder = list( @@ -1723,7 +1729,7 @@ list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/cheesecake +/datum/cooking/recipe/cheesecake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/cheesecake step_builder = list( @@ -1734,7 +1740,7 @@ list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/orangecake +/datum/cooking/recipe/orangecake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/orangecake step_builder = list( @@ -1744,7 +1750,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/limecake +/datum/cooking/recipe/limecake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/limecake step_builder = list( @@ -1754,7 +1760,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/lemoncake +/datum/cooking/recipe/lemoncake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/lemoncake step_builder = list( @@ -1764,7 +1770,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/chocolatecake +/datum/cooking/recipe/chocolatecake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/chocolatecake step_builder = list( @@ -1775,7 +1781,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/applecake +/datum/cooking/recipe/applecake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/applecake step_builder = list( @@ -1786,7 +1792,7 @@ list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/birthdaycake +/datum/cooking/recipe/birthdaycake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/birthdaycake step_builder = list( @@ -1796,7 +1802,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/braincake +/datum/cooking/recipe/braincake cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/braincake step_builder = list( @@ -1807,7 +1813,7 @@ list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) -/datum/cooking_with_jane/recipe/brownies +/datum/cooking/recipe/brownies cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sliceable/brownie step_builder = list( @@ -1824,7 +1830,7 @@ //**Desserts and Sweets**// //missing: fortunecookie, honey_bun, honey_pudding //Changes: Now a chemical reaction: candy_corn, mint, -/datum/cooking_with_jane/recipe/chocolateegg +/datum/cooking/recipe/chocolateegg cooking_container = POT product_type = /obj/item/reagent_containers/food/chocolateegg step_builder = list( @@ -1834,7 +1840,7 @@ list(CWJ_USE_STOVE, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/candiedapple +/datum/cooking/recipe/candiedapple cooking_container = PAN product_type = /obj/item/reagent_containers/food/candiedapple step_builder = list( @@ -1845,7 +1851,7 @@ list(CWJ_USE_STOVE, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/cookie +/datum/cooking/recipe/cookie cooking_container = OVEN product_type = /obj/item/reagent_containers/food/cookie step_builder = list( @@ -1858,7 +1864,7 @@ list(CWJ_USE_STOVE, J_LO, 5 SECONDS) ) -/datum/cooking_with_jane/recipe/appletart +/datum/cooking/recipe/appletart cooking_container = OVEN product_type = /obj/item/reagent_containers/food/appletart step_builder = list( @@ -1872,7 +1878,7 @@ list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/plumphelmetbiscuit +/datum/cooking/recipe/plumphelmetbiscuit cooking_container = OVEN product_type = /obj/item/reagent_containers/food/plumphelmetbiscuit step_builder = list( @@ -1884,7 +1890,7 @@ list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) -/datum/cooking_with_jane/recipe/popcorn +/datum/cooking/recipe/popcorn cooking_container = PAN product_type = /obj/item/reagent_containers/food/popcorn step_builder = list( @@ -1897,7 +1903,7 @@ //UNSORTED //missing: spacylibertyduff -/datum/cooking_with_jane/recipe/boiledslimeextract +/datum/cooking/recipe/boiledslimeextract cooking_container = POT product_type = /obj/item/reagent_containers/food/boiledslimecore step_builder = list( diff --git a/code/modules/cooking/recipes/recipe_donuts.dm b/code/modules/cooking/recipes/recipe_donuts.dm index a1c0b26f555..19c98128fc2 100644 --- a/code/modules/cooking/recipes/recipe_donuts.dm +++ b/code/modules/cooking/recipes/recipe_donuts.dm @@ -1,4 +1,4 @@ -/datum/cooking_with_jane/recipe/medialuna //This is 100% a donut but with extra layers +/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( @@ -11,7 +11,7 @@ list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) -/datum/cooking_with_jane/recipe/donut +/datum/cooking/recipe/donut cooking_container = OVEN product_type = /obj/item/reagent_containers/food/donut step_builder = list( @@ -22,7 +22,7 @@ list(CWJ_USE_OVEN, J_LO, 10 SECONDS) ) -/datum/cooking_with_jane/recipe/jellydonut +/datum/cooking/recipe/jellydonut cooking_container = OVEN product_type = /obj/item/reagent_containers/food/donut/jelly step_builder = list( @@ -34,7 +34,7 @@ list(CWJ_USE_OVEN, J_LO, 20 SECONDS) ) -/datum/cooking_with_jane/recipe/slime_jellydonut +/datum/cooking/recipe/slime_jellydonut cooking_container = OVEN product_type = /obj/item/reagent_containers/food/donut/slimejelly step_builder = list( @@ -46,7 +46,7 @@ list(CWJ_USE_OVEN, J_LO, 20 SECONDS) ) -/datum/cooking_with_jane/recipe/cinnamonroll +/datum/cooking/recipe/cinnamonroll cooking_container = OVEN product_type = /obj/item/reagent_containers/food/cinnamonroll step_builder = list( diff --git a/code/modules/cooking/step_defines.dm b/code/modules/cooking/step_defines.dm index 2c1c87da2e9..f4f35e35461 100644 --- a/code/modules/cooking/step_defines.dm +++ b/code/modules/cooking/step_defines.dm @@ -1,5 +1,5 @@ //A step in a recipe, whether optional or required -/datum/cooking_with_jane/recipe_step +/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. @@ -24,16 +24,16 @@ //The next required step for the parent recipe - var/datum/cooking_with_jane/recipe_step/next_step + var/datum/cooking/recipe_step/next_step //The previous required step for the current recipe - var/datum/cooking_with_jane/recipe_step/previous_step + var/datum/cooking/recipe_step/previous_step var/auto_complete_enabled = FALSE //If the step can be completed without any further input. -/datum/cooking_with_jane/recipe_step/New(var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/New(datum/cooking/recipe/our_recipe) parent_recipe = our_recipe unique_id = sequential_id("recipe_step") @@ -46,25 +46,25 @@ GLOB.cwj_step_dictionary_ordered["[class]"]["[unique_id]"] = src GLOB.cwj_step_dictionary["[unique_id]"] = src -/datum/cooking_with_jane/recipe_step/proc/set_image() +/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_with_jane/recipe_step/proc/calculate_quality(var/obj/added_item, var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) +/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_with_jane/recipe_step/proc/check_conditions_met() +/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_with_jane/recipe_step/proc/in_option_chain(var/datum/cooking_with_jane/recipe_step/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_with_jane/recipe_step/target_step = src.previous_step + 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) @@ -82,24 +82,24 @@ return FALSE //Automatically clamps food based on their maximum and minimum quality, if they are set. -/datum/cooking_with_jane/recipe_step/proc/clamp_quality(var/raw_quality) +/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) + 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_with_jane/recipe_step/proc/get_step_result_text(var/obj/used_obj, step_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_with_jane/recipe_step/proc/follow_step(var/obj/added_item, var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) +/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_with_jane/recipe_step/proc/is_complete(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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 index 53d98ca1dc0..d0724ef571d 100644 --- a/code/modules/cooking/step_types/add_item.dm +++ b/code/modules/cooking/step_types/add_item.dm @@ -2,7 +2,7 @@ //This basically deletes the food used on it. //ENSURE THE INCOMING ITEM HAS var/quality DEFINED! -/datum/cooking_with_jane/recipe_step/add_item +/datum/cooking/recipe_step/add_item class = CWJ_ADD_ITEM var/required_item_type //Item required for the recipe step @@ -17,11 +17,11 @@ //item_type: The type path of the object we are looking for. //our_recipe: The parent recipe object, -/datum/cooking_with_jane/recipe_step/add_item/New(var/item_type, var/datum/cooking_with_jane/recipe/our_recipe) +/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_with_jane/recipe_step/add_item/New(): item [item_type] is not a valid path") + 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() @@ -34,12 +34,12 @@ QDEL_NULL(example_item) #ifdef CWJ_DEBUG else - log_debug("/datum/cooking_with_jane/recipe_step/add_item/New(): item [item_type] couldn't be created.") + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] couldn't be created.") #endif ..(our_recipe) -/datum/cooking_with_jane/recipe_step/add_item/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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 @@ -56,18 +56,18 @@ //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_with_jane/recipe_step/add_item/calculate_quality(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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_with_jane/recipe_step/add_item/follow_step(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/add_item/follow_step(obj/added_item, datum/cooking/recipe_tracker/tracker) #ifdef CWJ_DEBUG - log_debug("Called: /datum/cooking_with_jane/recipe_step/add_item/follow_step") + log_debug("Called: /datum/cooking/recipe_step/add_item/follow_step") #endif var/obj/item/container = tracker.holder_ref.resolve() if(container) - if(usr.canUnEquip(added_item)) - usr.unEquip(added_item, container) + if(usr.can_unequip(added_item)) + usr.__unequip(added_item) 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 index 831a5573ce4..ce71fc20acc 100644 --- a/code/modules/cooking/step_types/add_produce.dm +++ b/code/modules/cooking/step_types/add_produce.dm @@ -1,5 +1,5 @@ //A cooking step that involves using SPECIFICALLY Grown foods -/datum/cooking_with_jane/recipe_step/add_produce +/datum/cooking/recipe_step/add_produce class=CWJ_ADD_PRODUCE var/required_produce_type var/base_potency @@ -8,9 +8,9 @@ var/list/exclude_reagents = list() -/datum/cooking_with_jane/recipe_step/add_produce/New(var/produce, var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/add_produce/New(produce, datum/cooking/recipe/our_recipe) if(!plant_controller) - CRASH("/datum/cooking_with_jane/recipe_step/add_produce/New: Plant controller not initialized! Exiting.") + CRASH("/datum/cooking/recipe_step/add_produce/New: Plant controller not initialized! Exiting.") if(produce && plant_controller && plant_controller.seeds[produce]) desc = "Add \a [produce] into the recipe." required_produce_type = produce @@ -25,10 +25,10 @@ log_debug("[seed] is missing it's icon to add to tooltip_image") base_potency = seed.get_trait(TRAIT_POTENCY) else - CRASH("/datum/cooking_with_jane/recipe_step/add_produce/New: Seed [produce] not found. Exiting.") + CRASH("/datum/cooking/recipe_step/add_produce/New: Seed [produce] not found. Exiting.") ..(base_quality_award, our_recipe) -/datum/cooking_with_jane/recipe_step/add_produce/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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 @@ -43,7 +43,7 @@ return CWJ_CHECK_INVALID -/datum/cooking_with_jane/recipe_step/add_produce/calculate_quality(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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 @@ -51,14 +51,14 @@ return clamp_quality(potency_raw) -/datum/cooking_with_jane/recipe_step/add_produce/follow_step(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/add_produce/follow_step(obj/added_item, datum/cooking/recipe_tracker/tracker) #ifdef CWJ_DEBUG - log_debug("Called: /datum/cooking_with_jane/recipe_step/add_produce/follow_step") + log_debug("Called: /datum/cooking/recipe_step/add_produce/follow_step") #endif var/obj/item/container = tracker.holder_ref.resolve() if(container) - if(usr.canUnEquip(added_item)) - usr.unEquip(added_item, container) + if(usr.can_unequip(added_item)) + usr.__unequip(added_item) 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 index 2c14da9b4ee..0fdab4783c8 100644 --- a/code/modules/cooking/step_types/add_reagent.dm +++ b/code/modules/cooking/step_types/add_reagent.dm @@ -1,5 +1,5 @@ //A cooking step that involves adding a reagent to the food. -/datum/cooking_with_jane/recipe_step/add_reagent +/datum/cooking/recipe_step/add_reagent class=CWJ_ADD_REAGENT auto_complete_enabled = TRUE var/expected_total @@ -11,7 +11,7 @@ //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_with_jane/recipe_step/add_reagent/New(var/reagent_id, var/amount, var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/add_reagent/New(reagent_id, amount, datum/cooking/recipe/our_recipe) var/datum/reagent/global_reagent = GLOB.chemical_reagents_list[reagent_id] if(global_reagent) @@ -22,12 +22,12 @@ required_reagent_amount = amount else - CRASH("/datum/cooking_with_jane/recipe_step/add/reagent/New(): Reagent [reagent_id] not found. Recipe: [our_recipe]") + CRASH("/datum/cooking/recipe_step/add/reagent/New(): Reagent [reagent_id] not found. Recipe: [our_recipe]") ..(our_recipe) -/datum/cooking_with_jane/recipe_step/add_reagent/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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() @@ -36,7 +36,7 @@ if(!istype(used_item, /obj/item/reagent_containers)) return CWJ_CHECK_INVALID - if(!(used_item.reagent_flags & OPENCONTAINER)) + if(!(used_item.atom_flags & ATOM_FLAG_OPEN_CONTAINER)) return CWJ_CHECK_INVALID var/obj/item/reagent_containers/our_item = used_item @@ -47,8 +47,8 @@ return CWJ_CHECK_VALID -//Reagents are calculated in two areas. Here and /datum/cooking_with_jane/recipe/proc/calculate_reagent_quality -/datum/cooking_with_jane/recipe_step/add_reagent/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +//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 @@ -57,7 +57,7 @@ return cooked_quality -/datum/cooking_with_jane/recipe_step/add_reagent/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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() @@ -68,7 +68,7 @@ return CWJ_SUCCESS -/datum/cooking_with_jane/recipe_step/add_reagent/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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 diff --git a/code/modules/cooking/step_types/recipe_start.dm b/code/modules/cooking/step_types/recipe_start.dm index a03b5c953a4..2acfc32537f 100644 --- a/code/modules/cooking/step_types/recipe_start.dm +++ b/code/modules/cooking/step_types/recipe_start.dm @@ -1,11 +1,9 @@ //The default starting step. //Doesn't do anything, just holds the item. -/datum/cooking_with_jane/recipe_step/start +/datum/cooking/recipe_step/start class = CWJ_START var/required_container -/datum/cooking_with_jane/recipe_step/start/New(var/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 index 45b47d6a54e..0e13f987203 100644 --- a/code/modules/cooking/step_types/use_grill.dm +++ b/code/modules/cooking/step_types/use_grill.dm @@ -1,5 +1,5 @@ //A cooking step that involves adding a reagent to the food. -/datum/cooking_with_jane/recipe_step/use_grill +/datum/cooking/recipe_step/use_grill class=CWJ_USE_GRILL auto_complete_enabled = TRUE var/time @@ -9,7 +9,7 @@ //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_with_jane/recipe_step/use_grill/New(var/set_heat, var/set_time, var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/use_grill/New(set_heat, set_time, datum/cooking/recipe/our_recipe) @@ -21,7 +21,7 @@ ..(our_recipe) -/datum/cooking_with_jane/recipe_step/use_grill/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_grill/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) if(!istype(used_item, /obj/machinery/cooking_with_jane/grill)) return CWJ_CHECK_INVALID @@ -29,8 +29,8 @@ return CWJ_CHECK_VALID //Reagents are calculated prior to object creation -/datum/cooking_with_jane/recipe_step/use_grill/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() +/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/cooking_with_jane/grill/our_grill = used_item @@ -47,12 +47,12 @@ return clamp_quality(good_cooking) -/datum/cooking_with_jane/recipe_step/use_grill/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_grill/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) return CWJ_SUCCESS -/datum/cooking_with_jane/recipe_step/use_grill/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_grill/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() if(container.grill_data[heat] >= time) #ifdef CWJ_DEBUG @@ -64,4 +64,3 @@ 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 index 726f47df9ee..42e7bf65c9f 100644 --- a/code/modules/cooking/step_types/use_item.dm +++ b/code/modules/cooking/step_types/use_item.dm @@ -1,5 +1,5 @@ //A cooking step that involves using an item on the food. -/datum/cooking_with_jane/recipe_step/use_item +/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. @@ -7,10 +7,10 @@ //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_with_jane/recipe_step/use_item/New(var/item_type, var/datum/cooking_with_jane/recipe/our_recipe) +/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_with_jane/recipe_step/add_item/New(): item [item_type] is not a valid path") + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] is not a valid path") #endif var/example_item = new item_type() @@ -23,12 +23,12 @@ QDEL_NULL(example_item) #ifdef CWJ_DEBUG else - log_debug("/datum/cooking_with_jane/recipe_step/add_item/New(): item [item_type] couldn't be created.") + log_debug("/datum/cooking/recipe_step/add_item/New(): item [item_type] couldn't be created.") #endif ..(our_recipe) -/datum/cooking_with_jane/recipe_step/use_item/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/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 @@ -38,5 +38,5 @@ return CWJ_CHECK_INVALID //Think about a way to make this more intuitive? -/datum/cooking_with_jane/recipe_step/use_item/calculate_quality(var/obj/added_item) +/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 index 985acfd0de9..fe2a73eb687 100644 --- a/code/modules/cooking/step_types/use_oven.dm +++ b/code/modules/cooking/step_types/use_oven.dm @@ -1,5 +1,5 @@ //A cooking step that involves adding a reagent to the food. -/datum/cooking_with_jane/recipe_step/use_oven +/datum/cooking/recipe_step/use_oven class=CWJ_USE_OVEN auto_complete_enabled = TRUE var/time @@ -8,7 +8,7 @@ //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_with_jane/recipe_step/use_oven/New(var/set_heat, var/set_time, var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/use_oven/New(set_heat, set_time, datum/cooking/recipe/our_recipe) @@ -20,7 +20,7 @@ ..(our_recipe) -/datum/cooking_with_jane/recipe_step/use_oven/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_oven/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) if(!istype(used_item, /obj/machinery/cooking_with_jane/oven)) return CWJ_CHECK_INVALID @@ -28,8 +28,8 @@ return CWJ_CHECK_VALID //Reagents are calculated prior to object creation -/datum/cooking_with_jane/recipe_step/use_oven/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() +/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/cooking_with_jane/oven/our_oven = used_item @@ -46,12 +46,12 @@ return clamp_quality(good_cooking) -/datum/cooking_with_jane/recipe_step/use_oven/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_oven/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) return CWJ_SUCCESS -/datum/cooking_with_jane/recipe_step/use_oven/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_oven/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() if(container.oven_data[heat] >= time) #ifdef CWJ_DEBUG diff --git a/code/modules/cooking/step_types/use_stove.dm b/code/modules/cooking/step_types/use_stove.dm index e2561ac8f92..4f3be043f8c 100644 --- a/code/modules/cooking/step_types/use_stove.dm +++ b/code/modules/cooking/step_types/use_stove.dm @@ -1,5 +1,5 @@ //A cooking step that involves adding a reagent to the food. -/datum/cooking_with_jane/recipe_step/use_stove +/datum/cooking/recipe_step/use_stove class=CWJ_USE_STOVE auto_complete_enabled = TRUE var/time @@ -8,7 +8,7 @@ //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_with_jane/recipe_step/use_stove/New(var/set_heat, var/set_time, var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/use_stove/New(set_heat, set_time, datum/cooking/recipe/our_recipe) @@ -20,7 +20,7 @@ ..(our_recipe) -/datum/cooking_with_jane/recipe_step/use_stove/check_conditions_met(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_stove/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) if(!istype(used_item, /obj/machinery/cooking_with_jane/stove)) return CWJ_CHECK_INVALID @@ -28,8 +28,8 @@ return CWJ_CHECK_VALID //Reagents are calculated prior to object creation -/datum/cooking_with_jane/recipe_step/use_stove/calculate_quality(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() +/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/cooking_with_jane/stove/our_stove = used_item @@ -46,12 +46,12 @@ return clamp_quality(good_cooking) -/datum/cooking_with_jane/recipe_step/use_stove/follow_step(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_stove/follow_step(obj/used_item, datum/cooking/recipe_tracker/tracker) return CWJ_SUCCESS -/datum/cooking_with_jane/recipe_step/use_stove/is_complete(var/obj/used_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_stove/is_complete(obj/used_item, datum/cooking/recipe_tracker/tracker) - var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container = tracker.holder_ref.resolve() + var/obj/item/reagent_containers/vessel/cooking_container/container = tracker.holder_ref.resolve() if(container.stove_data[heat] >= time) #ifdef CWJ_DEBUG @@ -63,4 +63,3 @@ 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 index 9edf6ddfc8b..d60e6df1382 100644 --- a/code/modules/cooking/step_types/use_tool.dm +++ b/code/modules/cooking/step_types/use_tool.dm @@ -1,14 +1,14 @@ //A cooking step that involves using an item on the food. -/datum/cooking_with_jane/recipe_step/use_tool +/datum/cooking/recipe_step/use_tool class=CWJ_USE_ITEM - var/tool_type + var/list/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_with_jane/recipe_step/use_tool/New(var/type, var/quality, var/datum/cooking_with_jane/recipe/our_recipe) +/datum/cooking/recipe_step/use_tool/New(type, quality, datum/cooking/recipe/our_recipe) desc = "Use \a [type] tool of quality [quality] or higher." @@ -18,29 +18,35 @@ ..(our_recipe) -/datum/cooking_with_jane/recipe_step/use_tool/check_conditions_met(var/obj/added_item, var/datum/cooking_with_jane/recipe_tracker/tracker) +/datum/cooking/recipe_step/use_tool/check_conditions_met(obj/added_item, datum/cooking/recipe_tracker/tracker) if(!istype(added_item, /obj/item/tool )) return CWJ_CHECK_INVALID var/obj/item/tool/our_tool = added_item - if(!our_tool.has_quality(tool_type)) + // REVIEW make tool quality list + if(!(our_tool in tool_type)) return CWJ_CHECK_INVALID return CWJ_CHECK_VALID -/datum/cooking_with_jane/recipe_step/use_tool/follow_step(var/obj/added_item, var/obj/item/reagent_containers/cooking_with_jane/cooking_container/container) +/datum/cooking/recipe_step/use_tool/follow_step(obj/added_item, obj/item/reagent_containers/vessel/cooking_container/container) var/obj/item/tool/our_tool = added_item - if(our_tool.worksound && our_tool.worksound != NO_WORKSOUND) - playsound(usr.loc, our_tool.worksound, 50, 1) + 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_with_jane/recipe_step/use_tool/calculate_quality(var/obj/added_item) +/datum/cooking/recipe_step/use_tool/calculate_quality(obj/added_item) var/obj/item/tool/our_tool = added_item + /*REVIEW - No tool quality so comment that shit 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/icons/obj/cooking/eris_kitchen.dmi b/icons/obj/cooking/eris_kitchen.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bd7988fa43623ffb4a806237209d2a3f5fa25ec8 GIT binary patch literal 1435 zcmV;M1!Ve(P)O+@uNiQ+k?1-Fy6L3e6-on=jt^+dp~)>V<fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3K9+y(lv$M~RCwC9|j)$T#HTOe;#vO@**gRmJD$5mcCxnpzN_R#cf< zL{Mo`VsUnANqkx<5%xpW5>{54S4@N>DOXUCNZ6Kw93X?Rs(hT@QdV&Fa{)&x023L8 z53zO!Pyhe~O-V#SRA_ZZqY0OKA zfnb~F)y@RrCi0MIe8 zE)UGy1t1P+(jQ0sKLj3Fp9kgvj)?=_0)Xe|0Z<(Vf$KY2KXjdnV_+SC%m4%X)|FY+m?F;p(iBkc^gw)fFa~5mWO-DgeAWV z#-j0nd&l)a*L5KA0GzajiA2$RZWlm~2U35^19(5Z8vs3&W;JEral25u37G1q(@6ug ziKGA>PNH6pUEqO22r~gBd20>8+M7t=&~pHAHVN#%9X10{3U~l|HnV~-n|olaUzJG~ z1Gt+*SmJ< zn<2Q6^}eSO$OH6tsS4wE@_+G9FkN+T?t#hreE=}!j)*G%jXW?}zx!{vR9e^r#jfcdUb6P5+o$UH0YHF>j`GF< zUA$y|w!K)tdw|-FgE}eJ?-n2qkY`Tnc`@~u9)U$u)oL;ECvG= zz~?8vJRU`W?{5yk*9rjgz@zMe?+*^Z&jJ8beaPDlW8i*&K@242&));=HP0@)?6S)) zyP*6I@>=V!U`VZ(7|NRmo7neNL7u>D!%@+&6rs=oXWjSRy@|C=?FRJ3YY{=I1IA+N zfAfj^4q5~e{1gjU&6%yR8T*9}XluC;2nm$5_TAc5fvg137jSFdaM@q7Z$5SajZ`uM zkWD3kh#o$A<+A;dK#Il!*!n>%A3*b5sjo)vHAW8%q z0MJheoO;xtjm;#Y4FE7~-J{F2$r_wX#WDa`X200z%}!26`p0J^3u@;{`~2zHKJl$K pPl|I|^VZi0kNR2GciH7XmwylOTC;4|Lec;L002ovPDHLkV1gGvhn4^U literal 0 HcmV?d00001 diff --git a/icons/obj/cooking/grill.dmi b/icons/obj/cooking/grill.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5b999f1c6a4cb4ddba6181c037d3cb093d58e2b7 GIT binary patch literal 2055 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 literal 0 HcmV?d00001 diff --git a/icons/obj/cooking/kitchen.dmi b/icons/obj/cooking/kitchen.dmi new file mode 100644 index 0000000000000000000000000000000000000000..259f358e19ac1cf3e1c9451c64a39156b22d40b7 GIT binary patch literal 4331 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 literal 0 HcmV?d00001 diff --git a/icons/obj/cooking/oven.dmi b/icons/obj/cooking/oven.dmi new file mode 100644 index 0000000000000000000000000000000000000000..115df9f185eb9e76b3c0cd23f091ec48e51db490 GIT binary patch literal 1886 zcmV-k2ch_hP)V=-0C=30&%Fx5FcbygIrk|J?JoYUStO-oXkVek=4t}kD@mxY@6gFXh}${v z4d=ADbiEy621_fa9A$yVdABF^j=ltFoQ|Xd$9pJS$;B0hMk6aP4JjW}hQ@)^Ex9Le z`3p@~m$^;`SLW~souqQY{E*DP&dTfeu@>EEU5Exx3`K z`{eig<@tNhud7!FSMBFeXJ z+wO1IA+q_R)a6zKDsy+uRt6U?UjYE*#ztMQomz8UN5VICM8eSJ;++rIs-Y@O>1^T-@K z;d+0&lFb*PmH`0Vjc(KzUCSntX-{WtRI>R&iw(d^(>f(ayBVx$8Wcsbojc3X&Tu~4 zQ?mJj#qKWkZitaF##x-%TQGn zjryXe@kIK4E|;0_!^Rga+c0$C(4a|%Y^na;*5{=l@t^`9B{%a2*cH=F5=P2N2^E$uzLigkdzH>pI(xu8B6-IbxwdNTpIx6a|E}y1Lp0z{VFLC!bcWRx^XNe`sjP#Sgf0D5ElJGC7E@T&RL7oQffA3d?x&gfxiAd+~6;s|Bdc#J8Yk=wZYao&F_uv$KcT0-1rY_ zzcT@)`7*`Kgo98!!Q|<9=QD$NcBgV(4ei^v2hr_OuAshs?FAtok8|aR(fL4&<>>b^ z@1VK7%motLwF^Hzd*-WbJRZl=(h|-N^Bsy7E`QT@P#g8fT-dGp6W0J7KY9ecu{cbV z&qT2|whPCP9>Ejik+1T(vGcy)|N2#K>^w?0!nYXb8i1X#IJQQ*5s7qjfozR*V`t3Y zzwhj@ibOJv?a^K?Y@$RmjkCkyTM^v?uxsv-NH@3U2LPJO%S{icmtpSO@XHt)T7CX0x{I2mqWpa|Qq~J3AXFoG=tcv6!Oy z02n^43l}a3eMw`z6CNKQH@$uoZ(X}~4aH*7W~gkwEV=Ft-IO>9S&ZA1x7OX77#7LS z4+x4M+5pJT4-mx;@6Kz4qBXnyDdAUi)mG(S|sP}%tbGWenC17zn1$l`~h2FT72kjZBP5ZL~B09a`< zyMqCU$xi@~>fgO?euCS6QJ!+Lm;i|09}n2`15TYf1%TZt-Kof%w%OU)miY-mzmU0j z@uErdTLysJ{&?y=saFjMGCzUlua}?T%wXZITCHZ%e9vJh*&l!B&cJl1N577A%TLH0 zJ2Bnqk>{oC)8bnc)K2Xn!JNf4*#O)&R-c41i>L27p)d z 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 Date: Thu, 4 Jul 2024 15:35:43 +0300 Subject: [PATCH 17/22] shit man --- baystation12.dme | 7 - code/__defines/__cooking.dm | 4 + .../kitchen/cooking_machines/_cooker.dm | 313 ---- .../cooking_machines/_cooker_output.dm | 99 -- .../kitchen/cooking_machines/candy.dm | 18 - .../kitchen/cooking_machines/cereal.dm | 38 - .../kitchen/cooking_machines/fryer.dm | 50 - .../kitchen/cooking_machines/grill.dm | 11 - .../kitchen/cooking_machines/oven.dm | 25 - .../objects/items/smokables/cigarettes.dm | 4 +- .../coocking_appliances/appliance_defines.dm | 3 +- .../cooking/coocking_appliances/candy.dm | 6 +- .../cooking/coocking_appliances/cereal.dm | 8 +- .../coocking_appliances/cooking_circuits.dm | 12 +- .../cooking/coocking_appliances/fryer.dm | 14 +- .../cooking/coocking_appliances/grill.dm | 128 +- .../cooking/coocking_appliances/machinery.dm | 2 +- .../cooking/coocking_appliances/oven.dm | 89 +- .../cooking/coocking_appliances/stove.dm | 104 +- .../cooking_items/cooking_containers.dm | 2 +- code/modules/cooking/cooking_items/spatula.dm | 4 +- code/modules/cooking/food_overrides.dm | 6 + code/modules/cooking/recipes/recipe.dm | 8 +- code/modules/cooking/recipes/recipe_donuts.dm | 16 +- .../cooking/recipes/recipes_to_covert.dm | 1278 +++++++++++++++- code/modules/cooking/step_types/add_item.dm | 2 +- .../modules/cooking/step_types/add_produce.dm | 14 +- code/modules/cooking/step_types/use_grill.dm | 4 +- code/modules/cooking/step_types/use_oven.dm | 4 +- code/modules/cooking/step_types/use_stove.dm | 4 +- code/modules/cooking/step_types/use_tool.dm | 26 +- code/modules/food/recipes_microwave.dm | 1297 ----------------- code/modules/reagents/Chemistry-Recipes.dm | 4 +- .../reagents/reagent_containers/food/meat.dm | 19 +- .../reagent_containers/food/sliceable.dm | 36 +- .../reagent_containers/food/unsorted.dm | 76 +- maps/derelicts/jungleplanet/jungle_planet.dmm | 10 +- .../old_restaurant/old_restaurant.dmm | 4 +- .../derelicts/science_ship/science_ship-2.dmm | 10 +- maps/eclipse/eclipse-1.dmm | 10 +- maps/entrepot/entrepot-1.dmm | 10 +- maps/exodus/exodus-2.dmm | 10 +- maps/frontier/bar/classic.dmm | 10 +- maps/frontier/bar/modern.dmm | 10 +- maps/frontier/bar/saloon.dmm | 10 +- maps/genesis/genesis-2.dmm | 10 +- maps/research-outpost.dmm | 2 +- sound/effects/Liquid_transfer_mono.ogg | Bin 0 -> 12921 bytes sound/items/stove.ogg | Bin 0 -> 4774 bytes 49 files changed, 1654 insertions(+), 2177 deletions(-) delete mode 100644 code/game/machinery/kitchen/cooking_machines/_cooker.dm delete mode 100644 code/game/machinery/kitchen/cooking_machines/_cooker_output.dm delete mode 100644 code/game/machinery/kitchen/cooking_machines/candy.dm delete mode 100644 code/game/machinery/kitchen/cooking_machines/cereal.dm delete mode 100644 code/game/machinery/kitchen/cooking_machines/fryer.dm delete mode 100644 code/game/machinery/kitchen/cooking_machines/grill.dm delete mode 100644 code/game/machinery/kitchen/cooking_machines/oven.dm create mode 100644 sound/effects/Liquid_transfer_mono.ogg create mode 100644 sound/items/stove.ogg diff --git a/baystation12.dme b/baystation12.dme index 15c379afd1b..b57fc45b0e5 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -919,13 +919,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\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" diff --git a/code/__defines/__cooking.dm b/code/__defines/__cooking.dm index c3029c54150..1db6ba6fdb5 100644 --- a/code/__defines/__cooking.dm +++ b/code/__defines/__cooking.dm @@ -64,6 +64,10 @@ #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" 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/candy.dm b/code/game/machinery/kitchen/cooking_machines/candy.dm deleted file mode 100644 index 866af6857da..00000000000 --- a/code/game/machinery/kitchen/cooking_machines/candy.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/machinery/cooker/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" - - output_options = list( - "Jawbreaker" = /obj/item/reagent_containers/food/variable/jawbreaker, - "Candy Bar" = /obj/item/reagent_containers/food/candy/variable, - "Sucker" = /obj/item/reagent_containers/food/variable/sucker, - "Jelly" = /obj/item/reagent_containers/food/variable/jelly - ) - -/obj/machinery/cooker/candy/change_product_appearance() - food_color = get_random_colour(1) - . = ..() 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/modules/cooking/coocking_appliances/appliance_defines.dm b/code/modules/cooking/coocking_appliances/appliance_defines.dm index 578556a70e0..b2fcfa6daef 100644 --- a/code/modules/cooking/coocking_appliances/appliance_defines.dm +++ b/code/modules/cooking/coocking_appliances/appliance_defines.dm @@ -1,4 +1,4 @@ -/obj/machinery/cooking_with_jane +/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' @@ -7,4 +7,3 @@ anchored = TRUE layer = BELOW_OBJ_LAYER var/cooking = FALSE - diff --git a/code/modules/cooking/coocking_appliances/candy.dm b/code/modules/cooking/coocking_appliances/candy.dm index 866af6857da..0691805390a 100644 --- a/code/modules/cooking/coocking_appliances/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/cereal.dm b/code/modules/cooking/coocking_appliances/cereal.dm index 60344bb3c46..729f19c3746 100644 --- a/code/modules/cooking/coocking_appliances/cereal.dm +++ b/code/modules/cooking/coocking_appliances/cereal.dm @@ -1,20 +1,21 @@ -/obj/machinery/cooker/cereal +/obj/machinery/kitchen/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) +/obj/machinery/kitchen/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) +/obj/machinery/kitchen/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 @@ -36,3 +37,4 @@ food_image.pixel_y = 2 product.AddOverlays(food_image) return product +*/ diff --git a/code/modules/cooking/coocking_appliances/cooking_circuits.dm b/code/modules/cooking/coocking_appliances/cooking_circuits.dm index 60ce978398b..33eeb2d1b17 100644 --- a/code/modules/cooking/coocking_appliances/cooking_circuits.dm +++ b/code/modules/cooking/coocking_appliances/cooking_circuits.dm @@ -1,24 +1,24 @@ -/obj/item/electronics/circuitboard/cooking_with_jane/stove +/obj/item/circuitboard/stove name = "Circuit board (Stovetop)" - build_path = /obj/machinery/cooking_with_jane/stove + 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/electronics/circuitboard/cooking_with_jane/oven +/obj/item/circuitboard/oven name = "Circuit board (Convection Oven)" - build_path = /obj/machinery/cooking_with_jane/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/electronics/circuitboard/cooking_with_jane/grill +/obj/item/circuitboard/grill name = "Circuit board (Charcoal Grill)" - build_path = /obj/machinery/cooking_with_jane/grill + build_path = /obj/machinery/kitchen/grill board_type = "machine" origin_tech = list(TECH_BIO = 1) req_components = list( diff --git a/code/modules/cooking/coocking_appliances/fryer.dm b/code/modules/cooking/coocking_appliances/fryer.dm index dd83d135ca6..b0a1c3ce376 100644 --- a/code/modules/cooking/coocking_appliances/fryer.dm +++ b/code/modules/cooking/coocking_appliances/fryer.dm @@ -1,29 +1,30 @@ -/obj/machinery/cooker/fryer +/obj/machinery/kitchen/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) +/obj/machinery/kitchen/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 + cooking = 1 if(!do_mob(user, victim, 20)) - is_cooking = 0 + cooking = 0 icon_state = off_icon return if(!victim || !victim.Adjacent(user)) to_chat(user, "Your victim slipped free!") - is_cooking = 0 + cooking = 0 icon_state = off_icon return @@ -46,5 +47,6 @@ 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 + cooking = 0 return +*/ diff --git a/code/modules/cooking/coocking_appliances/grill.dm b/code/modules/cooking/coocking_appliances/grill.dm index 8d8f42ad337..91a627817fd 100644 --- a/code/modules/cooking/coocking_appliances/grill.dm +++ b/code/modules/cooking/coocking_appliances/grill.dm @@ -1,6 +1,6 @@ #define ICON_SPLIT_X 16 -/obj/machinery/cooking_with_jane/grill +/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." @@ -29,16 +29,24 @@ var/on_fire = FALSE //if the grill has caught fire or not. - circuit = /obj/item/electronics/circuitboard/cooking_with_jane/grill - var/obj/effect/flick_light_overlay/hopper_insert //flick_light_overlay found in machinery/autolathe/autolathe.dm -/obj/machinery/cooking_with_jane/grill/Initialize() +/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/cooking_with_jane/grill/Process() +/obj/machinery/kitchen/grill/Process() //if(on_fire) //Do bad things if it is on fire. @@ -66,7 +74,7 @@ else stored_wood -= 1 -/obj/machinery/cooking_with_jane/grill/RefreshParts() +/obj/machinery/kitchen/grill/RefreshParts() ..() var/man_rating = 0 @@ -79,18 +87,18 @@ bin_rating += M.rating wood_maximum = 15 * bin_rating -/obj/machinery/cooking_with_jane/grill/examine(var/mob/user) +/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/cooking_with_jane/grill/proc/cook_checkin(var/input) +/obj/machinery/kitchen/grill/proc/cook_checkin(input) if(items[input]) #ifdef CWJ_DEBUG - log_debug("/cooking_with_jane/grill/proc/cook_checkin called on burner [input]") + log_debug("/grill/proc/cook_checkin called on burner [input]") #endif var/old_timestamp = cooking_timestamp[input] switch(temperature[input]) @@ -118,14 +126,14 @@ if(cooking_timestamp[input] == old_timestamp) handle_ignition(input) -/obj/machinery/cooking_with_jane/grill/proc/handle_burning(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/cooking_with_jane/grill/proc/handle_ignition(input) +/obj/machinery/kitchen/grill/proc/handle_ignition(input) if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return @@ -134,7 +142,7 @@ on_fire = TRUE //Retrieve which half of the baking pan is being used. -/obj/machinery/cooking_with_jane/grill/proc/getInput(params) +/obj/machinery/kitchen/grill/proc/getInput(params) var/list/click_params = params2list(params) var/input var/icon_x = text2num(click_params["icon-x"]) @@ -147,10 +155,15 @@ #endif return input -/obj/machinery/cooking_with_jane/grill/attackby(var/obj/item/used_item, var/mob/user, params) - if(default_deconstruction(used_item, user)) +/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 @@ -178,8 +191,8 @@ 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.canUnEquip(used_item)) - usr.unEquip(used_item, src) + if(usr.can_unequip(used_item)) + usr.drop(used_item, src) else used_item.forceMove(src) items[input] = used_item @@ -188,7 +201,7 @@ update_icon() -/obj/machinery/cooking_with_jane/grill/attack_hand(mob/user as mob, params) +/obj/machinery/kitchen/grill/attack_hand(mob/user as mob, params) var/input = getInput(params) if(items[input] != null) if(switches[input] == 1) @@ -207,13 +220,13 @@ items[input] = null update_icon() -/obj/machinery/cooking_with_jane/grill/CtrlClick(var/mob/user, params) +/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("/cooking_with_jane/grill/CtrlClick called on burner [input]") + 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) @@ -223,19 +236,19 @@ handle_timer(user, input) //Switch the cooking device on or off -/obj/machinery/cooking_with_jane/grill/CtrlShiftClick(var/mob/user, params) +/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("/cooking_with_jane/grill/CtrlClick called on burner [input]") + log_debug("/grill/CtrlClick called on burner [input]") #endif handle_switch(user, input) //Empty a container without a tool -/obj/machinery/cooking_with_jane/grill/AltClick(var/mob/user, params) +/obj/machinery/kitchen/grill/AltClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return @@ -245,11 +258,11 @@ var/obj/item/reagent_containers/vessel/cooking_container/container = items[input] #ifdef CWJ_DEBUG - log_debug("/cooking_with_jane/grill/AltClick called on burner [input] [container]") + log_debug("/grill/AltClick called on burner [input] [container]") #endif container.do_empty(user) -/obj/machinery/cooking_with_jane/grill/proc/handle_temperature(user, input) +/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) @@ -263,7 +276,7 @@ #endif -/obj/machinery/cooking_with_jane/grill/proc/handle_timer(user, input) +/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) @@ -271,7 +284,7 @@ update_icon() //input: 1 thru 4, depends on which burner was selected -/obj/machinery/cooking_with_jane/grill/proc/timer_act(var/mob/user, var/input) +/obj/machinery/kitchen/grill/proc/timer_act(mob/user, input) timerstamp[input]=round(world.time) #ifdef CWJ_DEBUG @@ -283,7 +296,7 @@ log_debug("Comparimg timerstamp([input]) of [timerstamp[input]] to old_timerstamp [old_timerstamp]") #endif if(old_timerstamp == timerstamp[input]) - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) handle_cooking(user, input, TRUE) //Do a check in the cooking interface switches[input] = 0 @@ -292,8 +305,8 @@ update_icon() update_icon() -/obj/machinery/cooking_with_jane/grill/proc/handle_switch(user, input) - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) +/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 @@ -312,7 +325,7 @@ -/obj/machinery/cooking_with_jane/grill/proc/handle_cooking(var/mob/user, var/input, set_timer=FALSE) +/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 @@ -346,8 +359,8 @@ -/obj/machinery/cooking_with_jane/grill/update_icon() - cut_overlays() +/obj/machinery/kitchen/grill/update_icon() + overlays.Cut() for(var/obj/item/our_item in vis_contents) src.remove_from_visible(our_item) @@ -359,7 +372,7 @@ if(switches[i] == TRUE) if(!grill_on) grill_on = TRUE - add_overlay(image(src.icon, icon_state="fire_[i]")) + AddOverlays(image(src.icon, icon_state="fire_[i]")) for(var/i=1, i<=2, i++) if(!(items[i])) @@ -374,7 +387,7 @@ our_item.pixel_y = 0 src.add_to_visible(our_item, i) -/obj/machinery/cooking_with_jane/grill/proc/add_to_visible(var/obj/item/our_item, input) +/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) @@ -383,79 +396,79 @@ our_item.transform = M our_item.transform *= 0.8 -/obj/machinery/cooking_with_jane/grill/proc/remove_from_visible(var/obj/item/our_item, input) +/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/cooking_with_jane/grill/verb/toggle_burner_1() +/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("/cooking_with_jane/grill/verb/toggle_burner_1() called to toggle burner 1") + 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/cooking_with_jane/grill/verb/toggle_burner_2() +/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("/cooking_with_jane/grill/verb/toggle_burner_2() called to toggle burner 2") + 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/cooking_with_jane/grill/verb/change_temperature_1() +/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("/cooking_with_jane/grill/verb/change_temperature_1() called to change temperature on 1") + 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/cooking_with_jane/grill/verb/change_temperature_2() +/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("/cooking_with_jane/grill/verb/change_temperature_2() called to change temperature on 2") + 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/cooking_with_jane/grill/verb/change_timer_1() +/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("/cooking_with_jane/grill/verb/change_timer_1() called to change timer on 1") + 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/cooking_with_jane/grill/verb/change_timer_2() +/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("/cooking_with_jane/grill/verb/change_timer_2() called to change timer on 2") + log_debug("/grill/verb/change_timer_2() called to change timer on 2") #endif if(!ishuman(usr) && !isrobot(usr)) return @@ -463,3 +476,24 @@ #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/modules/cooking/coocking_appliances/machinery.dm b/code/modules/cooking/coocking_appliances/machinery.dm index af5c59b79bb..028778a22f9 100644 --- a/code/modules/cooking/coocking_appliances/machinery.dm +++ b/code/modules/cooking/coocking_appliances/machinery.dm @@ -1,3 +1,3 @@ -/obj/machinery/cooking_with_jane +/obj/machinery/kitchen var/list/scan_types = list() var/quality_mod = 1 diff --git a/code/modules/cooking/coocking_appliances/oven.dm b/code/modules/cooking/coocking_appliances/oven.dm index e8a0754708f..cd590ce7bdd 100644 --- a/code/modules/cooking/coocking_appliances/oven.dm +++ b/code/modules/cooking/coocking_appliances/oven.dm @@ -1,6 +1,6 @@ -/obj/machinery/cooking_with_jane/oven +/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." @@ -25,10 +25,21 @@ var/on_fire = FALSE //if the oven has caught fire or not. - circuit = /obj/item/electronics/circuitboard/cooking_with_jane/oven +/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/cooking_with_jane/oven/Process() +/obj/machinery/kitchen/oven/Process() //if(on_fire) //Do bad things if it is on fire. @@ -44,9 +55,9 @@ check_on_10 = 0 if(switches) - use_power(power_cost) + use_power_oneoff(power_cost) -/obj/machinery/cooking_with_jane/oven/RefreshParts() +/obj/machinery/kitchen/oven/RefreshParts() ..() var/las_rating = 0 @@ -55,7 +66,7 @@ quality_mod = round(las_rating/2) //Process how a specific oven is interacting with material -/obj/machinery/cooking_with_jane/oven/proc/cook_checkin() +/obj/machinery/kitchen/oven/proc/cook_checkin() if(items) #ifdef CWJ_DEBUG log_debug("/cooking_with_jane/oven/proc/cook_checkin called on burner ") @@ -86,22 +97,29 @@ if(cooking_timestamp == old_timestamp) handle_ignition() -/obj/machinery/cooking_with_jane/oven/proc/handle_burning() +/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/cooking_with_jane/oven/proc/handle_ignition() +/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/cooking_with_jane/oven/attackby(var/obj/item/used_item, var/mob/user, params) - if(default_deconstruction(used_item, user)) + +/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) @@ -113,8 +131,8 @@ 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.canUnEquip(used_item)) - usr.unEquip(used_item, src) + if(usr.can_unequip(used_item)) + usr.drop(used_item, src) else used_item.forceMove(src) items = used_item @@ -129,7 +147,8 @@ #define ICON_SPLIT_X_2 28 #define ICON_SPLIT_Y_1 5 #define ICON_SPLIT_Y_2 20 -/obj/machinery/cooking_with_jane/oven/proc/getInput(params) + +/obj/machinery/kitchen/oven/proc/getInput(params) var/list/click_params = params2list(params) var/input var/icon_x = text2num(click_params["icon-x"]) @@ -148,7 +167,7 @@ #undef ICON_SPLIT_Y_2 -/obj/machinery/cooking_with_jane/oven/attack_hand(mob/user as mob, params) +/obj/machinery/kitchen/oven/attack_hand(mob/user as mob, params) var/center_selected = getInput(params) switch(center_selected) @@ -177,7 +196,7 @@ handle_open(user) update_icon() -/obj/machinery/cooking_with_jane/oven/CtrlClick(var/mob/user, params) +/obj/machinery/kitchen/oven/CtrlClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return @@ -192,7 +211,7 @@ handle_timer(user) //Switch the cooking device on or off -/obj/machinery/cooking_with_jane/oven/CtrlShiftClick(var/mob/user, params) +/obj/machinery/kitchen/oven/CtrlShiftClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return @@ -202,7 +221,7 @@ handle_switch(user) //Empty a container without a tool -/obj/machinery/cooking_with_jane/oven/AltClick(var/mob/user, params) +/obj/machinery/kitchen/oven/AltClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return @@ -220,7 +239,7 @@ #endif container.do_empty(user) -/obj/machinery/cooking_with_jane/oven/proc/handle_open(var/mob/user) +/obj/machinery/kitchen/oven/proc/handle_open(mob/user) if(opened) opened = FALSE else @@ -228,7 +247,7 @@ if(switches == 1) handle_switch(user) -/obj/machinery/cooking_with_jane/oven/proc/handle_temperature(var/mob/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) @@ -242,14 +261,14 @@ #endif -/obj/machinery/cooking_with_jane/oven/proc/handle_timer(var/mob/user) +/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/cooking_with_jane/oven/proc/timer_act(var/mob/user) +/obj/machinery/kitchen/oven/proc/timer_act(mob/user) timerstamp=round(world.time) #ifdef CWJ_DEBUG @@ -261,7 +280,7 @@ log_debug("Comparimg timerstamp() of [timerstamp] to old_timerstamp [old_timerstamp]") #endif if(old_timerstamp == timerstamp) - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) handle_cooking(user, TRUE) //Do a check in the cooking interface switches = 0 @@ -270,10 +289,10 @@ update_icon() update_icon() -/obj/machinery/cooking_with_jane/oven/proc/handle_switch(user) +/obj/machinery/kitchen/oven/proc/handle_switch(user) if(switches == 1) - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) handle_cooking(user) switches = 0 timerstamp=world.time @@ -285,7 +304,7 @@ if(opened) to_chat(user, SPAN_NOTICE("The oven must be closed in order to turn it on.")) return - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) switches = 1 cooking_timestamp = world.time cook_checkin(user) @@ -295,7 +314,7 @@ -/obj/machinery/cooking_with_jane/oven/proc/handle_cooking(var/mob/user, set_timer=FALSE) +/obj/machinery/kitchen/oven/proc/handle_cooking(mob/user, set_timer=FALSE) if(!(items && istype(items, /obj/item/reagent_containers/vessel/cooking_container))) return @@ -330,8 +349,8 @@ -/obj/machinery/cooking_with_jane/oven/update_icon() - cut_overlays() +/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) @@ -342,20 +361,20 @@ our_item.pixel_y = -5 src.add_to_visible(our_item) if(!opened) - add_overlay(image(src.icon, icon_state="oven_hatch[switches?"_on":""]", layer=ABOVE_OBJ_LAYER)) + AddOverlays(image(src.icon, icon_state="oven_hatch[switches?"_on":""]", layer=ABOVE_OBJ_LAYER)) -/obj/machinery/cooking_with_jane/oven/proc/add_to_visible(var/obj/item/our_item) +/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/cooking_with_jane/oven/proc/remove_from_visible(var/obj/item/our_item) +/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/cooking_with_jane/oven/verb/toggle_burner() +/obj/machinery/kitchen/oven/verb/toggle_burner() set src in view(1) set name = "Oven - Toggle" set category = "Object" @@ -368,7 +387,7 @@ handle_switch(usr) -/obj/machinery/cooking_with_jane/oven/verb/change_temperature() +/obj/machinery/kitchen/oven/verb/change_temperature() set src in view(1) set name = "Oven - Set Temp" set category = "Object" @@ -380,7 +399,7 @@ return handle_temperature(usr) -/obj/machinery/cooking_with_jane/oven/verb/change_timer() +/obj/machinery/kitchen/oven/verb/change_timer() set src in view(1) set name = "Oven - Set Timer" set category = "Object" @@ -392,7 +411,7 @@ return handle_timer(usr) -/obj/machinery/cooking_with_jane/oven/verb/toggle_door() +/obj/machinery/kitchen/oven/verb/toggle_door() set src in view(1) set name = "Oven - Open/Close door" set category = "Object" diff --git a/code/modules/cooking/coocking_appliances/stove.dm b/code/modules/cooking/coocking_appliances/stove.dm index 39137fdf0c6..b659445efc4 100644 --- a/code/modules/cooking/coocking_appliances/stove.dm +++ b/code/modules/cooking/coocking_appliances/stove.dm @@ -1,7 +1,7 @@ #define ICON_SPLIT_X 16 #define ICON_SPLIT_Y 21 -/obj/machinery/cooking_with_jane/stove +/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." @@ -23,11 +23,21 @@ var/check_on_10 = 0 var/on_fire = FALSE //if the stove has caught fire or not. - - circuit = /obj/item/electronics/circuitboard/cooking_with_jane/stove +/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/cooking_with_jane/stove/Process() +/obj/machinery/kitchen/stove/Process() //if(on_fire) //Do bad things if it is on fire. @@ -51,9 +61,9 @@ used_power += power_cost if(switches[4] == 1) used_power += power_cost - use_power(used_power) + use_power_oneoff(used_power) -/obj/machinery/cooking_with_jane/stove/RefreshParts() +/obj/machinery/kitchen/stove/RefreshParts() ..() var/man_rating = 0 for(var/obj/item/stock_parts/manipulator/M in component_parts) @@ -61,7 +71,7 @@ quality_mod = man_rating - 2 //Process how a specific stove is interacting with material -/obj/machinery/cooking_with_jane/stove/proc/cook_checkin(var/input) +/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 @@ -92,14 +102,14 @@ if(cooking_timestamp[input] == old_timestamp) handle_ignition(input) -/obj/machinery/cooking_with_jane/stove/proc/handle_burning(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/cooking_with_jane/stove/proc/handle_ignition(input) +/obj/machinery/kitchen/stove/proc/handle_ignition(input) if(!(items[input] && istype(items[input], /obj/item/reagent_containers/vessel/cooking_container))) return @@ -108,7 +118,7 @@ on_fire = TRUE //Retrieve which quadrant of the baking pan is being used. -/obj/machinery/cooking_with_jane/stove/proc/getInput(params) +/obj/machinery/kitchen/stove/proc/getInput(params) var/list/click_params = params2list(params) var/input var/icon_x = text2num(click_params["icon-x"]) @@ -127,8 +137,14 @@ #endif return input -/obj/machinery/cooking_with_jane/stove/attackby(var/obj/item/used_item, var/mob/user, params) - if(default_deconstruction(used_item, user)) +/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) @@ -139,8 +155,8 @@ 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.canUnEquip(used_item)) - usr.unEquip(used_item, src) + if(usr.can_unequip(used_item)) + usr.drop(used_item, src) else used_item.forceMove(src) items[input] = used_item @@ -148,7 +164,7 @@ cooking_timestamp[input] = world.time update_icon() -/obj/machinery/cooking_with_jane/stove/attack_hand(mob/user as mob, params) +/obj/machinery/kitchen/stove/attack_hand(mob/user as mob, params) var/input = getInput(params) if(items[input] != null) if(switches[input] == 1) @@ -167,7 +183,7 @@ items[input] = null update_icon() -/obj/machinery/cooking_with_jane/stove/CtrlClick(var/mob/user, params) +/obj/machinery/kitchen/stove/CtrlClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return @@ -183,7 +199,7 @@ handle_timer(user, input) //Switch the cooking device on or off -/obj/machinery/cooking_with_jane/stove/CtrlShiftClick(var/mob/user, params) +/obj/machinery/kitchen/stove/CtrlShiftClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return var/input = getInput(params) @@ -194,7 +210,7 @@ handle_switch(user, input) //Empty a container without a tool -/obj/machinery/cooking_with_jane/stove/AltClick(var/mob/user, params) +/obj/machinery/kitchen/stove/AltClick(mob/user, params) if(user.stat || user.restrained() || (!in_range(src, user))) return @@ -208,7 +224,7 @@ #endif container.do_empty(user) -/obj/machinery/cooking_with_jane/stove/proc/handle_temperature(user, input) +/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) @@ -222,7 +238,7 @@ #endif -/obj/machinery/cooking_with_jane/stove/proc/handle_timer(user, input) +/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) @@ -230,7 +246,7 @@ update_icon() //input: 1 thru 4, depends on which burner was selected -/obj/machinery/cooking_with_jane/stove/proc/timer_act(var/mob/user, var/input) +/obj/machinery/kitchen/stove/proc/timer_act(mob/user, input) timerstamp[input]=round(world.time) #ifdef CWJ_DEBUG @@ -242,7 +258,7 @@ log_debug("Comparimg timerstamp([input]) of [timerstamp[input]] to old_timerstamp [old_timerstamp]") #endif if(old_timerstamp == timerstamp[input]) - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) + playsound(src, 'sound/items/stove.ogg', 100, 1, 0) handle_cooking(user, input, TRUE) //Do a check in the cooking interface switches[input] = 0 @@ -251,8 +267,8 @@ update_icon() update_icon() -/obj/machinery/cooking_with_jane/stove/proc/handle_switch(user, input) - playsound(src, 'sound/items/lighter.ogg', 100, 1, 0) +/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 @@ -271,7 +287,7 @@ -/obj/machinery/cooking_with_jane/stove/proc/handle_cooking(var/mob/user, var/input, set_timer=FALSE) +/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 @@ -306,8 +322,8 @@ -/obj/machinery/cooking_with_jane/stove/update_icon() - cut_overlays() +/obj/machinery/kitchen/stove/update_icon() + overlays.Cut() for(var/obj/item/our_item in vis_contents) src.remove_from_visible(our_item) @@ -322,10 +338,10 @@ if(switches[i] == TRUE) if(!stove_on) stove_on = TRUE - add_overlay(image(src.icon, icon_state="[panel_open?"open_":""]burner_[i]")) + AddOverlays(image(src.icon, icon_state="[panel_open?"open_":""]burner_[i]")) if(stove_on) - add_overlay(image(src.icon, icon_state="indicator")) + AddOverlays(image(src.icon, icon_state="indicator")) for(var/i=1, i<=4, i++) @@ -347,9 +363,9 @@ our_item.pixel_y = 9 src.add_to_visible(our_item, i) if(switches[i] == 1) - add_overlay(image(src.icon, icon_state="steam_[i]", layer=ABOVE_OBJ_LAYER)) + AddOverlays(image(src.icon, icon_state="steam_[i]", layer=ABOVE_OBJ_LAYER)) -/obj/machinery/cooking_with_jane/stove/proc/add_to_visible(var/obj/item/our_item, input) +/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) @@ -358,13 +374,13 @@ our_item.transform = M our_item.transform *= 0.8 -/obj/machinery/cooking_with_jane/stove/proc/remove_from_visible(var/obj/item/our_item, input) +/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/cooking_with_jane/stove/verb/toggle_burner_1() +/obj/machinery/kitchen/stove/verb/toggle_burner_1() set src in view(1) set name = "Stove burner 1 - Toggle" set category = "Object" @@ -376,7 +392,7 @@ return handle_switch(usr, 1) -/obj/machinery/cooking_with_jane/stove/verb/toggle_burner_2() +/obj/machinery/kitchen/stove/verb/toggle_burner_2() set src in view(1) set name = "Stove burner 2 - Toggle" set category = "Object" @@ -388,7 +404,7 @@ return handle_switch(usr, 2) -/obj/machinery/cooking_with_jane/stove/verb/toggle_burner_3() +/obj/machinery/kitchen/stove/verb/toggle_burner_3() set src in view(1) set name = "Stove burner 3 - Toggle" set category = "Object" @@ -400,7 +416,7 @@ return handle_switch(usr, 3) -/obj/machinery/cooking_with_jane/stove/verb/toggle_burner_4() +/obj/machinery/kitchen/stove/verb/toggle_burner_4() set src in view(1) set name = "Stove burner 4 - Toggle" set category = "Object" @@ -412,7 +428,7 @@ return handle_switch(usr, 4) -/obj/machinery/cooking_with_jane/stove/verb/change_temperature_1() +/obj/machinery/kitchen/stove/verb/change_temperature_1() set src in view(1) set name = "Stove burner 1 - Set Temp" set category = "Object" @@ -424,7 +440,7 @@ return handle_temperature(usr, 1) -/obj/machinery/cooking_with_jane/stove/verb/change_temperature_2() +/obj/machinery/kitchen/stove/verb/change_temperature_2() set src in view(1) set name = "Stove burner 2 - Set Temp" set category = "Object" @@ -436,7 +452,7 @@ return handle_temperature(usr, 2) -/obj/machinery/cooking_with_jane/stove/verb/change_temperature_3() +/obj/machinery/kitchen/stove/verb/change_temperature_3() set src in view(1) set name = "Stove burner 3 - Set Temp" set category = "Object" @@ -448,7 +464,7 @@ return handle_temperature(usr, 3) -/obj/machinery/cooking_with_jane/stove/verb/change_temperature_4() +/obj/machinery/kitchen/stove/verb/change_temperature_4() set src in view(1) set name = "Stove burner 4 - Set Temp" set category = "Object" @@ -460,7 +476,7 @@ return handle_temperature(usr, 4) -/obj/machinery/cooking_with_jane/stove/verb/change_timer_1() +/obj/machinery/kitchen/stove/verb/change_timer_1() set src in view(1) set name = "Stove burner 1 - Set Timer" set category = "Object" @@ -472,7 +488,7 @@ return handle_timer(usr, 1) -/obj/machinery/cooking_with_jane/stove/verb/change_timer_2() +/obj/machinery/kitchen/stove/verb/change_timer_2() set src in view(1) set name = "Stove burner 2 - Set Timer" set category = "Object" @@ -484,7 +500,7 @@ return handle_timer(usr, 2) -/obj/machinery/cooking_with_jane/stove/verb/change_timer_3() +/obj/machinery/kitchen/stove/verb/change_timer_3() set src in view(1) set name = "Stove burner 3 - Set Timer" set category = "Object" @@ -496,7 +512,7 @@ return handle_timer(usr, 3) -/obj/machinery/cooking_with_jane/stove/verb/change_timer_4() +/obj/machinery/kitchen/stove/verb/change_timer_4() set src in view(1) set name = "Stove burner 4 - Set Timer" set category = "Object" diff --git a/code/modules/cooking/cooking_items/cooking_containers.dm b/code/modules/cooking/cooking_items/cooking_containers.dm index 62f022c49b8..f9b601ffcd4 100644 --- a/code/modules/cooking/cooking_items/cooking_containers.dm +++ b/code/modules/cooking/cooking_items/cooking_containers.dm @@ -56,7 +56,7 @@ log_debug("cooking_container/attackby() called!") #endif - if(istype(used_item, /obj/item/tool/shovel)) + if(istype(used_item, /obj/item/shovel)) do_empty(user, target=null, reagent_clear = FALSE) return diff --git a/code/modules/cooking/cooking_items/spatula.dm b/code/modules/cooking/cooking_items/spatula.dm index 4dc8bbb5ada..34fa748a567 100644 --- a/code/modules/cooking/cooking_items/spatula.dm +++ b/code/modules/cooking/cooking_items/spatula.dm @@ -1,4 +1,4 @@ -/obj/item/tool/shovel/spatula +/obj/item/shovel/spatula name = "spatula" desc = "A Hydrodynamic Spatula. Port and Starboard attachments not included." icon = 'icons/obj/cooking/kitchen.dmi' @@ -7,4 +7,4 @@ force = 7 w_class = ITEM_SIZE_SMALL attack_verb = list("smacked", "slapped", "spanked", "whapped", "whacked") - hitsound = 'sound/weapons/punch3.ogg' + hitsound = 'sound/effects/fighting/punch3.ogg' diff --git a/code/modules/cooking/food_overrides.dm b/code/modules/cooking/food_overrides.dm index 0b68b8ac079..ac98bc63b36 100644 --- a/code/modules/cooking/food_overrides.dm +++ b/code/modules/cooking/food_overrides.dm @@ -1,3 +1,9 @@ +// 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 diff --git a/code/modules/cooking/recipes/recipe.dm b/code/modules/cooking/recipes/recipe.dm index 96d9ff34761..eb80e75981a 100644 --- a/code/modules/cooking/recipes/recipe.dm +++ b/code/modules/cooking/recipes/recipe.dm @@ -1,10 +1,4 @@ -var/list/cutting_tools = list( -) - -var/list/hammering_tools = list( - -) //Example Recipes /datum/cooking/recipe/steak_stove @@ -1182,13 +1176,13 @@ var/list/hammering_tools = list( 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, "water", 5), list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 5), - list(CWJ_ADD_PRODUCE, "tomato", qmod=0.2), list(CWJ_USE_OVEN, J_MED, 35 SECONDS) ) diff --git a/code/modules/cooking/recipes/recipe_donuts.dm b/code/modules/cooking/recipes/recipe_donuts.dm index 19c98128fc2..3746a33692d 100644 --- a/code/modules/cooking/recipes/recipe_donuts.dm +++ b/code/modules/cooking/recipes/recipe_donuts.dm @@ -36,7 +36,7 @@ /datum/cooking/recipe/slime_jellydonut cooking_container = OVEN - product_type = /obj/item/reagent_containers/food/donut/slimejelly + 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, "cornoil", 1), @@ -45,17 +45,3 @@ list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), list(CWJ_USE_OVEN, J_LO, 20 SECONDS) ) - -/datum/cooking/recipe/cinnamonroll - cooking_container = OVEN - product_type = /obj/item/reagent_containers/food/cinnamonroll - 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, "cinnamonpowder", 5), - list(CWJ_ADD_REAGENT, "sugar", 10), - list(CWJ_ADD_REAGENT, "milk", 5), - list(CWJ_ADD_REAGENT, "egg", 3), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), - list(CWJ_USE_OVEN, J_LO, 20 SECONDS) - ) diff --git a/code/modules/cooking/recipes/recipes_to_covert.dm b/code/modules/cooking/recipes/recipes_to_covert.dm index 802df71a1a2..0018c5156f4 100644 --- a/code/modules/cooking/recipes/recipes_to_covert.dm +++ b/code/modules/cooking/recipes/recipes_to_covert.dm @@ -37,118 +37,1300 @@ 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/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("flour" = 10) + reagents = list(/datum/reagent/nutriment/flour = 10) result = /obj/item/reagent_containers/food/soylenviridians /datum/recipe/soylentgreen - reagents = list("flour" = 10) + 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("frostoil" = 5, "capsaicin" = 5, "sugar" = 5) + 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/meat/carp + /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("sugar" = 5) + reagents = list(/datum/reagent/sugar = 5) items = list( /obj/item/reagent_containers/food/doughslice, /obj/item/paper, ) result = /obj/item/reagent_containers/food/fortunecookie - make_food(var/obj/container as obj) + +/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 - paper.loc = null //prevent deletion - var/obj/item/reagent_containers/food/fortunecookie/being_cooked = ..(container) - paper.loc = being_cooked - being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn - return being_cooked - check_items(var/obj/container as obj) - . = ..() - if (.) - var/obj/item/paper/paper = locate() in container - if (!paper || !paper.info) - return 0 - return . + 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/friedchicken - reagents = list("cornoil" = 5, "sodiumchloride" = 1, "blackpepper" = 1, "flour" = 5) - items = list(/obj/item/reagent_containers/food/chickenbreast) - result = /obj/item/reagent_containers/food/friedchicken +/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/tonkatsu - reagents = list("sodiumchloride" = 1, "flour" = 5, "egg" = 3, "cornoil" = 2) +/datum/recipe/mushroompizza + fruit = list("mushroom" = 5, "tomato" = 1) items = list( - /obj/item/reagent_containers/food/meat/pork, + /obj/item/reagent_containers/food/sliceable/flatdough, + /obj/item/reagent_containers/food/cheesewedge ) - result = /obj/item/reagent_containers/food/tonkatsu + 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("water" = 5, "vodka" = 5, "psilocybin" = 5) + 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("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10) + 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/monkeycube + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/dough, ) - result = /obj/item/reagent_containers/food/monkeysdelight + result = /obj/item/reagent_containers/food/baguette /datum/recipe/fishandchips items = list( /obj/item/reagent_containers/food/fries, - /obj/item/reagent_containers/food/fishfingers, + /obj/item/reagent_containers/food/carpmeat, ) result = /obj/item/reagent_containers/food/fishandchips -/datum/recipe/katsudon - reagents = list("egg" = 3, "soysauce" = 5) +/datum/recipe/bread items = list( - /obj/item/reagent_containers/food/boiledrice, - /obj/item/reagent_containers/food/tonkatsu, - ) - result = /obj/item/reagent_containers/food/katsudon + /obj/item/reagent_containers/food/dough, + /obj/item/reagent_containers/food/egg + ) + result = /obj/item/reagent_containers/food/sliceable/bread -/datum/recipe/fishfingers - reagents = list("flour" = 5, "egg" = 3, "cornoil" = 2) +/datum/recipe/sandwich items = list( - /obj/item/reagent_containers/food/meat/carp, + /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/fishfingers + 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/honey_bun - reagents = list("sugar" = 3, "honey" = 5, "cream" = 5) +/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/butterslice, + /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/honeybuns + result = /obj/item/reagent_containers/food/boiledmetroidcore -/datum/recipe/honey_pudding - reagents = list("sugar" = 3, "honey" = 15, "cream" = 5) +/datum/recipe/chocolateegg items = list( + /obj/item/reagent_containers/food/egg, /obj/item/reagent_containers/food/chocolatebar, ) - result = /obj/item/reagent_containers/food/honeypudding + 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/cooking/step_types/add_item.dm b/code/modules/cooking/step_types/add_item.dm index d0724ef571d..eed0c2e3058 100644 --- a/code/modules/cooking/step_types/add_item.dm +++ b/code/modules/cooking/step_types/add_item.dm @@ -67,7 +67,7 @@ var/obj/item/container = tracker.holder_ref.resolve() if(container) if(usr.can_unequip(added_item)) - usr.__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 index ce71fc20acc..c8122413f04 100644 --- a/code/modules/cooking/step_types/add_produce.dm +++ b/code/modules/cooking/step_types/add_produce.dm @@ -9,18 +9,18 @@ var/list/exclude_reagents = list() /datum/cooking/recipe_step/add_produce/New(produce, datum/cooking/recipe/our_recipe) - if(!plant_controller) - CRASH("/datum/cooking/recipe_step/add_produce/New: Plant controller not initialized! Exiting.") - if(produce && plant_controller && plant_controller.seeds[produce]) + 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 = plant_controller.seeds[produce] + 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(plant_controller.plant_icon_cache[icon_key]) - tooltip_image = plant_controller.plant_icon_cache[icon_key] + 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) @@ -58,7 +58,7 @@ var/obj/item/container = tracker.holder_ref.resolve() if(container) if(usr.can_unequip(added_item)) - usr.__unequip(added_item) + usr.drop(added_item, container) else added_item.forceMove(container) return CWJ_SUCCESS diff --git a/code/modules/cooking/step_types/use_grill.dm b/code/modules/cooking/step_types/use_grill.dm index 0e13f987203..a32e0cb9260 100644 --- a/code/modules/cooking/step_types/use_grill.dm +++ b/code/modules/cooking/step_types/use_grill.dm @@ -23,7 +23,7 @@ /datum/cooking/recipe_step/use_grill/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) - if(!istype(used_item, /obj/machinery/cooking_with_jane/grill)) + if(!istype(used_item, /obj/machinery/kitchen/grill)) return CWJ_CHECK_INVALID return CWJ_CHECK_VALID @@ -32,7 +32,7 @@ /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/cooking_with_jane/grill/our_grill = used_item + var/obj/machinery/kitchen/grill/our_grill = used_item var/bad_cooking = 0 diff --git a/code/modules/cooking/step_types/use_oven.dm b/code/modules/cooking/step_types/use_oven.dm index fe2a73eb687..2c588f61d6f 100644 --- a/code/modules/cooking/step_types/use_oven.dm +++ b/code/modules/cooking/step_types/use_oven.dm @@ -22,7 +22,7 @@ /datum/cooking/recipe_step/use_oven/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) - if(!istype(used_item, /obj/machinery/cooking_with_jane/oven)) + if(!istype(used_item, /obj/machinery/kitchen/oven)) return CWJ_CHECK_INVALID return CWJ_CHECK_VALID @@ -31,7 +31,7 @@ /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/cooking_with_jane/oven/our_oven = used_item + var/obj/machinery/kitchen/oven/our_oven = used_item var/bad_cooking = 0 diff --git a/code/modules/cooking/step_types/use_stove.dm b/code/modules/cooking/step_types/use_stove.dm index 4f3be043f8c..edf931ac607 100644 --- a/code/modules/cooking/step_types/use_stove.dm +++ b/code/modules/cooking/step_types/use_stove.dm @@ -22,7 +22,7 @@ /datum/cooking/recipe_step/use_stove/check_conditions_met(obj/used_item, datum/cooking/recipe_tracker/tracker) - if(!istype(used_item, /obj/machinery/cooking_with_jane/stove)) + if(!istype(used_item, /obj/machinery/kitchen/stove)) return CWJ_CHECK_INVALID return CWJ_CHECK_VALID @@ -31,7 +31,7 @@ /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/cooking_with_jane/stove/our_stove = used_item + var/obj/machinery/kitchen/stove/our_stove = used_item var/bad_cooking = 0 diff --git a/code/modules/cooking/step_types/use_tool.dm b/code/modules/cooking/step_types/use_tool.dm index d60e6df1382..4ad9ea54f44 100644 --- a/code/modules/cooking/step_types/use_tool.dm +++ b/code/modules/cooking/step_types/use_tool.dm @@ -1,10 +1,18 @@ //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/list/tool_type + 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 @@ -19,18 +27,26 @@ /datum/cooking/recipe_step/use_tool/check_conditions_met(obj/added_item, datum/cooking/recipe_tracker/tracker) - if(!istype(added_item, /obj/item/tool )) + if(!istype(added_item, /obj/item )) return CWJ_CHECK_INVALID - var/obj/item/tool/our_tool = added_item + 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 + if(!(our_tool in tool_type)) 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/tool/our_tool = added_item + 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.")) @@ -44,8 +60,8 @@ //Think about a way to make this more intuitive? /datum/cooking/recipe_step/use_tool/calculate_quality(obj/added_item) - var/obj/item/tool/our_tool = 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 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-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 0375b2615b1..2833cdd896c 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1594,7 +1594,7 @@ /datum/chemical_reaction/mint/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/mint(location) + new /obj/item/reagent_containers/food/mint(location) /datum/chemical_reaction/candy_corn result = null @@ -1604,7 +1604,7 @@ /datum/chemical_reaction/candy_corn/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/reagent_containers/food/snacks/candy_corn(location) + new /obj/item/reagent_containers/food/candy_corn(location) /* Alcohol */ diff --git a/code/modules/reagents/reagent_containers/food/meat.dm b/code/modules/reagents/reagent_containers/food/meat.dm index 91cb6816a28..f14e794a55f 100644 --- a/code/modules/reagents/reagent_containers/food/meat.dm +++ b/code/modules/reagents/reagent_containers/food/meat.dm @@ -67,20 +67,27 @@ /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/snacks/meat/chicken +/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" - preloaded_reagents = list("protein" = 8) - slice_path = /obj/item/reagent_containers/food/snacks/chickenbreast + startswith = list(/datum/reagent/nutriment/protein) + 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) diff --git a/code/modules/reagents/reagent_containers/food/sliceable.dm b/code/modules/reagents/reagent_containers/food/sliceable.dm index 8ad745a9103..faa41e18221 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,26 +51,33 @@ 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/snacks/doughslice/attackby(obj/item/W as obj, mob/user as mob) +/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/snacks/flatdoughslice(src) + new /obj/item/reagent_containers/food/flatdoughslice(src) to_chat(user, "You flatten the dough slice.") qdel(src) -/obj/item/reagent_containers/food/snacks/flatdoughslice +/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/snacks/spaghetti + slice_path = /obj/item/reagent_containers/food/spaghetti slices_num = 1 bitesize = 2 center_of_mass = list("x"=17, "y"=19) @@ -78,6 +85,23 @@ 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" diff --git a/code/modules/reagents/reagent_containers/food/unsorted.dm b/code/modules/reagents/reagent_containers/food/unsorted.dm index 497ef4285d1..6f1aa12beed 100644 --- a/code/modules/reagents/reagent_containers/food/unsorted.dm +++ b/code/modules/reagents/reagent_containers/food/unsorted.dm @@ -420,22 +420,40 @@ startswith = list(/datum/reagent/nutriment/protein = 3) bitesize = 2 -/obj/item/reagent_containers/food/snacks/rawmeatball +/obj/item/reagent_containers/food/rawmeatball name = "raw meatball" desc = "A raw meatball." icon = 'icons/obj/food_ingredients.dmi' - icon_state = "meatball_raw" + icon_state = "rawfaggot" bitesize = 3 center_of_mass = list("x"=16, "y"=15) - preloaded_reagents = list("protein" = 2) - taste_tag = list(MEAT_FOOD) + startswith = list(/datum/reagent/nutriment/protein=5) -/obj/item/reagent_containers/food/snacks/rawmeatball/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/reagent_containers/food/rawmeatball/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/material/kitchen/rollingpin)) - new /obj/item/reagent_containers/food/snacks/patty_raw(src) + 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." @@ -919,7 +937,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" @@ -1928,27 +1946,44 @@ 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/rawmeatball(src) + new /obj/item/reagent_containers/food/rawmeatball(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" - center_of_mass = "x=17;y=20" - startswith = list(/datum/reagent/nutriment/protein = 2) bitesize = 2 + center_of_mass = list("x"=17, "y"=20) + startswith = list(/datum/reagent/nutriment/protein = 3) -/obj/item/reagent_containers/food/bacon - name = "bacon" +/obj/item/reagent_containers/food/rawbacon + name = "raw bacon" desc = "A thin slice of pork." icon = 'icons/obj/food.dmi' icon_state = "bacon" center_of_mass = "x=17;y=20" startswith = list(/datum/reagent/nutriment/protein = 2) - bitesize = 1 + bitesize = 2 + +/obj/item/reagent_containers/food/bacon + name = "fried bacon" + desc = "When it comes to bacon, always be prepared." + icon = 'icons/obj/food_ingredients.dmi' + 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" @@ -2302,5 +2337,12 @@ center_of_mass = list("x"=21, "y"=12) nutriment_desc = list("taco shell" = 2) nutriment_amt = 2 - cooked = TRUE 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) 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..441feee6178 100644 --- a/maps/entrepot/entrepot-1.dmm +++ b/maps/entrepot/entrepot-1.dmm @@ -3,9 +3,9 @@ "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) +"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"},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) +"ah" = (/obj/machinery/kitchen/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) "ak" = (/obj/structure/table/marble,/obj/machinery/reagentgrinder{pixel_y = 10},/turf/simulated/floor/tiled/white,/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/machinery/kitchen/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/kitchen/candy{pixel_y = 6},/obj/item/storage/fancy/egg_box,/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) 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 0000000000000000000000000000000000000000..8db7d100e0251124ee9d4dd15328f09c65afb4ae GIT binary patch literal 12921 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 literal 0 HcmV?d00001 diff --git a/sound/items/stove.ogg b/sound/items/stove.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9deb37057eaf90eb9ea4b6c687ca2440848239ca GIT binary patch literal 4774 zcmeHKdstIP7N3NO0Ra;T8e*&oCO~4K0Rts8)Fcui(Fj};3nEn>5u#9#SD~+s5^M}e zX^gRr)CEl<1mX%6wA9^oec%H`9t9uN)|M`>>VDnYueIIX?#{jO)%~aYeciwI+xaGw zbI&<5XXba#J#%hyetsIjgNJQ(3Lya{PgUJNihBlESzMZnHrb53=9N@+1eRa{(H#)kajQfv<2sCAkB?6O9ttyyZw4BI)>s0QeS zwe=z>rkc=rNEw8Xr$u=r>7zj=EPzr8ajAZiAL~=|=hz2yy-b)+g1i}q zexdY~wWdP|m08hADK(zL8M^)~FU+{>Jpa@pJs~=*e%F`$OCQ%PkQ%Ht^5_RNeZHh> zk=q7KlGIq^DY-<|uaUqVcnVKZ^!<`nnw~2pF4Hpvd4Zr2fab$t#=~LWBwCj@xC8)6 zoJzU4gMRrP`sGgg0-|pQbPo;?pm+-Tu$>t0{tD;l5v?-~(+H}zPp>VpX zZ1D0_Q{*6|4mV}^SfSo@)A{BMZ#Na%Sv_RsqP!i0vs;?TeUJ)qRX1Aqc0+2OOWR;w z+X<4q9M?;Q*xtm&g zg>$rdmx9~YdbmESpZCE4HpJcS_`vUZpUCs1)hk@*k+h=d@$~I~5l&lcPHfn?-PMgK zICeAQjp4_D*h@Ww@)}dom2(W7qfMpW+*UW74AeCMB!5F6CNF)`|4P3`W~chY9zGfs zJ(?y{S7@$VDl$&Kk$Iyw>-#ru!~UQmJKdtm_*r)!9cC2<40iWHIDOQz0pSeGOnP)o z=ul8XNyOq!-o;uw!n!)bOTI5i4v0^s$VLU~;lQla=ZaEeG^5d3X)#&q4Mi_niZXjD zCJtyOzJKGhr+U_W?1=sV#F>_JOu-z}WNZUVE-tvl1!7P1jWm7{)-V}sV#!Txttr3S z()ylt_Ps+~C#C{Os0!MQjw)kYm9e#|Va8x8c+b+>W?gZ`akux_SHIL3U;)m8Ifa#2 z%1T67G6WJBx;h^eUHZ95maLT5KO%6SaX26z0{UXPJ83+0002Ihk5l@G=}Le07!s~d z3m-#dV`=JNYRXZ8G5`YW1sZXnk(3r5-e>iyW95u&Yj4i=LGIc+leqcaC$B`-QoCQG zy=6`%z1GIcHA)7;Z9|+8*SJbrOR>G1%MC>Q5a_&GK(gZQl+eXpJlHX00B98W4v7{X z7ofQmZ7ih+FWEzI&BOipt48sNKzv^W`@>bBp|3^cuM@}*pLy3j1j8PpRG2+}b^CW) z$DyqR@{s5$ThNeb_`h+kU%lD?FYv#P00~}oci?XelS1nX28IAolH||wG7+wNBw6Mu zYaD+P;7l6HXtS2De1ZiF3M8WpBalPEkiZc9L}Y@3W-Upkvq3=t?eRMVHLeMmMw0B^ zkTWZlhTsIU!|Tbcrzx13sU`3N=ePJg-czhmg9EzBSPQHP8Ya_W^^|U58v)poVGVe+jE?=n*g!RfD6!sd&`7c22 z?hXQw;sM>5lVP2zJ``$nv{~J&$c6>VG_~C1s6GUXC9T!r?BXf!i_j}drB>HIWILU6 z&`>f3YOBX8K1Wx87M*jwn9)&{QeBb7FgmnWr_*_CK|(SGu9y8iW z7c3OFFjwGpVE~+=Iw)yZ_#sRiiPp!`Q=}nm`v~G>*bsyhs8=bt>?3Am8%Iq-IBjNc zDVMz;0pP|?5BRH1DY&EnjDw|5S+(BU|88JpqH|h@Z1mGh(hn=UJrzIfl{r`>f&Ko&h_$9*dQ!!(0U^ZGf~tuK|L<$ z5s2BQ>lK=tmYuwhj@`Z01;E#Y`JfrUWJ6*shqizx$YZ1TrI=dN2upGeN$Snin-L;> zE1n8}e~<)2zP@uDEvUxD`EY=gZUB3HG9ak*$>V=Sg~Q?utI(br=7As8vEad~8^`0$ z%7@dpK#$^dFx<~j?bI?KDaWoNLJyRyHr91Y4Uy9<+s7LVFO&^R!kGKVb9jf!{G=St zg$=o>96f?4!h6!|6fH+gh{83NULVdUE@b54A`u`Y7a@_l<4soz&dz z-0&0B-1-Z|&3T34j$7M&`-sakdEsLlxAXg`w=?VPJ=VI&7arU~c#-3q0C=Uw10?L) zyRw7zeqe*=Vp^9!fVeS8Fi2p`z^Jex^+FgGeo|tK3i2?DX|6}32mAg(6p)8ejmX?X zilpGYkIq0pkvR4mOiEIO*=>}EUrcQ_GfE*+cv|QvOpk4Y6)wsnwm|18IJIz^-3*V+ zvHL5$*m{42!?9BoL?#qMo=V}>qW6cviDC~IP;j7k>9Mdlrb0qjY8x`hm||HBk$Uq!Rn!zk>LZ<_SFGcBhVQ3J z`>3`XrE6Qt{9sm;0G+N801v{vmEg=B@Oc@j98XAG0(6Xot%ihi(vqqaFA_NoC(hX= zjR30jO}4B};sdydnJUEvoP~Qj>By2(8by%aZ#R&<5GHMWQ34Q4^%NWeyl69Uu_g z6&0Gn2?Xqmo}hEH0QyCb^6$(a#(TdYmP*B|#POo%JN~d{?asmtn~&JVG3`IfH^;I- z&U3t&j`3HSaNW2;ASP?@$1LCw5Wve`tu7Q8J+7d!K>+f;#pl_EqcX#&6@I@CJ zi1E3TOPBcKowGKIe5B~3{XM;@-7DT2GYH-%km>0={lF&!H(eX7?y;l&YH)Dy?%=by zGfptR?W8~V_MzJw_Nmkpd*do2X1|x19HaWi<&Bgjix-ay#uO*pC-8*S#BHC)7~+rx zC)-0VQd3uR<*StqgT3X)4!pUH9_><%7M*aW#Wm-Ln)nR=Ws48O z%^wUHB7Pnq95c67p=6!^_mq3YK96~nVJf#-$g zEOBrA+P7mGZVD)3mqp)pi%;r_0i7JO6R9z3-%nCn7uh$>C9gkp!c3E#Jzr6<~iJ7zpVHj$+uCtr#%sW9bq{A r;)S@bMAgCd*XCNf?`<0?vgI#iD-YNPPXGP>N2@N}%FJ+0#DISRVt>vc literal 0 HcmV?d00001 From 6f3a3501f9341f76bd5a84a0be03ceb25d046952 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 5 Jul 2024 01:12:09 +0300 Subject: [PATCH 18/22] IT'S WORKING(maybe) --- baystation12.dme | 7 +- code/__defines/__cooking.dm | 2 +- code/_global_vars/lists/reagents.dm | 3 - code/_helpers/reagents.dm | 27 - code/datums/trading/food.dm | 3 +- code/game/objects/items/trash.dm | 4 + code/game/world.dm | 2 +- .../cooking/coocking_appliances/cereal.dm | 40 - .../cooking/coocking_appliances/fryer.dm | 52 - code/modules/cooking/cooking.dm | 12 +- .../cooking_items/cooking_containers.dm | 2 +- code/modules/cooking/cooking_items/dollop.dm | 11 +- code/modules/cooking/recipes/_read_me.dm | 6 +- .../cooking/recipes/example_recipes.dm | 38 +- code/modules/cooking/recipes/recipe.dm | 1013 +++++------------ code/modules/cooking/recipes/recipe_bread.dm | 29 + .../modules/cooking/recipes/recipe_burgers.dm | 268 +++++ code/modules/cooking/recipes/recipe_donuts.dm | 26 +- .../modules/cooking/recipes/recipe_hotdogs.dm | 29 + .../cooking/recipes/recipes_to_covert.dm | 201 +--- .../modules/cooking/step_types/add_reagent.dm | 2 +- code/modules/cooking/step_types/use_tool.dm | 3 - code/modules/reagents/Chemistry-Reagents.dm | 10 - code/modules/reagents/Chemistry-Recipes.dm | 10 +- .../reagents/reagent_containers/food/meat.dm | 38 +- .../reagent_containers/food/sliceable.dm | 23 + .../reagent_containers/food/unsorted.dm | 107 +- .../reagent_containers/vessel/condiment.dm | 15 +- .../{eris_kitchen.dmi => kitchen2.dmi} | Bin icons/obj/food.dmi | Bin 113530 -> 125018 bytes maps/entrepot/entrepot-1.dmm | 14 +- ~code/global_init.dm | 1 + 32 files changed, 864 insertions(+), 1134 deletions(-) delete mode 100644 code/_global_vars/lists/reagents.dm delete mode 100644 code/_helpers/reagents.dm delete mode 100644 code/modules/cooking/coocking_appliances/cereal.dm delete mode 100644 code/modules/cooking/coocking_appliances/fryer.dm create mode 100644 code/modules/cooking/recipes/recipe_bread.dm create mode 100644 code/modules/cooking/recipes/recipe_burgers.dm create mode 100644 code/modules/cooking/recipes/recipe_hotdogs.dm rename icons/obj/cooking/{eris_kitchen.dmi => kitchen2.dmi} (100%) diff --git a/baystation12.dme b/baystation12.dme index b57fc45b0e5..a0bc6715f8b 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -144,7 +144,6 @@ #include "code\_global_vars\lists\objects.dm" #include "code\_global_vars\lists\pipe_dispenser.dm" #include "code\_global_vars\lists\rcd.dm" -#include "code\_global_vars\lists\reagents.dm" #include "code\_global_vars\lists\russian.dm" #include "code\_global_vars\lists\traitor_uplink.dm" #include "code\_global_vars\lists\wheelcannon.dm" @@ -178,7 +177,6 @@ #include "code\_helpers\preferences.dm" #include "code\_helpers\pronouns.dm" #include "code\_helpers\radio.dm" -#include "code\_helpers\reagents.dm" #include "code\_helpers\roundend.dm" #include "code\_helpers\russian.dm" #include "code\_helpers\sanitize_values.dm" @@ -1843,9 +1841,7 @@ #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\cereal.dm" #include "code\modules\cooking\coocking_appliances\cooking_circuits.dm" -#include "code\modules\cooking\coocking_appliances\fryer.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" @@ -1861,7 +1857,10 @@ #include "code\modules\cooking\recipes\_read_me.dm" #include "code\modules\cooking\recipes\example_recipes.dm" #include "code\modules\cooking\recipes\recipe.dm" +#include "code\modules\cooking\recipes\recipe_bread.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\recipes_to_covert.dm" #include "code\modules\cooking\step_types\add_item.dm" #include "code\modules\cooking\step_types\add_produce.dm" diff --git a/code/__defines/__cooking.dm b/code/__defines/__cooking.dm index 1db6ba6fdb5..b1728ca89a2 100644 --- a/code/__defines/__cooking.dm +++ b/code/__defines/__cooking.dm @@ -1,4 +1,4 @@ -//#define CWJ_DEBUG 1 +#define CWJ_DEBUG 1 //Step classifications, for easy reference later. diff --git a/code/_global_vars/lists/reagents.dm b/code/_global_vars/lists/reagents.dm deleted file mode 100644 index b57485ab0f4..00000000000 --- a/code/_global_vars/lists/reagents.dm +++ /dev/null @@ -1,3 +0,0 @@ -GLOBAL_LIST_EMPTY(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions -GLOBAL_LIST_EMPTY(chemical_reactions_list_by_result) //list of all /datum/chemical_reaction datums. But this one indexed by chemical result instead of reagents -GLOBAL_LIST_EMPTY(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff diff --git a/code/_helpers/reagents.dm b/code/_helpers/reagents.dm deleted file mode 100644 index d3532d5571f..00000000000 --- a/code/_helpers/reagents.dm +++ /dev/null @@ -1,27 +0,0 @@ -/proc/get_reagent_name_by_id(id) - if(!GLOB.chemical_reagents_list.len) - return "REAGENTS NOT INITIALISED" - var/datum/reagent/D = GLOB.chemical_reagents_list[id] - if(D) - return D.name - - return "REAGENT NOT FOUND" - -/proc/get_reagent_type_by_id(id) - if(!GLOB.chemical_reagents_list.len) - return "REAGENTS NOT INITIALISED" - var/datum/reagent/D = GLOB.chemical_reagents_list[id] - if(D) - return D.type - - return "REAGENT NOT FOUND" - -/proc/is_reagent_with_id_exist(id) - if(!GLOB.chemical_reagents_list.len) - error("REAGENTS NOT INITIALISED") - return FALSE - var/datum/reagent/D = GLOB.chemical_reagents_list[id] - if(D) - return TRUE - - return FALSE 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/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/cereal.dm b/code/modules/cooking/coocking_appliances/cereal.dm deleted file mode 100644 index 729f19c3746..00000000000 --- a/code/modules/cooking/coocking_appliances/cereal.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/machinery/kitchen/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/kitchen/cereal/change_product_strings(atom/movable/product, atom/movable/origin) - . = ..() - product.SetName("box of [product.name]") - return product - -/obj/machinery/kitchen/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/modules/cooking/coocking_appliances/fryer.dm b/code/modules/cooking/coocking_appliances/fryer.dm deleted file mode 100644 index b0a1c3ce376..00000000000 --- a/code/modules/cooking/coocking_appliances/fryer.dm +++ /dev/null @@ -1,52 +0,0 @@ -/obj/machinery/kitchen/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/kitchen/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 - cooking = 1 - - if(!do_mob(user, victim, 20)) - cooking = 0 - icon_state = off_icon - return - - if(!victim || !victim.Adjacent(user)) - to_chat(user, "Your victim slipped free!") - 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 - cooking = 0 - return -*/ diff --git a/code/modules/cooking/cooking.dm b/code/modules/cooking/cooking.dm index b9f422de264..1ca4601c16d 100644 --- a/code/modules/cooking/cooking.dm +++ b/code/modules/cooking/cooking.dm @@ -88,7 +88,7 @@ Food quality is calculated based on the steps taken. QDEL_NULL(product_info) //We don't need this anymore. if(reagent_id) - var/datum/reagent/test_reagent = GLOB.chemical_reagents_list[reagent_id] + var/datum/reagent/test_reagent = reagent_id if(test_reagent) if(!name) name = test_reagent.name @@ -136,14 +136,14 @@ Food quality is calculated based on the steps taken. if(CWJ_ADD_REAGENT) if(step_list.len < 3) reason="Bad argument Length for CWJ_ADD_REAGENT" - else if(!is_reagent_with_id_exist(step_list[2])) + 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(!is_reagent_with_id_exist(step_list[2])) + 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) @@ -336,9 +336,9 @@ Food quality is calculated based on the steps taken. reason="reagent_skip / reagent_skip declared on non add-item / add-reagent recipe step." if("exclude_reagents" in step_list) - for(var/id in step_list["exclude_reagents"]) - if(!is_reagent_with_id_exist(id)) - reason="exclude_reagents list has nonexistant reagent id [id]" + 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." diff --git a/code/modules/cooking/cooking_items/cooking_containers.dm b/code/modules/cooking/cooking_items/cooking_containers.dm index f9b601ffcd4..c66c2f9ea5f 100644 --- a/code/modules/cooking/cooking_items/cooking_containers.dm +++ b/code/modules/cooking/cooking_items/cooking_containers.dm @@ -266,7 +266,7 @@ src.vis_contents.Remove(our_item) /obj/item/reagent_containers/vessel/cooking_container/plate - icon = 'icons/obj/cooking/eris_kitchen.dmi' + icon = 'icons/obj/cooking/kitchen2.dmi' name = "serving plate" shortname = "plate" desc = "A shitty serving plate. You probably shouldn't be seeing this." diff --git a/code/modules/cooking/cooking_items/dollop.dm b/code/modules/cooking/cooking_items/dollop.dm index 9c0d7d03e34..96cb32457cc 100644 --- a/code/modules/cooking/cooking_items/dollop.dm +++ b/code/modules/cooking/cooking_items/dollop.dm @@ -4,17 +4,18 @@ icon = 'icons/obj/cooking/kitchen.dmi' icon_state = "dollop" bitesize = 4 - var/reagent_id = "frosting" + 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_id = "frosting", new_amount = 30) +/obj/item/reagent_containers/food/dollop/New(loc, new_reagent = /datum/reagent/organic/sugar/frosting, new_amount = 30) . = ..() - if(new_reagent_id) - var/reagent_name = get_reagent_name_by_id(reagent_id) + 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("[new_reagent_id]" = new_amount) + startswith = list(reagent = new_amount) /obj/item/reagent_containers/food/dollop/Initialize() . = ..() diff --git a/code/modules/cooking/recipes/_read_me.dm b/code/modules/cooking/recipes/_read_me.dm index 33512aa7770..c82f0eb4e63 100644 --- a/code/modules/cooking/recipes/_read_me.dm +++ b/code/modules/cooking/recipes/_read_me.dm @@ -13,7 +13,7 @@ list(<_OPTIONAL>, , =value) 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/breadslice) + 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. @@ -61,7 +61,7 @@ list(<_OPTIONAL>, , =value) <_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/breadslice) + 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. @@ -70,7 +70,7 @@ list(<_OPTIONAL>, , =value) 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/breadslice, desc="a custom description") + Example: list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, desc="a custom description") Valid options are: desc diff --git a/code/modules/cooking/recipes/example_recipes.dm b/code/modules/cooking/recipes/example_recipes.dm index bfc0efc852e..871cc0b56a4 100644 --- a/code/modules/cooking/recipes/example_recipes.dm +++ b/code/modules/cooking/recipes/example_recipes.dm @@ -6,9 +6,9 @@ cooking_container = BOWL product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice, qmod=0.5) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) ) appear_in_default_catalog = FALSE @@ -16,9 +16,9 @@ cooking_container = DF_BASKET product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice, qmod=0.5) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) ) appear_in_default_catalog = FALSE @@ -26,9 +26,9 @@ cooking_container = AF_BASKET product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice, qmod=0.5) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) ) appear_in_default_catalog = FALSE @@ -36,9 +36,9 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice, qmod=0.5) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) ) appear_in_default_catalog = FALSE @@ -46,9 +46,9 @@ cooking_container = OVEN product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice, qmod=0.5) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread, qmod=0.5) ) appear_in_default_catalog = FALSE @@ -57,10 +57,10 @@ cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) ) appear_in_default_catalog = FALSE @@ -68,12 +68,12 @@ cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) ) appear_in_default_catalog = FALSE @@ -81,10 +81,10 @@ cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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/breadslice) + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) ) appear_in_default_catalog = FALSE @@ -92,10 +92,10 @@ cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sandwich step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), + 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, "sodiumchloride", 5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice) + list(CWJ_ADD_REAGENT, /datum/reagent/sodiumchloride, 5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/slice/bread) ) appear_in_default_catalog = FALSE diff --git a/code/modules/cooking/recipes/recipe.dm b/code/modules/cooking/recipes/recipe.dm index eb80e75981a..8ee1d1a1533 100644 --- a/code/modules/cooking/recipes/recipe.dm +++ b/code/modules/cooking/recipes/recipe.dm @@ -30,8 +30,8 @@ //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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), + 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), @@ -45,13 +45,13 @@ //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, "honey", 3, base=3), + 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, "capsaicin", 5, base=6, prod_desc="The steak was Spiced with chili powder."), - list(CWJ_ADD_REAGENT_OPTIONAL, "wine", 5, remain_percent=0.1 ,base=6, prod_desc="The steak was sauteed in wine"), + 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 @@ -66,8 +66,8 @@ 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/meatball, qmod=0.5), - list(CWJ_ADD_REAGENT, "thermite", 1) //So it cooks inhand, totally. + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/faggot, qmod=0.5), + list(CWJ_ADD_REAGENT, /datum/reagent/thermite, 1) //So it cooks inhand, totally. ) /datum/cooking/recipe/cooked_cutlet @@ -75,18 +75,18 @@ 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, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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_meatball +/datum/cooking/recipe/cooked_faggot cooking_container = PAN - product_type = /obj/item/reagent_containers/food/meatball + product_type = /obj/item/reagent_containers/food/faggot step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawmeatball, qmod=0.5), - list(CWJ_ADD_REAGENT, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -95,8 +95,8 @@ 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, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -112,25 +112,25 @@ 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), + 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, "honey", 3, base=3), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 3, base=3), CWJ_BEGIN_EXCLUSIVE_OPTIONS, - list(CWJ_ADD_REAGENT_OPTIONAL, "capsaicin", 5, base=6, prod_desc="The chicken was Spiced with chili powder."), - list(CWJ_ADD_REAGENT_OPTIONAL, "lemonjuice", 5, remain_percent=0.1 ,base=3, prod_desc="The chicken was sauteed in lemon juice"), + 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/porkchops + product_type = /obj/item/reagent_containers/food/porkchop replace_reagents = FALSE @@ -140,8 +140,8 @@ 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), + 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), @@ -149,10 +149,9 @@ list(CWJ_ADD_PRODUCE_OPTIONAL, "plumphelmet", qmod=0.4), CWJ_END_EXCLUSIVE_OPTIONS, CWJ_BEGIN_EXCLUSIVE_OPTIONS, - list(CWJ_ADD_REAGENT_OPTIONAL, "capsaicin", 5, base=6, prod_desc="The pork was Spiced with chili powder."), - // list(CWJ_ADD_REAGENT_OPTIONAL, "pineapplejuice", 5, remain_percent=0.1, base=5, prod_desc="The pork was rosted in pineapple juice."), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 5, remain_percent=0.1 ,base=3, prod_desc="The pork was glazed with honey"), - // list(CWJ_ADD_REAGENT_OPTIONAL, "bbqsauce", 3, remain_percent=0.5 ,base=8, prod_desc="The pork was layered with BBQ sauce"), + 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) ) @@ -162,8 +161,8 @@ 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), + 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) ) @@ -174,8 +173,8 @@ 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + 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) ) @@ -185,8 +184,8 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -201,9 +200,9 @@ CWJ_END_OPTION_CHAIN, list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/egg, qmod=0.5), - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + 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) ) @@ -211,11 +210,11 @@ cooking_container = PAN product_type = /obj/item/reagent_containers/food/bacon step_builder = list( - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "cornoil", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + 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, "honey", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/honey, 1, base=1), list(CWJ_USE_OVEN, J_LO, 15 SECONDS) ) @@ -223,12 +222,12 @@ cooking_container = PAN product_type = /obj/item/reagent_containers/food/baconeggs step_builder = list( - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "cornoil", 1), + 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, "honey", 1, base=1), + 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, "blackpepper", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/blackpepper, 1, base=1), list(CWJ_USE_OVEN, J_LO, 5 SECONDS) ) @@ -236,14 +235,14 @@ cooking_container = PAN product_type = /obj/item/reagent_containers/food/benedict step_builder = list( - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "cornoil", 1), - list(CWJ_ADD_REAGENT, "egg", 3), + 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/breadslice, qmod=0.5), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), + 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, "blackpepper", 1, base=1), + 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) ) @@ -252,14 +251,14 @@ cooking_container = PAN product_type = /obj/item/reagent_containers/food/omelette step_builder = list( - list(CWJ_ADD_REAGENT, "cornoil", 2), + 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, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), + 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, "blackpepper", 1, base=1), + 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) ) @@ -269,8 +268,8 @@ 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "cornoil", 1), + 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), @@ -278,30 +277,16 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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/sausage cooking_container = GRILL product_type = /obj/item/reagent_containers/food/sausage step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/rawmeatball), + 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, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + 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) ) @@ -309,8 +294,8 @@ 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/xenomeat, qmod=0.5), - list(CWJ_ADD_REAGENT, "soysauce", 5), + 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) ) @@ -318,9 +303,9 @@ cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/sashimi step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/carp, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/carp, qmod=0.5), - list(CWJ_ADD_REAGENT, "soysauce", 5), + 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) ) @@ -330,19 +315,19 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT, "soysauce", 5), + 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/kabob + 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, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 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_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) @@ -353,8 +338,8 @@ 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, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 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_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) @@ -362,12 +347,12 @@ /datum/cooking/recipe/humankabob cooking_container = GRILL - product_type = /obj/item/reagent_containers/food/kabob + 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, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/human, qmod=0.5), + 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) ) @@ -380,7 +365,7 @@ 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -405,8 +390,8 @@ 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/xenomeat), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/xenomeat), + 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) @@ -448,8 +433,8 @@ 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, "milk", 2), - list(CWJ_ADD_REAGENT, "sugar", 15), + 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) ) @@ -457,9 +442,9 @@ cooking_container = OVEN product_type = /obj/item/reagent_containers/food/baguette step_builder = list( - list(CWJ_ADD_REAGENT, "blackpepper", 1), - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 5), + 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) @@ -469,8 +454,8 @@ cooking_container = OVEN product_type = /obj/item/reagent_containers/food/cracker step_builder = list( - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1), + 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) ) @@ -483,7 +468,7 @@ 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, "woodpulp", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1), list(CWJ_USE_OVEN, J_HI, 5 SECONDS) ) @@ -493,7 +478,7 @@ 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, "woodpulp", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1), list(CWJ_USE_OVEN, J_HI, 5 SECONDS) ) @@ -501,9 +486,9 @@ cooking_container = CUTTING_BOARD product_type = /obj/item/reagent_containers/food/twobread step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), - list(CWJ_ADD_REAGENT, "wine", 5) + 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 @@ -512,70 +497,31 @@ 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, "sugar", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), - list(CWJ_ADD_REAGENT, "milk", 5, base=1), - list(CWJ_ADD_REAGENT, "flour", 5, base=1), + 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/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, "sugar", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 3, base=3), - list(CWJ_ADD_REAGENT, "milk", 5, base=1), - list(CWJ_ADD_REAGENT, "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, "lean", 5, base=6, remain_percent=0.5, prod_desc="Normally not for breakfast."), - list(CWJ_ADD_REAGENT_OPTIONAL, "mindbreaker", 5, base=6, remain_percent=0.1, prod_desc="Not for waking up to."), - // list(CWJ_ADD_REAGENT_OPTIONAL, "psi_juice", 5, base=6, prod_desc="For when you wake up feeling droggy still."), - CWJ_END_EXCLUSIVE_OPTIONS, - list(CWJ_ADD_REAGENT, "sugar", 5), - list(CWJ_USE_OVEN, J_LO, 5 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/breadslice, qmod=0.5), - list(CWJ_ADD_REAGENT, "cherryjelly", 5), - list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) - ) - -/datum/cooking/recipe/amanitajellytoast - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/jelliedtoast/amanita - step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/jelly/amanita, qmod=0.5), + 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/slime + product_type = /obj/item/reagent_containers/food/jelliedtoast/metroid step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), - list(CWJ_ADD_REAGENT, "slimejelly", 5), + 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) ) @@ -585,10 +531,10 @@ product_count = 3 step_builder = list( list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/sliceable/bread, qmod=0.5), - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), - list(CWJ_ADD_REAGENT, "water", 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 @@ -607,8 +553,8 @@ 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, "milk", 5), - list(CWJ_ADD_REAGENT, "sugar", 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) ) @@ -617,9 +563,9 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/boiledrice step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT, "rice", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -627,333 +573,68 @@ cooking_container = BOWL product_type = /obj/item/reagent_containers/food/ricepudding step_builder = list( - list(CWJ_ADD_REAGENT, "milk", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "cream", 10), + 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) ) -//**Burgers**// -/datum/cooking/recipe/burger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/monkeyburger - - 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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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/vital/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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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/xenomeat) - ) - -/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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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/carp) - ) - -/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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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/monkeyburger, qmod=0.5), - list(CWJ_ADD_PRODUCE_OPTIONAL, "cabbage"), - list(CWJ_ADD_PRODUCE_OPTIONAL, "tomato"), - list(CWJ_ADD_REAGENT_OPTIONAL, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "cherryjelly", 5) - ) - -/datum/cooking/recipe/amanitajellyburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/jellyburger/amanita - - 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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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/jelly/amanita, qmod=0.5) - ) - -/datum/cooking/recipe/slimeburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/jellyburger/slime - - 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, "ketchup", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "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, "slimejelly", 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/breadslice, qmod=0.5), + 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, 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/slice/bread, qmod=0.5) ) -/datum/cooking/recipe/slimesandwich +/datum/cooking/recipe/metroidsandwich cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/jellysandwich/slime + product_type = /obj/item/reagent_containers/food/jellysandwich/metroid step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), - list(CWJ_ADD_REAGENT, "slimejelly", 5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + 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/breadslice, qmod=0.5), - list(CWJ_ADD_REAGENT, "cherryjelly", 5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) - ) - -/datum/cooking/recipe/amanitajellysandwich - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/jellysandwich/amanita - step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/jelly/amanita, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, qmod=0.5) + 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/breadslice, qmod=0.5), + 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, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/breadslice, 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/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/breadslice, qmod=0.5), + 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/breadslice, 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) ) @@ -966,157 +647,13 @@ list(CWJ_USE_GRILL, J_LO, 15 SECONDS) ) -//**Erisian Cuisine**// -//Left out due to never having existed previously: Spider burgers, Kraftwerk, Benzin -/datum/cooking/recipe/boiled_roach_egg - cooking_container = POT - product_type = /obj/item/reagent_containers/food/roach_egg - step_builder = list( - list(CWJ_ADD_ITEM, /obj/item/roach_egg, qmod=0.5), - list(CWJ_ADD_REAGENT, "water", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_USE_STOVE, J_MED, 15 SECONDS) - ) - -/datum/cooking/recipe/kampferburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/kampferburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat) - ) - -/datum/cooking/recipe/seucheburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/seucheburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/seuche) - ) - -/datum/cooking/recipe/panzerburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/panzerburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/panzer) - ) - -/datum/cooking/recipe/jagerburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/jagerburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/jager) - ) - -/datum/cooking/recipe/bigroachburger //Difference: Requires boiled roach egg - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/bigroachburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/roach_egg), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/seuche), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/panzer), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/jager) - ) - -/datum/cooking/recipe/fuhrerburger //Difference: Requires boiled roach egg - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/fuhrerburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/roach_egg), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/fuhrer) - ) - -/datum/cooking/recipe/kaiserburger //Difference: Requires boiled roach egg - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/kaiserburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/roach_egg), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meat/roachmeat/kaiser) - ) - -/datum/cooking/recipe/wormburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/wormburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/moecube/worm) - ) - -/datum/cooking/recipe/geneburger - cooking_container = CUTTING_BOARD - product_type = /obj/item/reagent_containers/food/geneburger - - 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, "ketchup", 1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/moecube) - ) - //**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, "flour", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/nutriment/flour, 1, base=1), list(CWJ_USE_TOOL, QUALITY_CUTTING, 1) ) @@ -1124,8 +661,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/boiledspaghetti step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -1134,8 +671,8 @@ cooking_container = PAN product_type = /obj/item/reagent_containers/food/pastatomato step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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), @@ -1144,13 +681,13 @@ /datum/cooking/recipe/meatballspaghetti cooking_container = PAN - product_type = /obj/item/reagent_containers/food/meatballspaghetti + product_type = /obj/item/reagent_containers/food/faggotspaghetti step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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/meatball, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, 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) ) @@ -1159,13 +696,13 @@ cooking_container = PAN product_type = /obj/item/reagent_containers/food/spesslaw step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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/meatball, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, 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) ) @@ -1181,8 +718,8 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 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) ) @@ -1195,8 +732,8 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 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) ) @@ -1207,8 +744,8 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 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), @@ -1224,8 +761,8 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "flour", 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), @@ -1241,7 +778,7 @@ 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, "woodpulp", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1251,7 +788,7 @@ 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, "woodpulp", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1260,8 +797,8 @@ 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/xenomeat, qmod=0.5), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1, base=1), + 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) ) @@ -1271,8 +808,8 @@ 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, "sugar", 5, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1, base=1), + 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) ) @@ -1283,8 +820,8 @@ 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, "sugar", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1, base=1), + 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) ) @@ -1295,8 +832,8 @@ 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, "sugar", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1, base=1), + 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) ) @@ -1306,8 +843,8 @@ 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, "amatoxin", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 1, base=1), + 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) ) @@ -1318,7 +855,7 @@ 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, "woodpulp", 1, 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) ) @@ -1329,7 +866,7 @@ 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, "woodpulp", 1, 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) ) @@ -1340,7 +877,7 @@ 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, "woodpulp", 1, 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) ) @@ -1354,9 +891,9 @@ 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, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + 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), ) @@ -1366,9 +903,9 @@ product_type = /obj/item/reagent_containers/food/aesirsalad step_builder = list( list(CWJ_ADD_PRODUCE, "ambrosiadeus", qmod=0.2), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + 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), ) @@ -1380,36 +917,36 @@ 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, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1), + 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/meatball, qmod=0.5), + 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, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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, "cream", 5, base=3, prod_desc="The soup turns a lighter red and thickens with the cream."), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 5 ,base=5, prod_desc="The thickens as the honey mixes in."), + 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/meatballsoup + product_type = /obj/item/reagent_containers/food/faggotsoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/meatball, qmod=0.5), + 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"), @@ -1420,8 +957,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/vegetablesoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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"), @@ -1433,8 +970,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/nettlesoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) @@ -1444,8 +981,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/wishsoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 20), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -1453,8 +990,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/coldchili step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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), @@ -1465,8 +1002,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/coldchili step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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), @@ -1477,11 +1014,11 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/bearchili step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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/bearmeat, qmod=0.5), + list(CWJ_ADD_ITEM, /obj/item/reagent_containers/food/bearmeat, qmod=0.5), list(CWJ_USE_STOVE, J_LO, 30 SECONDS) ) @@ -1489,8 +1026,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/stew step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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"), @@ -1503,8 +1040,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/milosoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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), @@ -1516,14 +1053,14 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/beetsoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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, "cream", 5, base=1), - list(CWJ_ADD_REAGENT_OPTIONAL, "blackpepper", 1, base=1), + 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) ) @@ -1531,12 +1068,12 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/mushroomsoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT, "cream", 5), - list(CWJ_ADD_REAGENT, "milk", 5), - list(CWJ_ADD_REAGENT, "sodiumchloride", 1), - list(CWJ_ADD_REAGENT, "blackpepper", 1), + 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, @@ -1551,8 +1088,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/mysterysoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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), @@ -1565,8 +1102,8 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/bloodsoup step_builder = list( - list(CWJ_ADD_REAGENT, "blood", 30), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -1574,9 +1111,9 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/slimesoup step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT, "slimejelly", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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) ) @@ -1589,8 +1126,8 @@ 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, "flour", 5), - list(CWJ_ADD_REAGENT, "soysauce", 5), + 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"), @@ -1608,8 +1145,8 @@ 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, "flour", 5), - list(CWJ_ADD_REAGENT, "soysauce", 5), + 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"), @@ -1628,9 +1165,9 @@ step_builder = list( list(CWJ_ADD_PRODUCE, "potato", 2), - list(CWJ_ADD_REAGENT, "milk", 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, "sodiumchloride", 1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1), list(CWJ_USE_TOOL, QUALITY_HAMMERING, 15) ) @@ -1643,23 +1180,23 @@ 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, "sodiumchloride", 1), + 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 = PAN + 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, "cornoil", 1), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1), + 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 = PAN + 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), @@ -1688,12 +1225,12 @@ cooking_container = POT product_type = /obj/item/reagent_containers/food/stewedsoymeat step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), + 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, "sodiumchloride", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sodiumchloride, 1, base=1), list(CWJ_USE_STOVE, J_HI, 15 SECONDS) ) @@ -1703,11 +1240,11 @@ 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, "sugar", 15), - list(CWJ_ADD_REAGENT, "flour", 15), - list(CWJ_ADD_REAGENT, "milk", 5), - list(CWJ_ADD_REAGENT, "egg", 9), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 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) ) @@ -1719,7 +1256,7 @@ 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, "woodpulp", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) @@ -1730,7 +1267,7 @@ 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, "woodpulp", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) @@ -1740,7 +1277,7 @@ 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1750,7 +1287,7 @@ 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1760,7 +1297,7 @@ 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1770,8 +1307,8 @@ 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, "coco", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "woodpulp", 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) ) @@ -1782,7 +1319,7 @@ 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, "woodpulp", 1, base=1), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 1, base=1), list(CWJ_USE_STOVE, J_MED, 30 SECONDS) ) @@ -1792,7 +1329,7 @@ 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1801,9 +1338,9 @@ 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/vital/brain, 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1812,12 +1349,12 @@ 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, "sugar", 15), - list(CWJ_ADD_REAGENT, "coco", 10), - list(CWJ_ADD_REAGENT, "milk", 5), - list(CWJ_ADD_REAGENT, "egg", 9), + 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, "woodpulp", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/woodpulp, 5), list(CWJ_USE_OVEN, J_MED, 30 SECONDS) ) @@ -1830,7 +1367,7 @@ 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, "sugar", 5), + list(CWJ_ADD_REAGENT_OPTIONAL, /datum/reagent/sugar, 5), list(CWJ_USE_STOVE, J_LO, 15 SECONDS) ) @@ -1839,9 +1376,9 @@ product_type = /obj/item/reagent_containers/food/candiedapple step_builder = list( list(CWJ_ADD_PRODUCE, "apple", qmod=0.2), - list(CWJ_ADD_REAGENT, "water", 5), - list(CWJ_ADD_REAGENT, "sugar", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "cornoil", 1, base=1), + 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) ) @@ -1850,10 +1387,10 @@ 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, "cornoil", 2), + 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, "milk", 5), - list(CWJ_ADD_REAGENT, "sugar", 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) ) @@ -1864,10 +1401,10 @@ 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, "sugar", 5), - list(CWJ_ADD_REAGENT, "milk", 5), - list(CWJ_ADD_REAGENT, "flour", 10), - list(CWJ_ADD_REAGENT, "egg", 3), + 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) ) @@ -1878,8 +1415,8 @@ 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, "water", 5), - list(CWJ_ADD_REAGENT, "flour", 5), + 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) ) @@ -1890,19 +1427,19 @@ 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, "cornoil", 2), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), + 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/boiledslimeextract +/datum/cooking/recipe/boiled_metroid_extract cooking_container = POT - product_type = /obj/item/reagent_containers/food/boiledslimecore + product_type = /obj/item/reagent_containers/food/boiledmetroidcore step_builder = list( - list(CWJ_ADD_REAGENT, "water", 10), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_ITEM, /obj/item/slime_extract, qmod=0.5), + 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/recipe_bread.dm b/code/modules/cooking/recipes/recipe_bread.dm new file mode 100644 index 00000000000..2ef8eac720c --- /dev/null +++ b/code/modules/cooking/recipes/recipe_bread.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_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 index 3746a33692d..da6f78a36ca 100644 --- a/code/modules/cooking/recipes/recipe_donuts.dm +++ b/code/modules/cooking/recipes/recipe_donuts.dm @@ -5,9 +5,9 @@ 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, "sugar", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "sodiumchloride", 1, base=1), - list(CWJ_ADD_REAGENT, "milk", 5), + 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) ) @@ -16,9 +16,9 @@ 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, "cornoil", 1), - list(CWJ_ADD_REAGENT, "sugar", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + 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) ) @@ -27,10 +27,10 @@ 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, "cornoil", 1), + list(CWJ_ADD_REAGENT, /datum/reagent/nutriment/cornoil, 1), list(CWJ_ADD_REAGENT, "berryjuice", 5), - list(CWJ_ADD_REAGENT, "sugar", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=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, 20 SECONDS) ) @@ -39,9 +39,9 @@ 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, "cornoil", 1), - list(CWJ_ADD_REAGENT, "slimejelly", 5), - list(CWJ_ADD_REAGENT, "sugar", 5), - list(CWJ_ADD_REAGENT_OPTIONAL, "honey", 1, base=1), + 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/recipes_to_covert.dm b/code/modules/cooking/recipes/recipes_to_covert.dm index 0018c5156f4..1277e4d0574 100644 --- a/code/modules/cooking/recipes/recipes_to_covert.dm +++ b/code/modules/cooking/recipes/recipes_to_covert.dm @@ -1,29 +1,27 @@ - +/* REVIEW Need to write dumplings /datum/recipe/dumplings //Missing Recipe fruit = list("cabbage" = 1) // A recipe that ACTUALLY uses cabbage. - reagents = list("soysauce" = 5, "sodiumchloride" = 1, "blackpepper" = 1, "cornoil" = 1) // No sesame oil, corn will have to do. + 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 items = list( /obj/item/reagent_containers/food/dough, - /obj/item/reagent_containers/food/meatball + /obj/item/reagent_containers/food/faggot ) result = /obj/item/reagent_containers/food/donkpocket //SPECIAL - proc/warm_up(var/obj/item/reagent_containers/food/donkpocket/being_cooked) - being_cooked.heat() - make_food(var/obj/container as obj) - var/obj/item/reagent_containers/food/donkpocket/being_cooked = ..(container) - warm_up(being_cooked) - return being_cooked + +/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 @@ -31,11 +29,12 @@ /obj/item/reagent_containers/food/donkpocket ) result = /obj/item/reagent_containers/food/donkpocket //SPECIAL - make_food(var/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/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 @@ -58,138 +57,12 @@ I said no! 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( @@ -206,30 +79,6 @@ I said no! ) 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( @@ -741,18 +590,18 @@ I said no! ) result = /obj/item/reagent_containers/food/stewedsoymeat -/*/datum/recipe/spagetti We have the processor now +/*/datum/recipe/spaghetti We have the processor now items = list( /obj/item/reagent_containers/food/doughslice ) - result= /obj/item/reagent_containers/food/spagetti*/ + result= /obj/item/reagent_containers/food/spaghetti*/ -/datum/recipe/boiledspagetti +/datum/recipe/boiledspaghetti reagents = list(/datum/reagent/water = 5) items = list( - /obj/item/reagent_containers/food/spagetti, + /obj/item/reagent_containers/food/spaghetti, ) - result = /obj/item/reagent_containers/food/boiledspagetti + result = /obj/item/reagent_containers/food/boiledspaghetti /datum/recipe/boiledrice reagents = list(/datum/reagent/water = 5, /datum/reagent/nutriment/rice = 10) @@ -765,7 +614,7 @@ I said no! /datum/recipe/pastatomato fruit = list("tomato" = 2) reagents = list(/datum/reagent/water = 5) - items = list(/obj/item/reagent_containers/food/spagetti) + items = list(/obj/item/reagent_containers/food/spaghetti) result = /obj/item/reagent_containers/food/pastatomato /datum/recipe/poppypretzel @@ -773,19 +622,19 @@ I said no! items = list(/obj/item/reagent_containers/food/dough) result = /obj/item/reagent_containers/food/poppypretzel -/datum/recipe/faggotspagetti +/datum/recipe/faggotspaghetti reagents = list(/datum/reagent/water = 5) items = list( - /obj/item/reagent_containers/food/spagetti, + /obj/item/reagent_containers/food/spaghetti, /obj/item/reagent_containers/food/faggot, /obj/item/reagent_containers/food/faggot, ) - result = /obj/item/reagent_containers/food/faggotspagetti + result = /obj/item/reagent_containers/food/faggotspaghetti /datum/recipe/spesslaw reagents = list(/datum/reagent/water = 5) items = list( - /obj/item/reagent_containers/food/spagetti, + /obj/item/reagent_containers/food/spaghetti, /obj/item/reagent_containers/food/faggot, /obj/item/reagent_containers/food/faggot, /obj/item/reagent_containers/food/faggot, @@ -1213,12 +1062,12 @@ I said no! result = /obj/item/reagent_containers/food/junglesalad /datum/recipe/chowmein - items = list(/obj/item/reagent_containers/food/boiledspagetti, /obj/item/reagent_containers/food/cutlet) + 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/boiledspagetti,/obj/item/reagent_containers/food/cutlet, /obj/item/reagent_containers/food/cutlet) + 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 diff --git a/code/modules/cooking/step_types/add_reagent.dm b/code/modules/cooking/step_types/add_reagent.dm index 0fdab4783c8..0eed3adf0c7 100644 --- a/code/modules/cooking/step_types/add_reagent.dm +++ b/code/modules/cooking/step_types/add_reagent.dm @@ -13,7 +13,7 @@ //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 = GLOB.chemical_reagents_list[reagent_id] + var/datum/reagent/global_reagent = reagent_id if(global_reagent) desc = "Add [amount] unit[amount>1 ? "s" : ""] of [global_reagent.name]." diff --git a/code/modules/cooking/step_types/use_tool.dm b/code/modules/cooking/step_types/use_tool.dm index 4ad9ea54f44..b4d458c83e6 100644 --- a/code/modules/cooking/step_types/use_tool.dm +++ b/code/modules/cooking/step_types/use_tool.dm @@ -40,9 +40,6 @@ var/list/hammering_tools = list( if(!is_type_in_list(our_tool, hammering_tools)) return CWJ_CHECK_INVALID - if(!(our_tool in tool_type)) - 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) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 0bb78de1ec3..7364ce5e7df 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -32,16 +32,6 @@ if(!istype(holder)) CRASH("Invalid reagents holder: [log_info_line(holder)]") src.holder = holder - - if(!GLOB.chemical_reagents_list) - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - var/paths = typesof(/datum/reagent) - /datum/reagent - GLOB.chemical_reagents_list = list() - for(var/path in paths) - var/datum/reagent/D = new path() - if(!D.name) - continue - GLOB.chemical_reagents_list[D.id] = D ..() /datum/reagent/proc/remove_self(amount) // Shortcut diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 2833cdd896c..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/rawmeatball(location) + new /obj/item/reagent_containers/food/rawfaggot(location) /datum/chemical_reaction/dough name = "Dough" @@ -1588,20 +1588,20 @@ /datum/chemical_reaction/mint result = null - required_reagents = list("sugar" = 5, "frostoil" = 5) + required_reagents = list(/datum/reagent/sugar = 5, /datum/reagent/frostoil = 5) result_amount = 1 -/datum/chemical_reaction/mint/on_reaction(var/datum/reagents/holder, var/created_volume) +/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("sugar" = 5, "cornoil" = 5) + required_reagents = list(/datum/reagent/sugar = 5, /datum/reagent/nutriment/cornoil = 5) result_amount = 1 -/datum/chemical_reaction/candy_corn/on_reaction(var/datum/reagents/holder, var/created_volume) +/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) diff --git a/code/modules/reagents/reagent_containers/food/meat.dm b/code/modules/reagents/reagent_containers/food/meat.dm index f14e794a55f..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." @@ -81,7 +77,7 @@ desc = "Poultry meat, might be chicken or any other avian species." icon_state = "meat_bird" filling_color = "#EDA897" - startswith = list(/datum/reagent/nutriment/protein) + startswith = list(/datum/reagent/nutriment/protein = 3) slice_path = /obj/item/reagent_containers/food/chickenbreast slices_num = 4 @@ -91,3 +87,35 @@ 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 faa41e18221..4431e567764 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable.dm @@ -538,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 6f1aa12beed..40bbdec8dfd 100644 --- a/code/modules/reagents/reagent_containers/food/unsorted.dm +++ b/code/modules/reagents/reagent_containers/food/unsorted.dm @@ -320,6 +320,27 @@ /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" + 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 +390,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,7 +453,7 @@ startswith = list(/datum/reagent/nutriment/protein = 3) bitesize = 2 -/obj/item/reagent_containers/food/rawmeatball +/obj/item/reagent_containers/food/rawfaggot name = "raw meatball" desc = "A raw meatball." icon = 'icons/obj/food_ingredients.dmi' @@ -429,7 +462,7 @@ center_of_mass = list("x"=16, "y"=15) startswith = list(/datum/reagent/nutriment/protein=5) -/obj/item/reagent_containers/food/rawmeatball/attackby(obj/item/W as obj, mob/user as mob) +/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.") @@ -1558,7 +1591,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" @@ -1603,7 +1636,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" @@ -1952,8 +1985,8 @@ /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/rawmeatball(src) - new /obj/item/reagent_containers/food/rawmeatball(src) + 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) @@ -2346,3 +2379,65 @@ 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/slimesoup + name = "slime soup" + desc = "If no water is available, you may substitute tears." + icon_state = "slimesoup" //nonexistant? + filling_color = "#C4DBA0" + bitesize = 5 + startswith = list(/datum/reagent/metroidjelly = 5, /datum/reagent/water = 10) + +/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 567b57301dc..f7235cc2046 100644 --- a/code/modules/reagents/reagent_containers/vessel/condiment.dm +++ b/code/modules/reagents/reagent_containers/vessel/condiment.dm @@ -347,11 +347,14 @@ name = "creamer" startswith = list(/datum/reagent/drink/milk/cream) -/obj/item/reagent_containers/food/condiment/soysauce - preloaded_reagents = list("soysauce" = 50) +/obj/item/reagent_containers/vessel/condiment/soysauce + name = "soysauce" + startswith = list(/datum/reagent/nutriment/soysauce = 50) -/obj/item/reagent_containers/food/condiment/coldsauce - preloaded_reagents = list("frostoil" = 50) +/obj/item/reagent_containers/vessel/condiment/coldsauce + name = "coldsauce" + startswith = list(/datum/reagent/frostoil = 50) -/obj/item/reagent_containers/food/condiment/cornoil - preloaded_reagents = list("cornoil" = 50) +/obj/item/reagent_containers/vessel/condiment/cornoil + name = "cornoil" + startswith = list(/datum/reagent/nutriment/cornoil = 50) diff --git a/icons/obj/cooking/eris_kitchen.dmi b/icons/obj/cooking/kitchen2.dmi similarity index 100% rename from icons/obj/cooking/eris_kitchen.dmi rename to icons/obj/cooking/kitchen2.dmi diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 0498057aa3b2a59f25fb872c3d2f4b176977ca7c..65caa7970afabbc80be4594e056125123664d7d2 100644 GIT binary patch literal 125018 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 z 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�wlm4G~Pd@#+c*(JHT~AOsNYW_jqrfaYeCQoZH;%D!Z*iG?W+o{M_Jk18(%bGLINrC9z}NG<=OwVqQ>GuaSf!V66^pe#1-F zKV3QBrV?Tpu2o}gEhW7*+Lu59(6LHxw+$tA4vfsXGsgfGr1}t-PtyG6_ICNf zGFogl8^j!4|5qiSRi)Pt)B-7ldpRE!Fg1s9TJ|W4h5<@R#*y!;J}2m!Sv$6WF1$aNQorlhpfq1AT*F+yLjP#m zb@;cJ00E#T7C5mi9z8OcUe5E*jR2tV?v2J*SIfK9y}Udj3rlVKlLoSimfF;(FI0Q( z<0)*7>&>v}n}U}dqzck&Th#OymKEk;i=rhrnu5-I`H#@yyyk?$ z%g5K-FUsidLlfXRj~KTb(|yCMs21y+<7|RNVl*OheQ&_<-Zw)5XqZ6w#E|_vDr!X> z=sZM&(>pUq=G-P&UJ47Sb`(Drl0&ivDJsht{Q)vi~ zNeUS(5FMt4rr~G?X)1%UL3}MM9hun2l~u!3&`XJ@&2vy>DBaSf9s2wCf`aOV>luY0 zSwW9%Ss*u(xk2XxO;RM{8Ut4Z-`h(j6eLVpRaqd(L=+x&XREkm72u-v-)-6wy)V{8 zqNKY!aJSIt!ZmL!E_UjRLKpX&R!PgQGfO)YmW#c3kQ{(VNg|iOoTQ2!TWzu)ot*qv zBT0^!(~a4(<@JXFOJ<}#8pv(xNb7ug^1((K^Vdg(PmtaL57fAKXJQuoeMX+vETv`}% zTn=4H*xRZryP&d!Y{rIyiW)*930zlv{>onOQ7~Xi8c37JR=I$VBnMAZlBg7Uf1YxD zd))t44hqOe*gA}P@j#?P(ch)>fjvu-F|^q0wz~8ni&}1w+OV+QN3ZfKTM{m|#P)Wt z3BrPfj&&Beh*z`T!+Ng|jZ7o5>v{HC2rY% zBBh!f2qU&be0(+R|6VC%>kO=fDdIe9@t@m@OTuAvuYNQY*6Mt2?aBN7%%bZ+rs!B^ zaLEq?k~bbWtrP8$7DF}QY)Zb3;ONcg1EeMIB z0Cfxoh%8Y(x$5S1Z~JZ^rOzJn1G%&8Rv#{6ndBuZ{M@<(CSvtP$?H4R!sc6LT@|1; zK#|x`QVpOa`bRAI6-U!%)huz9iLG1mf3X001J_yfMpwW8`4S1Fd}Yq>AP^1fyp(?O z;fu4}WN<25E_dU?!Zn=?3x_Rk@v6f2PzC0X+(3}Vim-)KuO-$a5@~y@+_d4apkEcY znK5^4(ib$>Cuc}MWdp@rUW5>r>v+dKV2} z{}S$!p<`RzI3`hfkQ6q`Fc_J>4IZo&LDnsV#4M!Px9Fk>1S@9`7w~5zPa)`9IjcRc{{ytRN9;eA7A;uUJ%j%AKCly+z^=m1Jdc|$TR4QH)Jy4bff(y_qx{w=!?9pVvDxY9WKv%BIUG_ND=6lEA*rnu#SaWtCVx`{pC0=SR1uo$-PqV(*Rs+%_+ zhugFO{5uU9p=R)N&o>Xp5id7DDrOqPF|uvJsfX$~O!9D9Iei#wJwC_&D;eD|V?X(*AA_g2TZZ zc~eOK=}jO36B@*rJCPuwS*D4`l?(qkIgQl2L-sj*{@W#x^$&<*cw2Z4b%)NB(mAmU z$EPyq0ZMd8Ke7%|0U&?YumbI>zg@={6)H4qjryHJhT_Ew97(b(L2S*dAh z!zF2YQhIuLTN~^trmlEsG`ZqBG9*2^?>P1oUAbSI3?d$6dXRrjoxj$}hkJH|m$;(` z@M4zrH<$M=+(`I0!yqA}F$R#$+^zY&q#ml5L^dOzB&8rYNfLK;*p;NW*Y{{F*?X{H zz(}nYmXM1_e+Vc@yA+FtEG+pV!Ds=HrC=r@mfnbH_BjP(LXx@BAa4B`5^-Do`{N`n z?H&@i15vqGQcaKhm#v2FDfD;Ja_RN7tTifD5NdTi?Jy9rIJM7a`=jo49a^k?dRN_@ z@Uk@LRo-}yRoO_0jDEm|X<^BTrriXB9}*-XT1wZ^{e=$BYKT^u78;{`g{0g zXQ}+7Xc9i?k2I(jM*g&-J$wA!xhqlI*!JpaU(Y=edk>KzUwYKwziAf1jL`@|Wz|Ddm)-yZ6WM=VCKm zc!3_j4+&X0VtV?x#?)j1EiEm9Mkp(fz00HLi(OJ5pD*2kL6LgevLNN(`UNB^i;F9` zNT(8RG{i$toos_c_|CYz2?R}k!)r4Egd&m^<88&Of%PLkjNVilHCtFX||bCi1#3A3QbV)8^~z4%K#U(D5HU;krvzg=AwM zAXNQ`_F`yS??MACTRt4==y@Ajb^jBnrUOKySVCiveH=OhV*#m_7GJQW_&shW#5|VqbEZfkdz_prUVEiE9VE({AJ3R$yJuDQys2*YX|Zb?-}VMOUxmDzcI)8~ zHHgOn{g=r)NEX}2NH0LyJiXTWFdWzVWzg%GLinYpKa=^m+E|qv;x}e2uhIPsS`ZoM zKLAC*&Ysrg{p9rda&$MFU4Ysm;tP%4JN&dY*qjZ!neN?1CJ2W%ZTxUXA1}#+^BQd* zb*BmZ@$63+D!&UyL&j-1t#-IlA7`5p@Kq!qMpZU9L{WROk4{Tkl< zPr`_L)x{#XW5dvpz#L5MK?Go9t#VdyDtRY)&xw2kFcmK>G!M`8F2n`(VkM+52ojgo zf>bi^8V{7_n7rOOp<#a*_vXkqOIvo`Pwcu?)THHVPBhfekdQQ~`Y=HjE2OWzyv(Lf z&(ER0jE*Q^sa2orggH6oH>-K(CJ0_+m?tg?exJGWd*WWK)?F*{^{{GD*22J|3M28* zbXtP#9LI{N-Zf{HU2J{?WHHd*=~P4a^7P^1c*$HGwq{zyI4Qrf zGxON54#PBq!I}c3emZ7!Ny147tVJ&RCq2+HKF8L@hk#cT{`2(IapuRCNSZeGOduE4$OVfXcTGbfH z6P1QLsA_D;wyB&dJA$;?c*)CD_JHfBrE=U+rQ=cx5Ietqr~yv*=x?v{UlnM-;4M^ z6YvF+@L4ZZv-b|`gg5PMzh)AAlp3@S#A9B8GM?9O}&Wk`-7{1!*Kn4;Bz_2ApXMQEDDkqaP#JQeZK;2 zOirZ|o~HN8c!9elC7G*e+W6>z@_bAQ&3qOa!shfio~N^ypU9yG2FLG1H>uSTOM25gL2{@^jMf(;>ObnO?LIiMVS>-K+*#%2F2HnDmI5^f39!*3 zpK+N8`M(y|L~of$O8tzBi@tcir<|Ae^U^Y)ubcpj`vko}%jB5i3~` z^GY%yp_&wxHUpar8DV9q@@t%>h^fvN@txZQ#)Xe(7k#A^}c0G|1#@EarUNvpVkIt3*qlK$60TsCWI zzzoH~?jI?Hzk#-vK@qm<<*Vq|26oxiTNt#`}&p+FpbQONxZ@FuR;CX)H-u%5# zH)>g{Td`TF`Bkd#MTYt}bJ%I5H9xcJE0)j)c6pAufC{@iE_9x{(bZ9hD^(7iZyYKq+V1g&jmV zWL8*T`esRx;$DM6MwabM1#&wAr@?ikbZV8u(_V)W5KczcH1KM0{|ry(X~`QS%I*2u z>)z@h#8q=nb9U1l7l!pwL2YF+UAh{;mA5&9@b{hki<0&#kLtGJYy5Kz@v`HJFTW{_ zkd`(EH($gnR}}(!d-jk2WYFN9gzty`00OIW`;zDcL3weqy*hi6%cAT^218F2W$i%L zWm=@Zx6X`MPyk&-Je$1>PHa%FWI)gUvv|O2^P6=17!VhOzsgdcfkY-S{GlC@cX`~p} ztQ((3jCvC|7ik5VFvIunpU=6qcDW&x>EkDFB;jO-&FO@pE{ejt#$V%K>sbX50L|g)8Ob~&yd8sVRfC?D< z%X+W09u->p)ZQtixf!lhQZRa5Vs_rd`8eT8gBhsjM%^5gXxQ9TYPMpObtTVVDxRLD zt~Uh{!syYkk>c`@w+6=F)G^>;-Rg+w@P&kuY7Yiucc3M3V%1N>B@(ca;Y1Do3N%YJ zGG-hd`>uZr10aSd#`pzHM|(GIe&ZtW-+?`CI3v`{x20l#Kkb?8j^YXEg{oiAjP^J# z_%;IOSgB{EN{9bpD>YD2Jyj7gt(|4vBoW_Lk)SwQ0K`R2E*dV%Z&=i-enERxG7~H) zKZ&6334-ll74B!Si+^|7e~=7@gEa6xD`?$}OG5}aWm&4?W{+EG|0ASWPb;e`B448e z)Z+X1@5SGx0|COV>wjm(@X`6*?STU<2XA^tS`-ie#s*t}*SnowN|0g-I&tyruC)I==mLO5^#sKL|fh)yu`R7lR}aw9i(IW~Tt4NEG!0k(Qv~+sR-2 zuK0Ok1U?{=^|z=J95XjPoq`8_>Y(=ijVqH)h!YzR z3uA(In!j96aYE-)_}xmgA-Or~MX~;zgdDFo%U)Ryn7z%_)M2~KW@({YSLgeguNM(N zRZUNK$dX8y&*Z$ty)o!75;quLE4~Gjun$*NO zty(b@0VT>%9&b$BlFnMy$8{RPH447?Bx72W*s!a$Htr7oP2ggq`kF+1B-Rb4-&xAG zt;sz1*XaWvDjuhhM4!PNS+TY4sDP|s^<#VQg>WQ;p#y}X$3Ap#gdt073Y@LIRe+FC zKSy@bux1%6)R-Llz_4DyI-(m+q=A5#hCG|RuPtiN}s@c43oZ7V%ErMeOKQ8O5U+O*fA!TWIbFY71l!f`A zsH`bVQeQ01s=vzr6Y$3rjAfoD+j?pU%{t^PguXduENDq)lpsy*rEh5nhC^Fy4RM=G zpcy`sBYgCW@rWinM3j7(oq8mB$e>vKgi!!;*=kIh;jP^-iw(o%77p$>FH=Z01~=e1 zmHr*F2(HTeN?stgU%XMXbnJk5c*j_WU(}%*1B@H?tO<1m5cG`Pf^`?Qb4QD=K|gM> ziutii$45!z?CthzRGZ#J@!be0Ol1DHFea)vGDTyoZd|4>unqaXy@IH*rt!6 zVA=5gYR`AXv#77gI)Z4-Aub~kUWg*-IMB;qO!ejYY7rowDJ<$@Jz|l6CdYgN8Vc~F zJuJ?ocxUd7F}8Ge3-#~4b-s2j>h>QmHoWZpo@Q|OaaIMyN|l1^j)sL&H=MBIY!nIw z4n(~fo+DVFXfM8}G`{d^6ZgOz$?Q4^;y1SQN|6|fh zHVkq&fc%h2OeO?@|Mdr%-q4dB0m{CN!wePg4r2rdRg~vd6{$~mTkG0enIvLV1hhnVT2 zTl;&guoRV-fEd>QU?HwGVs`>^;PyRDsTpYpD41VxR#LpUk?|dEl=&A^FDFCcsN(WO+(pPx)k2C3{V-9qz!uZ#9w^30Ve__Z=-!qKVo;REWB z5vZlH;oQvUl#Ai^`R)BO*Zal`TT)U=(21K-5)yf@5R_tcWxCo{yH*14@Z(ZyDEqPK z`JeMJp8v6f9A7xX!SGLXFx|1+P zGe+7$krX(lzMm_K#Js;TNQXn1c!e!O=YTi>2u2P23DpHI;xfUMhmn8VS1+ZYKKXQO=hBHwvX92GsF@0vrVwNcMAd5Y)*4gTT?XBJTfj;6d!bcA~|g!5#D>~fTKTVrMHw2&5&Al|Pi z_;2>Sa^~ZAWDaUe!RS=f8xokV@E^1)Uls)gl|i-J5_o>khBw#!8&MFTEF9RLCc;S5 z(>MchD=+7n>BX|rxHEBzdr))qmLyR%+`*diokD|0{%4nDt20rh!M2Ng8ypuMfjI4XYHvooX!_6_<#C5$RoHzH2i z$G^}C?LO`lHEMi1Cm%^*bGkVt-C=U-u?bi&Cl&AI05{qUbV#}hZ6S)0RoC{LcpymT zDeeO5{_e=8z-r~6a!bwXy&D^D^VjI864ktSbqJ^|Og=04sUgT8M~#v3R2<^MKl3)Y zn`amHjez%b_|o7^)uu{JiHj^NIdc7})6gOo`hC6*WL0@jFa9Cr`Lo2iqw$TlHiUsQ zcy#OcI_uRF39YqQ>uzYaC2p}$BD-C03qtOmW;q2sf5htYsuM3JckV(0>&ftW<6TsT6m z6H-Xr2h_VO($e#eXp+(Wqochf+2M73?<9hb0b#WuB=4k|Iip81LH{g4>F^382#4~* zrl@)<9;*d%Dv{Fm-r+D|x<&P8FTNiN;v(>!m*(7$awaCljV>ojj7LpB0rnf&koLap zCAI5WaeP;4KM*H(KU&+(YkWq(-4b|d_6G8$!CDvQJR1+FSMU!*1d7?ipcqN<|;C09Mt05??sH6JMPshRWgH9S2jtdbb3lXybHYP}a4SMc*wDuE98 zZL}}ZSVF3bxc03R1o@Ww&}YKIt%oY$o7W_C^oZ|HX5i!O#me~e z4|{co7d4oUYG`PDML5T4EQ#FecpRtifMI_5S2LZD^z5knsCaY+Yt`$#8d4k}_(S!D z6K{7fj!H1&Lm89ZjaunhBgB~chX6U8BXTsL`P^ySpc*s*e}Si=tu=$YAUj_|L2_Fo-dE6Dh9_Q>mw9~IKVF7wZAc;6(0z(!dyGkW|suGZy z>)R)Nq|VZ9;U}1aT8_?*nm;hUjv@(rL5;zx=p3B$TQ#FT%U$_?KQ~sr-5eED1bu#) zJf5#02T%#=7Lf1m$xHv168Hllo8j@BOxPBGEpbNv#Z5y=Z+z})i`VQFF2A!gdw-wA zk9U`^&?BXE1|phplElM3=`#v85!N=li$5_v!OlVmC4Y>HJr}8_GT?3C3&o(RW3tBRPqgUKUOScMZ(64Bc`8jJ3^ZNAht~^meF|X zPcr(&K>Lxc?PeLi3f23SrpI^e%RJ$bHhVdH*W#m2SJFVk!kyP|!9DG)B zrPaKT|F*+%XVDX#X%1^%HFjHm?I=Uyc$)#?(Wbbc3K21JNgV&Dh78x8o(`RQ0CZE# zCrCO?7|6{^gC8%kw>ac{M>7VQI=VFYV+Nj<^{?CQM!g!NR4A}`M*(!{y&y6fqvcpqS% zo-yMH9$u??ui~N_0&k=zRkj#tRJr$D1N9R6PIg&05B7S9eIU&WA;9(Q?*b zpOz6GU3fa&-A9dz4<^Z%yK6T1!c1qsexOv2HZv|zBC!-?LSVmpyRzg($L?mx{LKt0 zn*DaDu{q&PEY0*GqX~c+sHmu}J$O3botB_zve~(mvU!O@3E}jN`#+o;A0y&=Ft6Kb zk<5s<-ZlOzuUUIN_`P4~G^8_-sbDW1mHm1@hNuTrn26%znB5nEcjd(bLsjAiizRUp zLZB3`AKr>(6p04TmTHa)qv*IOrxTj_Lub=~RMca7&oF7GS`^4^#(E~0xA{(zPgh-l z_hnl^Z<6`#Km#_n&Tz405;TH6ZrSjTL#^M(E1hi*^#u1I5l9sX7Y&OFb@ZjJd`;}~ z-H4{qF=tW*GYLv6Cyu)*WlWQ4Iw|^~xSR1K6}x+I8747UORq> zwVD2wlkCq(3kgW#t*W=o{;jT<1T)C*&5qj&oP73(M|z&i3v)D$6$+m$UsK5W4Z7RLzN&1^}KShIrvPMopX|u|^b%2V>i)Gd)m~Ma^)qju` z{b&f^w~LlYf~1J$WsNG@=56R5%kSwjz2{aqzg$eX%YIZ0*}xoNzd;m(XCVb^L0(ex zg57*HnR*lPeU<~*E;h9nONjA_j+Lil*&I6e9e(%6(U*@F=gD1<#kb>Z9-sG{;T%6m zd9@owNqKqxYOv(2wU_dj-yptSb@{#v=C?ANn$IL4M|#{*p7J)QcNgv{mLC&f1k`Fo z9YXh`0^#C&Wyk~p%H(+f!ySHrSzKB#I1@*s+VMcz|HT4a;>ux~7@t3r?4lq)y9|;& z;{G1APR8_FHSK&aRI;Ze!7n-Z2Q+{c$aYO%3UhWoO|yGEUD;n@Zx1=Zq zTjO=M=q{9XmOOth+~x7nt??s``We+@a38oF^Z%^fsix|sU?q%z%)BUpctHiF8l4pM z@NJEG(9kX}?*LmsDwEA3B(Z0{+EyTeYrhUnc_jMC|_%F~`Xl-kK;3s$l{VuLIxP9{ewJ zA1-zK2mYz+!Je4!Ry`0zkeQ4|DFFoi9|>aWw%-#?`e@ZH$Nk*b@{X{4Pctfnm=Z@v3Re2eJaZ3D&@Hs!o=%ARQ(5Maqiou z=lo>4@1fua`Oyc=JV<7FVGtxtAb`P%#p1!kub=(JrC{h`!f!$hfr43UqhI%VW?#Zw znoH}W$8PUmiO})lqY=P2QyIPColqW{I1wvR@#)`&LH*t)GWVR~_>FH>0&Bv!&4v}VRQe8MRDZSJ zaXw7k#kEgFpnZVq2K?`1UF1CUI?iMahXz|=_9Ul{vOmCzifUCpOI(32ha&{{cn+frw2;+(E8wf zD1 z?hoY35;!Sv1B9WRn%tVIda*$TY)vUaBpuCcbAfYhMxqar8(+ZN$^-Br8<%$@enpTE zD8LCg#ovy1yyZlIj#msDAI@EV{D_)NC3_X6?CG44h4X6Oj12S@n4wgSBC- zTQ)L^i2DIfz{eHsmoUa~e89?T!>=Io+0C1*u5QqBl(TRZ9Q)sr(|20PD)idx*}q{< z=#zsoIEwlLGdNfU3nOX#+}1qIcfsmJT9w7u5-l&E2%XpSnv0lu?I?>(>|f*j4@(lM zGEfA-ap*UjVFQ5t2Qp;z55$5ZNd@&U|14Troc4_%`%_bq?-}p{58X`@={-LKmdcVD z-x1`k?$oce$BQ}jOC#cYAVAxpPyVMJjWauw4x5x{H_!Da5{6~O4l8%RZk~5vkG)C_N(gIojsA4gHQQ5ScY{>^R znjY=lQrx{e&aQH)hCVOR0YK4!K}Hbbii8rH-qF%?b`uMp=2TQm73_15>VogDUlCC4 zbb@T!nH<+UO~Ch#w)rm36t1+tDxK&_(WffUI94aegz!zE^)z9kK*i?^FX_;yx1>MD z<_6xXW%K!%;qi)JsL&U|d!w!$;{ROAOd!a&5&0FL5=Lq`{2C(WA0YVJ@eRYuZAQ@k zTJ3SdvQ?Hf69(wb4seDA1@MyBMs z*kTt5SM`S_>MQC-AO=7ILe}G*RANKVNr8Cloa(<)8x*@5j`Ny$Ql7D7{2-dVQg)jz z2@Mfh?&{ba9gM=k<`Q>u9(t4=*_t8wn*g}ITu+QLF@4EMQ<{j1x=|*WEjKg=(#4;woB~KeZjp^=01&WIQc7vwbV`%xWftbyJco~l?Bg?CwQ(eAz09m#vATfDI4mO3Y=fs{L)VwZHLfLOj z14Kqy<#4W$&-SJ!>lAtgOD>T!p$D&9E$W$O(}`MN=bg#=6WUp=OJp&h6vQNSt=0JN z8fx1ka$F2JzTSAg^ro2;PIQ!A%%={bx>)F}oaxVKrk@J4CwRx%@HAOJNxR3YA^)P; z3Cben*|@rqGtbkt%9SUmTEx_!&Z^?(Btgjr*zBOmTKSABC#<`X%(IZ58fV5GB^ZIo zFiUfM70`%m_=spgD(U`6T7S7~P%(Wsj3(RVBO%P?$Ze06iktonc z^nXx;peu#p0z}SmZjsjUc1+F zr?->6sI>Kl#nyhsG}k=|Ak{G%DyS`;)Xi`*-dv?SSV~8(b}4b{%Q8!Ah#ABU=5-*d zzFYpHuxW;DeDR;^SOahPBh#_Xb#uu}De}Fod86^v*BaAhbWJFY007+L%LWV~G+H3x zj@pW++d%gurvXA}Gz0bA$CP|x$X48rBcc)3Tz?KLh$hu&awiB4R|WmctK5|vupa`$ zM8&1;R{kDo==jgnYwVz{6_p{(W5KNkmPftsxOU2oTdS}HOU ziu~x#1!$A_Ct!ZuC`jPO6ihjn$TaZU>GW*kAaYQJ%1Se`deRTgnbzSvClwGi1N)S*QX%HkCmVX;4Epi@0ukC(F$!Go=gXv5ADDX$z4H>F*USkE{jQ-? zD;wTDY(pQYe(3kvu8c)u1MY#-JCtd%PQ-nRtTZt@o`;?P9H9gisY>J`u$}c?}UH%leC4URO6sK+R>$GRTl=rMO49*G9riQ*p(;Fu2N*dWr7` z&$&qVoj`Jd$fIh!9T)2MA6MIDF1^!udL*(*&bYDD$e?-VS+ZN-K*$F@t%>yqWj^+) z#ej!2?-`!omU2(stU-Xnuz?vJ(4_$q(J}taauAw?8j<* zK%6W;Q-cs7t*?I+a1Ah*U?K4)ft6Ga^!rALlhb{@2nvM$JBJoc$8kPKlF5m-}1F1)&NEra}L4HLysb z?;ZmI4`_jGF}Tl*oY;v2L|(H$hQGuMaN|+1vY3Y}f4*vo`p;Hdb{OgC??@Y4jbydk zVtyyk;e-zy0NV35Oq?HO_jF*$yLhS#Mv8J*@6=V!)^|E?zeC?ro6N)Ai5SS3f6dTo z`2j~Z!krXySy$`;A@QINbU-9#$#qpoJW(>av@q453%YT&Q{x5KrsM7Y7JxmaU;aJ3 z!R~pOQLAvhd0|N(1H?sv^U_uwT{-&Rw7qIVp-`ypm-zkJIjzL3EL;mueS-QH*H^}m zE7g^?4y`H$`Nl+PFB982_R&;hmVcMWr=oKsO+KP6y8WSgys%5V8x?@Sd_>|1e3cK0 zO}ZR7tza6%KmQU|WZPFzWj4F%@C&%qDHD|hPQ6^dIB9r1DMvT0E7nb<|2WIsRw*Id zB5N9}(m(pjF#fO{vht7^KB-0-0Vrx$(WEY0DFw}S7&E6V(_g1HjCopRVO?h9+vWv$ll8(egCegio;?kQff}IabbCq>xrkjtKBFDqY8xa9W?oGJgN;dgm+dcv35t9o#>nIuj!P z`%6tW;D9R&tbkyXH}0FHU)L!oI7}(y+?9ghS>lGGkBj}wf`$$JqIoYY0p8+>xl8j$ zdGirDVTt-7e8%rjt9Oq?F(4byk?96uqQ!E7lBbS&g)RjJPbcBQst`0;Jpm0v^0tZ| zn&RSKHpAfSF_<;hG$^f*(3^gz_Z~J^Afb>*|Mvz?P(4L&QkXrkeGCxIM~}X~|16V1 zqCrdV+f5l|=WQ{gl$F@0UW!V?G|zo4K<}|tw@AE&`JYzmD#9SP{+sb-JzfafYUym4S5nu zY$1^ehVrAgq-%(8RF74c=S5q5t#1}t;m7YWmJl=Q?2H%?Y}Ty zpR~TFcYZN8mJ!pwE&vHN2z(lWQeHFt95I(nhv+lPj4+g}y~wj@Ea)2@G?^1-8k$!Z zO_m$drtX&SnAh&|;<>2x3*CLR2jRx0c{m;0>7S0}GyqWG*>B-NJLQ^G^_rb+8Y?lR z{?ej;bmi63qWA-9sIz3EUj1)CR?2ha;yV)h?pCH@l_XS@6%-ta-J$)y4B{T6e zd+b=o7I+P*~2Y9ie z=NAQa&=~I%7hPLwY4ZdchNL%>By3OL4>y55l=m@*z-Hh{K1|$b8T6;zBw;iemMoH` zvphn9PoH6g^-J~$^5FMCGJB$QJ70czO8#puM%-@CWlV>F(}R0grR!rm0wBr|7FhcZuh ze!OoWDrB#7hjD?`mpVo*jXEVBieyrW=Se%_=|oC5c`^P|_@2L<@Qp-8MvJH<+}O2R zIj;Z;YGlqLT#+ps(`Lj`AD#xntxBbE@<2hbD>A;ec^7n>s0SsMd?gY*fkn)Cs5@t+ zX>=&Jy4hPnjPG>$BKgEC2fq?sT`V2F9&{q`_4^8|+tl}QpGe4u2(**P)$r&P$7uK} zh=??LidYr+?)(in+R)UZKbf|=g}#l1;Me~GqAQ85yF+7lQ5rwwd*sBlUZvBv7sjT> zwxY1C(iBTV!FvwcuDUfw>-X~(+NdhRQEwhs!&lCT1m`>y{ogaoEbI3lx@e_mY&;H| z2iliV1ZgR*X8024F460D6P)ZSR}_Ds^G4#mxo?q4tZ)vdFGH9r@r+0^%ebvMdWSz3 zN6zQ53nVXW5D_oWpc&u1SCmV`Nnf^cZh45kO}?pL5@zoqF(*Iacv%jb75+wSPQE=z zC4p7QoFzO6P7#B(8GWKRM4_oogq}Q|2yg>s4vxWf&#k@)Z>f8F@*Mi3;~?I&PL!%d z46|B3sD+2W-o7NbDi=29&KdjfAPkp}NOHg~s%(RUnwE+Z)=rv`FnNF?Ib)Xo zW{6qptR>T@rv@Ds+AHasT71zdUthNUExHPsLh3De`V}|C`9v7`)$Wd*$#rf+Z$xH4!L=H z5sI6MOHV1C6g2E~DHB^WjCsQGn6V=z{K1OWP4niLvB>!9=jor^$|FXCcA=Yqk5D{e zDf!W;{gF{gSeA^g);YNQ;gpXPLI1YZ=4h2Srhg~3-u7NF+IMEEz*(z?Ai!yxEctY1 z>piu;TRxjU4i*<>8oX=bCgS59^2@N>*N7|^dzO@B^9G>&v1n!oW9fX5{U>iuTBC|# zFc+r4-&6xdHg;y;JA42WmF?^o0lN=PVZbwKu&k%2NGcL(6$1K4+?uHLq@f(c?mE}- zuZ#?RaeLEBqLUu(xjUpCa4v_18wGp$A3#&{EuUFy8CZ9|+hK#6G5S$rm<4%0i}eo6zq>34kC z)N*>U2x^x^f)>nGd!5`PW1a5tOuazi``7^__rodEi;fgo)pxb9w!-N;t3Ro;LaN}E zP8V~k@gNNK%xB^16nxq_9&2yQP@UyCIOA>!{tjU5gC#+;!@)G{AEcH{(jPP_PvNcit! z(sg%A*$_IVaz$sG8?HP&K_%kq7&6kuq zy-6amjfN%PpYHK#BbP^RVAFXw{&5-V9+z!U67MoT*0A?t#}H8aUkkIA5N&X#tLyLs zGwlJ%?(=kJ9#3RP7z!%^uIHcQx#zM(qurzP+_$P?H`cTx^RTT4!#AgUxO)yG?DQY? z96_~*EX*f9^CmZ}33n3mfJ5HR>FOWdr2}Y1k1s#4=rIn9k1d9WAP;%SmDW;n^Slt) z+lb<1JPQv?NTESz7`9gzlI$fuI_O#^{_b^e&>FZf zZ{zTlKGO52BfKi>_xIvMFdrYGz9r+Spsc+6E8mrgeO^lzW1VMjW9^xJcKMP8jV|X- zSU%l`6(U2`+}=Oq)GF3AzE3$3d&1t@3;0YcDHizp+gV2Tel>s$D7{~wc=#u*@>b7< zw#_C^tcvGG$_eNt&040^d`39z;KaR#H_`*nw3tx(G3v|GU+^o7>f*}`1zJV#LgZ^% z_rYUQA&R|hY0&VY^|K9rTf#_-8M969^2RW<0^k^t87cRpY6NYO-(QGQ!BCX?g|c+h z&CzKI?q4&f9u$cG{g7Kr>OIY_P>>(_%X>b1HSCijmg7qPNHss+UZ?9-I zhNnK3R)1Y+dw;TFZwhdohAJ2K=91J}-Gg~DuK$Q9n~YJbUusXid7(ab(ax$if@v7y z9`3)<8204sB&&H;NHpp50tt=GD9p6}KgLMeKYyRX*##kAJhL@6RdE{k)*nyr-E*u<)KhUh6~+n7j+uc& z=iRA&L}19X^q&QBVZSaZldKEyF0+zjwg(TLUn7{lUR_vm@vm42FCuKlB0QWFip@mQ zmxr(>eHRJlwwJ+-SQEuG$vO=E6E(NLmrVZJCZKk6@gb;na_pjx-}2yF+Yg*hdx_pN z<<5Q}c;DyEJc_Z8h0ot%)!P&c)=FzSNcueXps=xY9#ao8Qbe5Y8?T{*b=T0aP=0=W zWeL0`Y8YC#nXFpvLBDyd+A~7&d+jgi>L>yrpee86Sxvq{!0f?6P+4YaEuw5M{3lcw z%^5PnAKbKrW@q(IMW6m0#Egs7AWtaTe zYj+Nv?b7Nku813?S%3IAmE?SajEXVVK)1_TLadDv@y@h!d)KX)due}NA+KC$)*s)I z+bc7t8JW0Kz7|qbRQDwlae>2|{X#BlHg=0iuGX_HXX;WvvG|F`-{AJecpd*QOj|px zbNT%c1>=Aln_AG*wkI8d00C*-=`H%-38#3%&S~vP!X1T9jgU8qMn~L5S4a89myMJA zhn)ceWT1L-6VJy5PY&a2$R9HPq~s_KpRliaL-$fNiTSLOhkr$V_`Io*LBnw*Jje9h zA>t7|c{C2u-a)GFbt}o(Q?9c?Am+>FuP_lv$JS>`$+vm<%WL8 zH5t>&L$!>g8X>@GeYbK_L{1R$kTvAJ6?OeWC-FvkKidsJ`2 z4a*c|6F;z468q;HFmojp9VWnPf8KZ9^B8$rnQ3yo! z)7ybX5?S1!CEsQt<%6nGl+mY?_l_^D{g)f}M?!0g?HeBz7fOY!hEZNf|Mht+Phe(Q zTx^2|IohW4mEIn1-V=0}w1n5BS6UI@W}j}kt@T+y>pg@n?QUSfApLQj-%YQ}i|wE* zF~bu6ijgMir*2&6g`7JjmyKm(wVbN6JtU!M1vh?QqB)F?%Cld~8>$zhl zj2EdDcDA!a6T$bHe5|r7>;ua|s1lFb{O?z1d0AzqmiRn&=M>S( zsj1!WM0dg_^Nt&#aS|ELWb$Tiui1Q%HcFVZ75Fp#Kwh3HQk;b-s2KzT zy;G8v(zJ1-Q=&^EA&VxJHllmeu;IW!#c3u9ycVP+rz%?`Z5s4HJIV0g literal 113530 zcmb5VWmFtZ)Ga(n(BSS8f&>D=-Q7L71qd44ZP4HnAXsph1QLR~yF+ky9T;?gVdl`aFxs1GgVsyGyrF3S zn<;~-naPoD^x%5_NNfJfB?sCQNst2yol&}+Hd9#v9vpVPRo6`;0e`x?k8MO7jgIag z?%vwi2lvET>niw-=sl;X(Ymec|zF|RP3DYaHQjzWJG7ornl%fhKS9$og zxSRb3gi=8nv9gExyN3!0u-y!J#q92l^BQ=EH&a}bSyb_QU_GW_cm zc`lP2t!r_1ZW@{smmU?r@&f8gL8Ag?!C@n~uW2kNYlzp1$#_qen(C~~YP(rEMM46^ z(@aVslc^<+>T-iwWRM(bPh>mV$bBNDtfM^c4)K~kr4?f9Om%|mJl^}uzK_@`H!(R3oR(GO*dni|0IE(H^B7R)fH~X>7U)gZf@rd{h3T zjoj3TJW5S1^BhO#t3njzk1LVkB#n&>g5-@UM%Gz|YmU!iaH(z3{g6lLe{%`GW&zv$ zyp=9nqL>6me}2p~P%i+P>#uKYvT`x3b^p{ciuVXaaxrA);W3{f41C8@nc0Pd_KAf# z3Yzp6%#d0J4qzEQ>iOsKdP~$ zhHlF?{)u{A^~*((@JMhXs+RhVMNs2X^Yde9aGRF3I`!LQ&DiEVbqaGr-p@_eDP}cgCh?IVX3r(wFIFme|dA5q) zOcuQjSuc8+$L%ceImY>#$WxZ~ZKC4Bp--de>`(HzxHc|#QZl?o>Wj+wK=ocC@OxNJ zLY-`wBKMux9oT)gg9kEEJaZpvm)t0N6wYHyzmfV`ZUd5)NzLRmf@`n(n`e-SFxQcx zzoIEJf%q@~X!iRY3GsV!A-io>tgo3fVjoR~1xI;miHUS&bHC=*5ZN{L0y1le*^mqn zhbST~MQIB2i+^ucKVKA4&=ci0Mt|Kf62CuZv_5anA&yAQe9Jv^_9N?v2MX0D6G3oV1=_?s=Yn5V3yO zefI|D%0n;`A+pgj3KHR~6&qACQZgGa(-~2eF`+4%yJ|l>;?A44388r2BrK7*XN)O~ zaICmUGYlqFrm&w(45BOZc~j<>bpP}_OVhkkzqaIF9uaB0uQ)a6t_F!{iXZ8rAcslO z<71%y{}fl^GQ8{P|J@jVDR3r3#1weerQ@y9z#e}2YN|gNkYqEO`gX3?tbHK!QZd{n z<~twAe>VUdH51@D>$#=g`~iGgpyO}Dk{Fo8h=kewED4w^FrQ9Xve=mr{jom=e>B|C zh+*jU&8ABLtO5wx*dik%l`cDOk|1+0J>OpcA*_hPAjF_fWDEkepOEI_6-XmP*E?tA zo@N&R$wSk+6^V8xzges&PwUS+q_qh{Z=M$}T=C*|;ws=$i%W2w!4!O%@JmL?7`y|t zluw~Dp*U1R0k^D4KH;TplY}9gGbwmd2Hqq9jr>}VSDKPnRCcCxam<#DvU`~!f6c0E ztNK0lsA)kUfwKnk*T-D@goMOBBkUQXe6U3lq`4ONl9g_j`A_~fUI2ity!V7j`Up%s zTTTJ}w}(ld>|PzxU6n@(1E~hebZ#`ua1XKJS-zb%FfBrItv~n$cn)Sy7H5e<^PfK? z#*~un^@+a=vCiCE)mQkT%Y>tUgrRB+RF?hee_e<R2>KeiWG?g0 zl{vV7k4gNF`b4v?d3nkgrUn?A>|T+f=BJ(L@dbIAKTi+Kpkj7;-adt;3*=BzPa5;h zDKMEFNSzuldCDPECG09n6G%rzMG5s`rq0!+k$bWqd!jWJ*@@+Dg)^VrFwn@J2(Fch zn6cOPz5%=W4sXn3hlXBpFX-o9YHt-T&3^hY&JX^^r%GW8H&R14%b5dHDAzYv>~Rr>i>I ziDJIR7q=vo(3fXfur1=HEjnGtHT95S+^(It^oC`oc^6^Moo>5NEZ^b*;v@o+S2I4B zb9Kp*NNhR#y)LLp1;m2-E5K%1YI~d30JV@)qm)wG-Ac35A-fdDO8a3BHpf14uSBw| zYnp$)6fg8`#obl5UyN90Rp+||k1RfXpx%K!u!T;@t5_h9w1prJ+I{Gj{XtCA%i57$ zA-$hk-{jJt^aaG8>f-Z|RGAd7&1j5AQ5%c*AJ;m)lA1SWSn|eJoHq{JC&dl5OP9=- zFt=}@Ob@nK5Em@mV}1GD&h#pwk1L4di@LtR8TqY{7A{{Hpl^qOgq zA}9P^3>tgnQya|XNd@pa@!H?*!FzbdzGuTg!XW22w`>=zX;<_D{?}~nv^HpaZU8Tx zN+b?%+;+ivK4`(&yLHO@7|h;n{=PNcc9;8s?MENF4S0S{By{GOVu3Cs;(kP~uXa;x zA8K%(HVxO<%Xj%8F?F#pGCy|x89f(1p12Ebpq)7X!+BD5H1hQHMoQMi0Db<_G(xZH z&BKFc>Tj?sAlKxX9+L__l-+DGY)tK4ss`x!x3c0wpx0oXL5#l`<=Z2qzt6XHP;+z7 z=-oKGs3U#VaeaCFNcQ@*Ee5KtB`c$S4{l2Rl<~;&8Adi2-MMrGM+hTP36lMc?;XB0 zAS%Kuy!7^r>0qeBb#68_Es)L;{&Si>d*QNgl#v#pe8hNSbouY0%j# zzU+sv^vN<;xU(5Nh3jDqJOE|=&7htfhO!=t-!SHU;HsB^u&AT+T(vri6k7H5 zeYfxH81XZpJr;YJ;wP4XU=V%)HD1h(|>HvBw&F(>gaxAwEe`@a($*{J=|67 z&A^~cAYw8zEeyl>X7@ISaiX@iOH zE`b`?n_IU}-gg=09X>G(U8+KENw*RX#Zlrd9`78L3HTRxhg{D+0FC1{lISD3h*_aW zl6Sm>Sw97@*a9`;3mt|Z{o5-S?7u8MMuEGbA^VOOftb zn5S>N@zRDU`3I~bsXC-qbA&}L?e6UO{-P<-*HHntpWmojenM(Qqd|-ihMPx`=RH%2 zQfm7Evw3ISZN*Yr!;U|XPdECA4BJ`1V4@(;igdu){Flx)De(c#WkRp-?fc$lUqTr} z`IO9ly~Hte7Ex*XUf2>y&qdwM9e6x(W*n+`e?RD~#lwiF_p@2Y)45XqYB>62E@_D5 zWweFN>l=y|-v|-zsEb*-DFNSj6`zu2Y*;M;EL@fWsu|04J@a_CI0#Z}h~+)5t`zv? zbY6I>7b|uliX5bP>lKCN;E`pw5B65kZ#y9R#sgbA+Io?qYxr(7oJ3M_jj0*QuTc*F|5{Q)ZO0=Y8rk^d|D4Fk7RxmEg@Uis+WUo@Oe!u; z2Up{f7q4)^=uIX{Ct{EV4F?TWZk88!hks6`>{-8&_zeEVEh+h0tg8|7hm(ZCx*5VP zB8@OTJx<$?ECZ$0HRj@+(x|1hnJvKbug`Xl0YXwLGzsJAL9j%uPdzNSnL+h62kW{N0(n{YYjB4b}t_2^-o8h0L^u1LNND+5}Do8IR<#S zMlKL<<>i}JU{UPC%gIUE){c~QzdJLuo!t#B{=F!koH&Lb)A91td-|^t-V<>9-+fcx zYLWKgFIAJfz?vGPc!kHav%-K9L2yZ741K73Po@;gYiH_|Eg^579;1lNH1?d9tx@bC zMSKzOhS3Y{fu!$5#3I$$lvJ|=FSvrT@j*9Ks9%QyRKu+05fEEn4=~>S6_6+L-g|6# z@iVd33%9Fw@nDdF$sWbiyyPx|k?ZVOlFQVw9pj_K4gFbtPUOcGRSr zyT-X?a#>JiCEYrD;eXd6=P0MiVlOSs#F5!dGx5+3%99&KFb`j&hzQOkc@9_ch0Di5 z&F00m!va-1l2y>>oVx(T6?;c-NTQj>hG?vhxF4*&Hf#T_Z|Y5tEO~8~l(!krV3*U9g4rrdnkLy(o zb1|id{>EV3EhoUIEn56TD(S9#^Of?WJVhTMrNE+ZxT-ZMHwS^ZSdOm=GIr}Nv!`?$ z8;~bETq7tz%tRN(a5Eq^W!P`(5J#Z(=*}?HrtynKkShm|C)k=Z2=|g*=j>h7^Yc) z9c@ngEa*{fH}>VQn(4jKWpD}lZ{I}uJ;bFOmG>Y_@SU6}3moryv;V_~SK%`HP={ z>S{VVT68PU+ObQM&n_FEY;^}i24Y-pP$Jr3or6oDkly-Ye^V;l6p#w~@Pn8QCDfUA zi}G#P+4k4I}vy*V6G+>}m3 z-@ua}3cLP4W9NME%3m0)r7olq^hGG8r$si=vhg{O`G{cQG6=6ZvbBMFc|x9MBEW;4 z^5MIzi$%MjX2!k!?_mJm#j~qm3(a4wp}P%y#pNBi--cemmFT6B!Wx=_~H)!758tXv3*@i+{ihv7!o@k-7u-Q``-cNZI}JCZ+s7D@YwNCEk5v`~&Tz zE9-G!RTb_s{53NHdP8I?x z&1{&Pojtq3NFjIQCXi=IiNm#ug2I74+4!Y(Ra}=6v(wLUf7aOdvRT|_?X&&veznj{ zev&f;yn1-a`BT@)Br0DRSAgIzic8R%D-?ky1zM-#tULe;p-dd4>iroXCwFW?n2xqK zL*qrRy5%jOm()dVasWort{L4<#)nMMsZ1O;cJ|%=$DxH^rI5~HRxYkgK1!UOot+3m zWD*h*!uC2V?HT1tiP8LX2RZeu@+RzG>iX4Jm~jb>_>yx|2iNx>N+FkZF>l@lp*}vo zMXV5R@nr@{XlybXJ?HB`n?G-JG@JcU8i-Nrk}&+R4^7k2eamTXbGg~+9CY@6anm!| zfu`y5j%q6){#Sm!B{h3ydd|BtF2flo=w$~=L+`n7NOcG|mZW9{EhC1_4vL$zCMV9X ztECc@>0duf4NsRl0il&fe=Wz(=!4ndE!kZ~TNiIJ`4+XsU$*;{!q@F{J$d*0(v&-6W|-lOD;6z{}US=%2{wcfRezQw67*#*`VuWx6o|g!kCM|Bt6i z--Vo04Juh&>^#iH&X!@`CV-SeLtQ4S_UPUZ`v5#s-Kh8;czeb*b(aIwajb3-5F~qu zru%%l)88THUER^KHPXZl*Xh{YOnUCeyIG?ToqZh0VHiPfL zpuuFjM-p7|8C9M~+rSHUt-r|v6-uTr)C8&yr%7AGYP?kn&`*(XRcBxe00L{ z+xp6mWMo+($M}WrTkg<2GxFzE)%~ppC%_Qwo`Ub2$I{=&!jrG!ijRu_geM+e9A2VA zXbKU?notd{$6M@1N1a(Ujr`%u_iIw#OE|f_Q3I5!Eth=Pb?zPd?%g}4PV?y|99_de z_;gX(>$((zV~@FI3!blM!-u*g4LyC}BA2&-FGqCDzXF8`24F|>9q{O(jf zZ#=RC*2ixOpO^{`hj~K=QOavMH74e1??M2lajBs zpns_dg#stb83r{~)W3U3K1SYXN{nuH1{zf@>9%{ZX`;RwJxjd%8I`PqXF0(;4Z!!^ zOYGdd3G@#AdNYheB4GG3Vs(5*R{1nosmd4v;PG+(R3ASJavlr&l16`s^{8-c*Fo^E z``$5F_V!kGkC_g=@n8AZ%K<@r;{W)1kYB^*e0jkM+Mu~*mHwdoI<}doDo8Xt;PJDw zOK_WiG&24%oy(tJ=3HACCO@iE+TO0>pc&`<&^sE&Cx{O`B%Q+w0AdM9HjNwuB%q8H z(fB;@MmtZ0?Tm@TwS<-8-{(~|;Y<9t1{d^6y!#FWu@qeOp3Flt-9z?FT)`K&C)N0r ztYh~!HdnpTbbSdF`ytoLb$7fz&c*$MtRd9?FV?jmlHMFYKjA$bxwh=th1{dj_AJb} zR8E(}>eA>#YNPP65*03Jd4~}$nCXvXfR=u+Hi^XhXqU(o`tq+np4BR0W<`_1=WnF~ZW18DURE({2D4^Yl6!Ct$QZ_8fkuyphHEK|o* z$ZW$GXo#K3=_@Ig%&+C$Mh*}k{M@KmQbCnM<0QEEdl7L(Vb1bTUGIk*G7C4iVI0%I zwY%eL(W|(E!O|hVDLXPx?PeqIAYyO{dqB$VR2k&)j{BoKKnjSt}URtWv zVujKfOD_-UnHj{Bl6FB#W1+BfJf&xqa%sV08Evwg<-Cf`e7;kZV34F~qP*x?b!>4n z?{Zh*DuQfL9Z)%Fg?4cLCGQ;KVzUMMlHAB#BVHlZFdyq*)xLY3vEnzHU+PT{RB}_ZAVn&qoN7SZ9$hDLe6q180>}>C{;rq%XOJavu z^mg`3lD$i6(Axs|Zy@ZeaEQAV!`}DoQ%VfX@LZIIBemk-DMwQe!I@pju={Ot89Om# z{^vq@m)A8|O?w`H@K66TfY7=g`zPyDurN~}Y)SXpbKvao8{U(JFuZI84Ms9adp}8t z;M8Nx`3OGXOCQc745w+r#^))}W+c;Obm3#J$Q6AZbb7kf8+aaU35ua0nkmcc4P0b$ zocC;bd7`pEJKgW6oEJ8s5!0YqyV+);Lvfp~Cn0V;xyt8{eRR0SCfBDybHpp3=k%Uk zT(SD&dVl-EoY4qz=i!?<0NJ(IE4(pr6(Fz1xW2s|SX#;i4HgtjK6rKzelD&7(a(@| zfPNE83>FM)5kE7BgoHpSlNBrG2`DK=3bPi$!9hVn1Jl`QkE*X@>p$d^*(`o{A(lW` zP3pKubO{Mn?S|+#yU$Ng9v9;UH#;axRg5F8zp@eQyPf%y)5!!fpY5Zg3K;W-*52@j z-y2Ip>A;6E*HX|%d#0U}ee&k<-TMzIX7rxX!vuAI*2WRB3OhXK)P}F0S`L)eV39212@CfM;giF&Bq4p;z{!g$ro&h z5Bok%8l1Q|Q)-rTMIHky<$-`&%{`ImzenVK?<8;!a@H2F)rRCMGuqXN|IwMels_G5 z-w@F9(-HVRJ&41^93|>2Yb5vqdIkI039+W0KQ6%hDzKGRdw@(w?te<+)~SwGZoy07 zJ|6s8bQ%ns@(itN$KL1UI~XRC?Xbzq`;`dd1s1dj(N2whI<=a&G&zu^BcKqjyk0rV z-)q`vZ$*IAPlz46prr)??mD1nSJ1_$T5{;!19#WG^U)n0XnM{`<%U|MwSgZXy|lAUF)8j<6VERecskf1-)9zbc?jo@ZS-!V#3hH-{W= zZNO-!$*xvgPi&;mmx=ea8m6g)mBKzbK2<+*WGNOJjt$%F32uV>{wo@FhqXlcb8@O? zCmt}ZyEMu9-`7JN1hA+tjnXIt1DQET)7-MT!xn2b;)5Rscls2tdy8Y}SY)}(QaWSk z04xz@5Mk5hWhXPI>+5SbPtP}ee8fN?aISxIKORrApM79?(De{PJ+h^#4E+p++I%aA zDt)oHXLWIL**`c~Nw9JaqNAh39fU?S_`*4TBf>a>5;n}x|EebL4$pbJ>jfbis|DJU zA$X%i0+J&tF>k&){ZlgJa0dD-?}>X_tiLY`+qQW)VYN)vsKw2yV7G#6soSF0avJF5 z&PGii^;R`QiH(iT@&GkVj9IC`x0hiTz3^v?QgvPH$X?Cmr(xdr2U6-Zss*>(kCT_%bi`^ldR}$bp^i>Y{*aw$e~*BS)dx|%xy={RX&beDP2dwz zSXfwRG7`@?P{#M$qy><6#Px~QJNbxWWKrSa$A3GEyN4{Zq{t6t*BH`|yES7=$bUBTvYin4a@y|q zyhttF1xKx%&WM^Elv#~9XbH3a*HIr@`Q2g$?4`(UgBRRZAAOZdE$r~+;(Joe0(z-uN+`&TWAs(0flgi(=tLSfbWKPCNU9_ zHADCilEu`p6(SJVin-YxL~$u`ps@e}T+!M&&YVkEt>tQhS42QTt35Sqk{36J6_)SA z)A61y-KN+3V6HXigpyc?j}|*?QZbplQ(q>< z!x6@~w9V8#{9OJqJU#RK%G(g<16TJK^gjGrxEm1G#SW%xd1TISt4*lV4e#YLC*^?= zEd+GN()H*yGeqlFa9!UXed~Z;!h`Crx2`MBjJ6G|zjedY(djux?!SKb5VUwX$$amj z`2}NlF6#W=uRzOY3Z`-lBe4%q#g`Ptf=AmXkY*D$s$QRyYir*Hke z9j7jMc5}(9{?A)S1+EvLXZxytW~DPHpB!H@FQ?0bTNRq}vIp}!Dx{LvUm-_z;9zHxPP@E;sj-yD7#p`9preNG~I`1;|F44kYgTy=T1*j~kv zB^Y~>=b74u$YJ}RTmX|S5#b&g)Rj_+AG%wM-*$r7tDdLbrt`34EZmkJ-T~!N4@$fG zs}hp0aEw`x>Jl7I6Hh5M^c_asy1ozPbgJcb#X(;ABF33`F^XAfiNmlbs)Qn8#vZJe ze)G@naQhp1vIH;s^Z=?<@r@qsg^q8Xw}|G!uJDFe=RKX6P$3*=a}|@4l_c>Z!XqR= zmH@daB#3msfX&^epKI5o7^4XGTM@z<TBDmQB#vQ77+FI2ajOp!IYG`3@yz zM9nR)EUg_p-43}Oxq{Ge&=9t+k6GjVj${Nz4uZ-D35V?LB+n+fz2OopaJN=0@%9*+ z?xy$!M&D^`e@l7Vc>+3R>Mo32ZgKbWZ6M@*&Y&}emApAX$0ZY-2gc5CzN1rBHp-Lr zut4ZoND00VgVrk4PxGzzQh8{PLuWr{=h(a-jD~g3CNP8F_k<20y88wdA9N-oZ{03} z^F@!(ap53|SUj9gV5=Puk@}#@M7|Al-2sfn#iQ{7f_@8jZnAQ6(rQ6_Mw z_q9{bl?V4dg{Q=BpNldlUA)f2MOUcsL!)`y^Q=PE7UbtYAtu)5K zzC;DR$o%SrEe!*C*|)sSfB+RA`s~?Bn`6ZnznMe>IPi`CzJ~Wcn5Qw#w9TG0?N9IwPZ+ z@UywUzx;^XFd0UOv$Gii{iOLhO3%uI!up13OjqB=C(7*$arK|@<~{kDp+u#h+*76f zt6s}3LynZo4Wx5|!Z2FDV}3yg9}j$huwBj7m7A4bdiNk-&smlCPyfn6@Iy&rY6G`& z{(3sDvXoBh0bftKdP@`n!8Fpx z?LV|7a~HwUl_M8%mt8A7KwfHw7(^8FOHs$m5a)1X&Fk<(*-44&IE~8j)m+9ZNeGMa zUp(%^)}rAi7WnV;$S5~Dmg!(duLRWbM^9_nES5=k&!h7-lJz!xegZt^cgmkU( zkk(xZ=6$lFbGT*B!pcZ#$A$NawsZ1x(8Gnt9RGnls=S;o@S5Ysr}Hp{N_#fRNJr|N z#NIgRjsL`Xi5SvQwBF^3B4;)$`vxhyf0SI+P1goR`ae`25BW`7qVTe{Pi65qd8a|Y z3vQC%!Q4EBZv=fqkWHCRSNX-uk*@Rh=Vp;d`W}`0ynws~3Zy98en>VTDC(n^_Wb^W zH6?w!JobN8htS(^63ULS2r{X)OZAitb$-l(iFzNxH)acjHUy}Z8&*U|14drokW49% z6vy7HnrLWsqqp4*)|4R>o&JQiz@IffkHT|cmOv6|SrW&+`ogkb6=%sA} z-F=rl?5Mz74NByc!YmHPM4%5$)lThsG;9n_Cn=pZPSuoMCD14c3rsfcg7%MbOapgZ zhW9NV_)_6CT)O&R;Z4^HG6o@Xii%VlsYEy;G+zS50kw*B$b}`p#)=;4j2>gsuOOX# zHiueX+W-TXpx)2Wre?{#-6-TB(-*cUfgch4@*U|*zVN@D=Z3u6IUNf`*aS90N&7Br z;lv#>hs6|+9sN`#b6@_XE=4L9erE4lMW$>Y4nNWh`mt54ElRVML_T(^%ToOLFQX{qM0}Kn3Ju>Pb#N8WKLz6i2WNCDil<{N$ue zSk^l)t`F%p%#^GWbKz}27&eeLzIkhoYg!yKjyUw5k&CEX_+>^UOWWPO9fgmKDKY`% zQBS5bcYs@(?-BCgsXnr-qG!MsgT_K8!NHDZpf6c6@VTu2sh{gqB&L1Qj6}L~hlGbr zjBpkex=@r@$QTk-vowDkjCZWLQ}aG_N}*AstU> zxQBiTT1#|}CjiT-mHBitvcS<@*C$UD_cXDXxVwW5U#`lt%MMRsfJLxQZ%#Cnni5{4 z_@)$W5K!#2NSFalc_-z0ZHl29g0Xdax1WnQw8nv_ z5#I~>;0a7P7)n$K%VNq@K6w$9je9O>5l{SP$MC7#w(NSZ8Uq<3q)&_b3tKR@aMQl7 z2E-7V_bgHv7l&2#<;WSiq@oDL(KmRZgn?u8j=%-ev#N7+`3k)^>l15IY*7a^rF7OF z0}qdGA=8Q;++KsNjLkP>@p_OYngP~ryTgmd8q&`VULn?)XrON~RNC1@iG+a(^q~oE zH|1W_bfdxnk=4#_Sls+DX=yjmy71`I(nI}$1;$U)*G#?LTQR+Z(vL)hOvz4INmjSt z4RpWXV3@ycZ4ix~oBcSLt(paYM2AP37}9@l$K4|(mD^9mc32Kh!A8f$7jxvu3qY~8 zQ(X?(rvmhC1hKkQ*?k4>r|hvOcsU?(;dyj_z>lV8`A~mku*7b|iMo#DeTnlnckJoz ztSrjRl^3R>$@oGxWBB*G!i5(g4aMfZ@L~;0n)q}g_rz7`MKz~IwR3m2q&mF`eQR5$ z?iVEozWC$FmmP&z{(!EA zo1!X(p=C!1?IR3d`vdF5Hlgn48FE8kEnfLvAn2LDk`;Gai6s~JCdFfuX%t`N}xw>KXuAw!_drr3UbxY2ymmuMQY?j5|n7$YIF)4xbpOA6oe z^QS8P4cvn+rN?-BzYw>GjN?d-Bmy6slv`&zIyFtmi?Q3)J#K%??@tf z;Lb?c@fXeVLe5vvIsIYTzOale3SEa^KL@$E^S@3|_hn2BAXA1?C%7@ax^~lvO4)_Zq+%lZ7J{?* zm}YHfA#Z_^uHeaZeUUx>&lJa+ck4Z#?~XN#YB)0nb=HHAlYUV)5Lt1CFiKAE&G@ZY zWqIB=j3NbGHVo1{X{n-nPUV-o-!TG$1TVw*l_LnH4J%DU6Wp0~V!Gl_ z!H=hDShN8l?*PCMD6v6V0=X9qyM2>+Sy8oFAj1JWp0&nH!GJ)+P>1|NUB4xvi^j1@ zC%EZr3Wb5Le*g=(cDEw0P=d|8>IO)z`j7pHP>|xfeVqTZZ$TyIU6?tSu zcm)KBHup@ckAJGfFV=sR9PZtm8O|8G347r4UfJo7e(s{BdK)Vd`D5A zgN-l)CWb&)W>cBUTY;;fo&9)Q-ZXN+e0$AD$i^W#Fqd zkGwn-N6byOcFv4ot_nP17{XFv;5zQrXugAtChkTC^ld>VQQSfGDlz~i^G97uwN+`ml=n(hX)2r$e$RBIz$M3>v~ywa0`*`>p|&2AEHC` zSB7tb>SAo82AV}u%z&ssb);B&1x{P#I2B6d!{25s>UjSd1Z_|c!3P5UI}*%x(dm_G zpZ~Hc`*;gb3=5T8FKj4hc&C3MX0QZ7In3I6{|93Y;9qLS>tpL|W*o}yyJR)tS)yg} z%JC))a^tAUF3j(newHM zT#G~;AfG7$UueZ=1pYyYK>>menZm{{(=oaU3)v6j&9 z`KKbb9B~LQ>8@PQ$PJ0>(xoF+QYR1n=+r|%)mK+ryEoGU*I6vxANq*Lr2Wy6a-Z_i zpEj|EY}6&~yQrQ|9yFa!crF?NK~bhIZ`cpmdJh6<@&;z>{WQimDbW5eNfX_?OySzr zLpvnqNaWM-hP9c4ZcW=iEPJ2P%;s)f^We}6|6E8^5bW1RQSi8RbZ$2fsG?c0>pIWU zluSIsWC>}xu0UQz1xqoRwydjbvv$aU=E3?tXWm#XAW*k08@xR3q#Xyr#5L#HhK#io zY;HovT)w^10(t{{O3f$r4a^36BhagAYR)X6p(6jc>C`!OypG_1NEn>0iy$Z$OhEeG z7eQeu4Q?U_j@FpVW6L&U@hk5t#R~7Tnh)`}K#@Og%GAIo`uNH#0&!}3lh-3iW8>rf zlaq-vGg{D>7iGM_G%g9~>pJ|s9$DVuqaMUIOu}voNy*1?*G))kYwNen%%#g-9HFii z6FcM5v%C9g z7Ghovounyv$$SHUg)a1+3uubKgoK2I7tE33U$!06qy9sN#yoqEf%pSPi8-W9cJGI0 z%WrKG$+8Ptgo1GF@nBu5ij5Gyn8ADBSd-ykC2Ae9(9%+-)*UR1=|Fu+23HeWyX27w zr_PS{UK83}LnAlorpnHC;Xt`*aQC{@W|NqNQ}=hS{v`w?q;*__QGA9hULKV9zl^`} zD8>8sCYZII^J8Pbax}N~>jVnxP<~~(q}%^m?e@QX7d_ZK1w_z}BUHt#f)ZYxPLL~J z?CS@c`gdR|RFGWDXbQrr^klh!!@k;Gu@>8LS>C)+1Yd)g5w6hvridm9UFJJ@@VNSs zg@Ka@ybewAwJ`AD;lBkiLYMfRk7fkDHBhwD+O@;6r0(vcG=egPou2>HHl_V5LOL%S zQwQDDOwlBxrR6l#L{Yms2K`xYOX{;6m>y!%y>S%BQFy2*5Q!Lt$KaIA_1ljpIAAnBsc&b(Gn^aok@;K7G#u2MrPUT1JLJG}Oy`GcejvAq0=jRl|g z18X7(PaGJEsKvj~5$AYBX@Fi*wFCxe>G*12fZB+`lm3qxf9B4~w>D|$ZLj{KYynKV zLpsx4&W{T|SRsQzp!Celn%Yp|vH1`=IaGv+(bF4ok=N0gOF=_=AO*ruGJK5(FIr9i z`){Xr`6$0B=(fkN?zYaL&w*#->n|rYxFZ|pC->fH50&!?LsE|YZ3!M7`ow0Ni7AyFZI>7M|@jWuOCc+~e5 zAz|S=a;IzAX^Wzg5^KZj?sYJU&(Cbu#9Pk`hHyeU;DS{|!56DdeB{XJaWe@O>!Zs{ z&EVk9)#Kh7N^^t^Ng*jLY!o2+wqjbOAl9XGVyKze-f@QP}&y#8IyurZw zu`UY@#g{_veMlXHXENq-&Zn7d^dW*7F_(Y-H#_hC-?Z8P?`?d&$w{0i%{q7Yc4em* z(<&@<%IT%R4VKI~7v)vY0w(45vWo}i%A5b(%FG|?2Cl%5l+MuNg~7Q)Z}!s3vyVz# z%z>(+mns?NYWEqXsl%n%-75dLL~Qn|xk=XW%H)K;Tlo}l(?$}JB)R^`RjK(c{D**Y zGTbTFtKUf}`Qiut#ueq_9HoTwC+&jn|fjScgvkN^dhJc@{@~CA7mkdxEyROsMM~)R( z01f`WyY7N%yY7wQ|H^`oT{1FIR2RQt2?DG>BqsG?D8Aw-qwi#57DJWD`|Z@#%{6WWRSFpw{k)#e$d5 zJhX<{O*Uno;S{oCFgmB`umbp*!ylGBS5L8bGB6oP#i*l-@=q^-t zOIc5y#{G|O0uI%07~OSB=gON^1PMYc=&K7X9d z>8Vl>%1l#7e6Ohkn;Jn&6I-ChjN1_q0Y##WBCNba6`W10RO9dtT>6U(AJPp1#X(HF z`YBsp#Ah-(syFgdqz>F1Z#2SUIet#|x5o2`m~Q8k8V>PyI+c?R|$vge-y}#bSJ$nz<%)-npZ4$SQ zi2?MU#sI9&MO%wAw?9Zkm!N-dmQ9Wf&Q8zTNC8232%m)9Y^M%RES~4WXWO+qe^Ee{ zoEWaUI?QIjQlTvMx7}QQh-ctm2-vb<=QyJ+vo>`JAdWDqHqmHKBYNFDe030qu%b4* zyKm)yQuRIx1CxFA zk^*)PuEbZ@E{+*`I7mL1h_BG8*UhbUI0SWxXz|?Ryk$D335waB;|xC0ig>)Uw%C_$ z2czw*3-=>OZKWjO3#5WadqQiPrqhlodG47fo82EK@m=K+*#ou=j|%+^l@?vEhwBcZ zhsfo@D&3i1Z$xHE;=7xsBNSa=dPWu=t3McAn0S3KAqgd9`Qn@G)AixEYyI9%9+xso za4a6Y_$=dGeQU;c57FGcAvQ}Dk}6SGcV(?!c081(Ad8aWXqeXD_nm5Ew)81Wa@h~MJ9#$BU@2v&d5kBe%d~>XoczM-BvTxpgF$`E{a0F%2|E*D#*q!#Smem&Y&n7bHxSf0 zGn>}Dw%{sh?AK|jCNlLier?Ph$$ty&^g^#TrVIR%4AHqmcqnWs)@;KTTLkK;S@+jP z$N>N=@r~}7fx<3=(GE9mPBX0?MKuSH8|a=D+@Zca%&40b1zmAN4KsDGkntk^GUK_C0f7&{bAG`Qz8&~4*94c& z?BJ%TYb8Q$ZbD~{jQ()z|0#CVeXk_#%O}u9Bfxan=^LvAGpz?mp}a~J*U)&3g^z80 zX2Tb1mR4%#{A{5^5MLE`b<8(r+P>No0ie9!_Xz-MQVlB_&r?g?%yc4QfBBNjvcu zQX7!oa5A}3MQ=t-;VWVL?~~Fp`lJ3SXFlCoNo5N-bGg+&7j3*I@NjPpSkCkaKbfRP$-Vd z7)b$zRrNfpk@nUry?|*uu20K~t5nqbGfh+q{yqu(cJMvFRyw@Mn--qHD7j2*B3vaK z7+OH8d{Wv~jmC2JbNd#8k4t_#C)4+k)q~2!D<74iG?vrS6+@-eaLG3mGMvD*RHQcX z{*w=AG#>JBJo-lxc79}zdq2t+S8h5RINtl|_Gq)P3x8!n@ZsT&$ZEMOAvw7IcQ`cz zD%F?KcN#e5FM%fl#yQy27!A@CxDi?z89r6)kgK9=`9EI(N|kqzc&DS&(_onz_zvYk z(i_pl)Re<<7cQLvA+bwA{pg6riOoIX!0XIYik%7dy6GPNOi-=ylj=CfS_k<}y& zk*Nd7`>q|6(6>Xt?8&6I-~1aoFQTAmN}u16M&gv5RYaz8GeXzv0}(C8`H z#y8aJ)u!6&J7R3(EM^1_%r#e?y2v>o4&1Foa|Cs9lML2)-E_I_}wcQHNlsB zci~kn%M~2Ru(v>5>C}&=N9Zqe_jK#tDKlx@|3KlMg533b&dfTD_NN$&%1~IkX73U0dgsHrJ(;?90&U$ zpraG^8ZA4<{@TZNt?x*L%n6*f#$PrS|5e#HxnZ^QfD~CVtA3#X(hX60dfAkd+3sIt z2zs8hM6?cnBl;PCzkJSSo(|*!Je7EU_i`3Z6}e$R%K_Gp7o;#Z|9tO{w4WjJfA(a) zEAfigT$BuG!9i0gi1_tbznq&oqs-WC%jsWEqx;Cs>et8sVI}oE<1Uea25P5Z5IE(* zmrNdVQW_qGquC3hdLUOzOGIyvj?A>0$F*rCPHUGp?o1b`;ckZi3Rc zb2hr`7yNVn<`)3$4c6vu@Sue@+=iaXxsIzR2c8gfUWKDwbSn!GEl7#gPO??m?AOligF=|{J z3q!k|1Fh9Sn?>vX_*J&UVSm3_9dhv0JAx*%`AnEZJX5>Kh6q(z9Wt>@?(a&S>7sld z%(Foi{o*Ug!|XG8`JChP0YAH2rtMVZ{p9I&vHv#`C;!J#=s1b5-aF@TS^C?RoTD=a zxE$#LZR`*Zg;KvMKq3`&^@noRm;Qd``$EC998oY%`r%-NeWRRn@ZRB7);KsB`dqYn8#n(EL(Qj4Pk&IA5Q!3*o?9|RB02Q)3y}G+a-J1^S9$j6K2Gsa- zMn8PDDnt6zvje>HWJytJkk3hDQxThAByw_bz?6LqXPIw42ORPXl!#X!39S~@_fA7q%U%PnbUGKk^WKIR+fNCZmtdY z-9?;RK2a`!G+c}W+pTf*K&}4SsNcwy9D?+aXI`~6s7G$FmCv60s2&{K)YdYohKWmf z`TVVo5hs@|f;f(R&eaAr0>nkO%-%^JOxZ%hdC+}F4Ai1B^x=x$H|P$5AiVFc8{$oPy&&!wB6DtPclK9+BpfMMs7W;4(f~{1WH4|F z62^7)Zpkd-4e>t@h9Tz8U8#jW$@u)|^Qukgw}O(`mwJ{N@>kfe=+XX8=Gg18!ZtVE zboDInQKQig6Wu#<;US0=5Xm2-`R%&Hb4r!vhTML3nhQWOnS#N0*_&Y(f4J^~bKW&f zlhYS{_=VX^;Qe)T@F|i%-|oX9#XUoiSL5ohS6GM*sYpE}mT#enR4Carn@*$TqmfC4 z!PYXi$VnldOTCTNm992QP#_Ww6Ja6T4HNvO5HUho{?HpgJ@(6>HS^o>&&}oKpQo=HLBEH+2m> z*jMSv#{N$dU4)i(-<~ei;fSv0qUs&Ps@-hfY`W(0DDPV?2-Ed3)+tUh0u-6iP4JUA z^1@MOv=>5v(wNxL$VX849z{Hi`e=Ba5tHQ_XcBHJT%Cq*Sk2*0TK)?3>Hd#mvpixm zis&XOiN;v_;_7x>!JSmhyFsCn**flHLryVxk(+iB2O1Uc&MVXlg3V0nTt-Yw_Hw{4 zeu5G(m_I%>wS!c0@(3G{WVYb=$U}FdtX_1r;$8lPZSP=v9x?TbXOlHgQcstMt+ri^ z)(sF|k0i{5_%1s68lQV006NjS&u#p=Yc`1{XlOduiWXu&I*Ku_8}wvj^w>FlYP+b8 z^37M?=sJScboHHXxilHHu-w?VJbhX1!ry__Tn}n1Q0Q8&1lOZ&vFBX7S<3DmWNJ@b zZlotCZ!Ow=Yv;@;7#xZ*ZGOy*k=v)LRkU9VPIH=T^xj6>Uu|JtT_q`KwwaLzgR!x& zT;ASDyIz?xs%c)82@Lv|*%}t!y4Dc%ak}pvww>iJ$K#DgWu}?h$fnB<+r|mK_|yDP?N$%4WE=)#KSFt zHZhqq0Wzt~VJ2Nu+Y<6TUIx>SDLm9#qg)9tNu`tI5s*)NjhGGf%H^8}*uVX5=2ljb z@v#DYm(v#i2qxo~bQMC@zj)pic`IB@&&{W^pRO?!VeS@|sTziEa*9EyXUQx~kb7$) zEp8#*_K{@^-ULN2FE4AP2!Re<@6VQErY=bfi3mlxcvLw3YLTYb&@poi#yQ%jT4cJJ z4%|77faJt&aei+vH^(KN>Xfjhhmu?Sv~UPZHHgw8u!i6U+XMUI+e+`}(<&0E^6jZg-LNnCbUXvTAfsTy9jVR4f?EH8;Mf`sz1 z7dz(qo$24*%avV=)M-GP!#T2d%4l+ys?AQ_Ec1S$TCq)y=L?aHc}=p=Fd7mLaIfut zNudiEZ#DYPG2;HiMVR|nzTo@Mg0cqL^=}n_BoZvGg`Y*8DTMTi_^fdCl^z2#N%WLF z#^SPZlJzd12=$H0gEC3lvd{Z_nRNAX1c1a+@w(iPDZPqZG(&Rcd#cwC&HM3E=91CZ z)It?-{^TnlUOt`O9jmFpFKN60gTbMVUl`m6vm|k%sn&mFv&WH>s+&@ddK&aVzr4n;Guu!FLd3iii zwL`yLXySc-sb{`%PyT&RBUYi-e~xfq1As}?SKaX8@i0Dk_lUF!@*&SzA4il z6#*I-2IM`!lHr+KmGb2q-7aqy7Mbmy(@TYJK2s#iT&=`9cK!NOrAiq*rw3QcS@5>8 zU6TaOR?c$@kfgfY`=tmLe#l^Sc5YOEI-jbua_6nB(LcJKboMP=Y2k~_q{|?zN~yB( zva#(^thoxhl~7g1*RSFb&-!IkDvbi@XAkt9`6l>wxT29WHW*DzO-xMe^>`kkShBY+ z*RpqFCiuc<^hW)iOl0CERM3|1AMHIqd(bm5qzU_aWpssyy)cx7a1r{FW)}YAe}ZtB z55Gn|&7M3H&UiGz+a-2@!Yda)FO$HPQIV%k)=Z)3D*?}tOx(@~Ew%yA`Wwrdt|0L7 zl<~V822|Et2kN8D*zmXLDW+_vgtW4@-f-aOmDN@*9di5~$zv=gM=U!=R0XpU1fId; zT=5bvOU-lEtu{dIf~&&!yM51=e2PZq5mtNFxV3`oNWor^=g#fpbt(7R88JnG=iX5N zr8m*Vk?>wOu8oI5_Td<*B7_tR#7hoL-ft}2T5Ld_6*Ili7LZ5EO@_-utD;j$eEpn)fSz{@&A?Y$&@V)xD1x!mITe(Ss<*J0{_B>LQ^c13 zUCP?iArQGZ-^Q~a?txyUWBRG^+I`&ICGVk>>+mGnCo&f*lTMuVjq<6NdzU>)^>zPpL00T3+jp4cVOA ziJm(dy0`s=ZyzV+|SJl4(NM!Q=1qZr*)GUJ=PjSVB+!JIbd8t2D2cJ%3bK)!%f z_-ouN>bZzv4!Mb}*&j(GM0=`uoh(wDg;Q1Xj!@l>^NbzTx*2k_7S`#1~ zm2xbd<{jOY>&oAK_7BKj%t+=7LwBi4uS0ODJbr?|kcnKpcp4Bd&A!8}yI6K~K&Xv& z`C2eQkhD9^m*?C}(#;oGbhAgDkd_pEllE6;I}e_MbSC}a zHKwf*eyg^3d~4Ii#d2ra&O}nGNp@>{%=7hRa+c}KzFpF4bzl_Hj&-fGpHZtA-0-Sw zKg-a;bq5=ciG^SJ@MOhdG)sLHm?ADNPSwkjXEUxZ|((68a3`-G!;g4Am9HU}LPla5ps^?d%> zwaDWYz7OGkr{F!?bXm&jerQE=_qlxVe;U`j{Hb!@yX6^JhcCv*T$RLt-L7WSr<~YADZGY!c3xFXM0blY0LY>z9dLp$N54;$reW zK>y9Nutk{t0V4mX0w4mgRN*@}_wBn`vs}@P@#y{FD#~q>*~TQh;0Dt$L#eGATo#XD{QsmHw=JRUUkwN)COGImRN%8nq$K{It9h(WcAF2NTaxLD6uM|LlFd z>^qwd+1kp1X}m|e*?tY06;pYiWF^Go4`pi8`{w<3@Se$|snC)WnXjEvo;^hqWhP>} zgnM*iU!n`n+4G~}E+6rBMoi)?JQl`&>j?d%{+Nq1q+99~-ycs%@71dvQzWC#% zM8jZR@IQ@jU8Ua;!rAid8xOOhCsh?Z*#=xYHxdJ}6iod@xj3=W@&(YMV>Y`0Mb)Ya zi@q!@Q;Xi*Oa8k&OBDn8}H!4JxOqzLunt?<4i}K(YL$q2iK-TC6$$k2aDorutV_(iZBPAgwsd za@H*=OsPc{VvM(UMrno$9Bxa$4^p(Ec)9p}^!S6Flf6Yt)4QBX$+PK5Q}?*x;O2Jt zE9oO2Vf0#1wT|BaD76*j=7^Oj+b%5x;CV$vUAUg{HXmsU6N?#L(l}*{2*@LH$}f~e zo*qP}^e|S7B;~El|Me)k+62BFAbgGqu zxN~~^RYw(9%QgSbROvcw{do@L)${zYiCxUNJlGslQYtAal3yUQa3o*Py*C%7fLc^NMGP_Xynn)p0lI`om;ZR47KpHI3BN>cx^yCd2Wg$vR0@`94 zZ1kH)w0f8B>~hQ!)IG^<1f=pO-x9Udh8BGVLnbl1)%YvbUo*fH`Baz7^{>IM#S&~{ z3J-7`Pjbq{>UOF)XYVdAFB3+xF6PrGF9-0Fk32;{m1hpW_h@vG?Sv@ZVWts$T9&3Q zW@oDov(guSPaU?}79JiE?78y@Ves=_d{WZK&CSj6GxOe^DnlrzqH4n#;)?x`iKBiu z7D~w%DdaMlSy^@U^`B{I!cR}FghAI|3Xbw>wy59WjvhxSnelLwhzYU|5j51s6}xXG zeq6LSX?GWl8P2{@NKIYASj^9jrH-g5kNSu0Yul5P1Z?t3PG z1EA`mp;rPZXsBymwYe#(eDUXRjV7IN5)E)totQuFa7o6D@Ew;5hMH}Sz1IzMWx5FM~R6v z9^Qp)Mb`({6m|9@r%L~Wp<)r^Gm^5t{zmyP&0|CI7XkOnM2LFf+3rwO-bfVS>lX## z2W~iA6%nG@;}KoXvwh_-C#k?w5*)s5HQGZ;6GIB5*_xOdpKA` z#&n*YrCMjhLI8ye5<$=ZfvNZOlZ4=3SXC;KiWm}@^?ytMmmhcar-v*a5?s~i@f69C z?IkN#PDowWkGsXxm`FMyKYTV@=Nx<`Xi@#YWaCRpQ(%HrFnJhoc0BIF63c6YmXdCKz`vSowSQiigDU>jRkckS(Ruh2oW8bOGAa--qalAl*3pz`0?%bF8J`YmIFNUf|uCH(Ie`XMX4{CNyqB21qHx3y* z?pd6Sc1>G-NkWs45uZ(^7$lilQ~C#;ngmX2L@Bd;UO8`8`rMV3m11{AS@oxFQ=4DX@ZG2r&-%d^{)MXBmn~LIX3-gOdMS-?Yi@ z=XH7C4-hYb?@o|u!^+;5@Kt}kOW7LlRF&)!dJc(oyoB<1#o_E30*$nAn2ocR&&+$N zIS5gGQu-Y-PEf`F4RvZBKJ1J}s*i;@UV(`Pf_H!vXW*OIO-8HcsC2{MMY@Fa4y|(I zN3kmvz{0TpZn;LGfjuq}L0j^E9;bUp83C~cCG@_g`mT|6|FUSI5M7cPM-DN!%`_?@ zd!fn-kIk}!f|CIe;1hWShd;K{Z6~}#4TJpRtZ%!ZKKpd^h~vmTnrkotlP`2^%UWk? zAnyz+0J2c_t0n>bUR2AhhRH-T{s%f1XHx!&pd6y9PpA0WAKB%~6(DM@E|dyp{Zbi0 zQP)+OZG5y2i+Y;(b?WN)rmTX^dQisJi{~dOYy4==E1 zeKKHKf!Rd9l$f#HdR1qCu=)VomnPV*{qJApnSBV&gFPC{4#89+lV(+1^F-V;m%NHRUDJ_h&-z-GbO7^R@kb>$kSqN68?nfcbfKD6pS#3&5Q- z9QwoE*ZL0xeTNen#J256+1{m!LUy-jhWMv|=rTE)is^+6qBk<_7n$K^w|YXpc$+o@ zEiAEmRd?yg4zPd^5e8u$y!JK)h~OoSE6WAn zk^!vTL&>0T@vP9jqXQzOfa-U(_%iv}_#@*Jt?0y*kfti3Z`pam=iNE=w%3uFJhm~6+c!?lbwSb$;JwBt zxrFQqI}@gU8h-AnkgdRZe;BLS_ZB(haPnKpFS>Mo&gsIXcVdo4`4Il# zPsEr3uH;Ks#@0v0=8F3#anfp8Vx7Gz<5LhO(@^dv!PoRRfGiIMj5MCYcbLE)7fwz= zV@mOP;Kv;B-@b4fsIV$EO%4ercF}jQTQkd}!7Zr%ovVig)`vSx@WcMZtpDcggh`TU zDvR7hf@sE^|B>QdDg``*G+b^BjgCIfT4dbPqvmdcQXK>-+Uu+fqvVdJwY0wz&wteO z{vJmj-Khk15Fs_p+XQ>dcz~oLARoI#9GbpPEnQSJ*g`W%4&4X+$6?W-Q!3bXRS@`v zgmf(lk*dnDn=F7?zs=!b^dnTYUTYtIHw{rGED{n@Eb9(|rcsylhLl2q^U)-fgoFg< zTmd3hcJ?VQ1rt;BWkGRopaOtHOpbe)j~k^0AF6gY%7z_}Svoo8>@y1#%4=J_i3~fc z3nlg(VeCj;EtNV7+k>Y_!k)<+bzc2s8d~X@eHzyMzBw`+jF`1@RLl>Lwnu_oI|c>@ z*xcN0;tqkQ?=M0^!!qr;c3a-8IxxH*lO7T;(`93A5QKvVk}gg~!v|S^f>J$LCEUBoOsI~G^)o~-PE0KrN#ktv zOBv+{W(8u?*}Xw_WOngL|E<{AyF*g_7?m3wE}JVf=xHxla7voDJ&vZ$mP$Qc*22D4 zzXQuG24K&z5BB@5!B**iCv zfP&AQyO7SZ$|i|8f3SQWJy(yZiTB9VW5<5nJa$KMbaLF>KHAC;IER7J`7%e z&Sf6ukTm}z%pn<>h5S&&(6E}gR($d!T~9D?tL`PJo0(;jnBjytXAEDltoSHYQ+WHK zNNIa}yJythKt1N>ave4xvk~P_d%KGA^!*#K9RIjGyF>fs$XBc|M}O=x>ESGc2-yu} zyuD?P{{E!EUd$>Q7w5D&wHRZ0Bi*QmFKSX~Nhu1Uff50s(1{-Ns6+6v+8$p>`E!lD zm0u!Y_%-q|-jN=eeGpdcK&tEvUFa3y zHYGH~7wIQBO{byX4N>CM>XlYAl{2(rr9^T#wj<-^WUH6}2M8JP!?kOn`Zm(WC zCgHgD7!&pKA~4XglLr3J7r-haigSYt6KfxEp~Jis_-jTLryx*&tVr@~Ed$m>`Gk!2 zXgPdqb|KGn$bdOGFJ=p+;C#Wgsw(Q?0i&v7XZ;b@r9Msyjjle~p={QHqWhN$*&?p? zQck&CQrP*Zj+YYIz|WOrzzogCuc=3kxps4WsL26Cm7@$DKZ~f3&zc#MBJB)q=9`0) zdDVjGqJ*q%1djq^V;@X&87g`&FU)i24!F-y;Qk>M?es+KJ#P={kIzn`l^re#$tg=$ z*r0R-+(*29CwAd23umn{)M?{}Pxjz9a-H)Jzq|T-?*L%? z1O5a8idco|cxqO`Qa^n)nOv`=nh~^V8$*xgM>?nlB+GMORIlJ~1OD)$@8|9cW)ip; zfmjd5UA*?X(O+$u(q);NlACci?iz`ZIfjT^H_YH@WW&-C!P^WpGeqA7(a@UNmXl&6NdIeZKC;D1u~ByBmKqUT}p7 z7PTW5vgN|b?yg5EGryZunFmVBxMaq>uQOTtW7G*LhObo>h4vn}q)^6Z7XbVp=1Y%f zN^R_NRu*19iRv{nYIMX|kzcNVqzc0W6hc=p#_ot)dfSwYhBWHw_ctCUl;s$VPDUAJ zw(iyCZjHiG=ofrD?2!w-)d7%a!l!YITaJd>wY0)Zj?sRio*vXDNyDvsS_JcB)=nel z-4Cg+JKp2o+h$?t!~;i$pcuq(#eJCl#^Q3f76*jz?SLiE?p??W2Pf6z`W*h1P0Jonv}|3v>KtpI|LoEddo z%Qjwes19(JVILA9-_=uXB=k5_`KMyPL zvm2mOTMf0>??!>%SkA3^$?vNKbW%)Gc?kLnc&>Pu6gT{cNv$VHpnpR>%b|5iy){r%`c zH%$0ArVOW;dml{KTLQsOdj*Uhw4W#w2bqUqi;=tNx2dK zNot6%WHL$osrK}X0l)fa1tp30-PI2>q04{`7Ny?(qM55Qp!9Fp4%d`_>M9Hy5pH(To*puJ8Fh6$KZb_V@CWKr!pfI|;7J6$diD=! z+8NIM(D3?KuiMj{`_S#ypp8GwTsXzngj(uOUpV#H{UEfy49J*LvTNwVhIVp&vTC#) zC=r1!4U-nRlFF;4zz;~c0S4TJ9OGrFOT=cly!RKR30;uECK%ha+0B`OpHBSL-21-` zy{$CqSvB7-v_ofb!W0UIwy=LN{RQZeJVeo%hqF+H#XXF~?et}>thR>9pqXm_2wxUP zomjE{qohlbF`@hT+tG<1P|4MxbVwKr zup=lK?a37e~5UZ)BCSISn6|F$i(xvAc zKq7s0V)#Nn9SIj`R0tsw6Wf(vQ(v5@Xm6yUH?B6S*^0N)WheVrvBSeZ*S??9t~Jmf zpP0z_NtiqN$$YXgQwsh$4MomiM<5W7)xeaoV6Q-3A`u8-;ho;@Ef)KljK|BB&;>&< zz@C_2B^nQn*r!PQZBfIC5uw;q)T67zPASc2eU)CTBd3XPFO|awd-dRD|H>N0t_h7emP3_8r+B>`r(ZWo14 zJC(MOIy*qbT%&4Qu@!b|kejmeA)?MQN~L&7(f59C4V&e`i7P=_|3}BR`R1AX7SD#W zM|)3b-SV0!`_Cf4(L09E>qtWRW!_K9>}hO7gWq`#ewArq;s5QsfIkQ3epI2wIhK^n zkBE}s&$O}VO7|ix`q4$P0(Tl#`N0sr(hM9yyMV;Bc3oxTp#ixvyuf`)VKF&-dLNo! zc;`&BQ#Ii0&2|!&S_a9AW*hocKqy92)u93-D#`!d!1Xl)`|XT{jxOTCz6)x2Z#RT& z1{;58@Jw*%Xa45C^YH$Xp_JkKV0*XbII+ZAd}9HCzWV`ndFa=;GA7V^qtpv|v zAm3bbt=r@Vl_~DsX&a^%HF4qL=oZPV;>UXbC$DVacRb+@vLH>7U{YPvU;%G7{g(N+ zt~22Qqh=ewS!Nn%!MsZSI1J+#N;}e_w)Y)nm@42sO*kLLP#Fc~>#J>-d`2ZJ!oxUO;yST5a&fd>rPsAFbd0c&xjY`zS@A zC`rEE8PmVD=WJB2KnQSlZxMFw4xgnt+eUC(nD*h z%H1TJQ>5EdhG#(3zsk3Gn*he>K{j6mY>Z|W2=(4}J2lcg|10X`kni7doYN*N%#69V zQjoWDSNL-!Pj!oxcR582RG`*i_+pzYaa#^-Wr86@Q9CP*t1Sl+RLW**W7qI+HECdT z?+UbhKd2P+>JGCP#tj&}Ca2FJ15Jl=YR5qZv$^mWi`XAFI(-X+&{j7x+)3g2F|D^s zr}rt%;#>R1P@%xj|IQ=FQqYOT0c`w0x^?xfFH$^##|7_1xTfDFV%xhIQY|?h7T~x- z`Nm^{AR62c&Z*?SZ@*vO=T2f>)(#|=Kbn8|mH->Jhe^Gq8?do2KDjLB!Qda9xer$+ zcm!uCHEGivuQpuXLs33=F6??}z5;p}j{*^SUpaIHi=$3XrFPZHPUg)9^}{Ejx~CZS z*Yl}`cUOhBom&fJJL+ano*IreM!?>N?+S}u@s*4Nec{3p;;iRwyO@n%VF*}nhHZ8 zSJJx^lR>B>M8$;~U~x|8vm1=!>9!-jsZ$rEpHsuSrsg4)UQ>~k!tNiv314!`wSa=k zkxCB#cFVnhGCscK9}aq_L-4WB#2Y}O!;%UO8(Fbs+m@vUjpV0AGql1UIM6~%h77A2 z)2>N|%#+XYgp3{iu6H}A8Q0(RIk1+0pKdmh9BdqEHPdg%SpdG(VOg$(A*-1 zn)fu#FlF(7NX1eMS}lrc-#I>-9cUxTZ4<<#mMvtoE`K+F&Vz@(n5(IeZErAl54D|P zrIydmUcvB{8bhSN8*QdDdKl7LYS!weX3X&q=A@Faqa+owLVDJ0F#Sp*GvK*Ycnh%u zRM=as`t*@11G(lkC#IXcu*!b~31$O>dX0?W5a2MI{zmuOTgb>LP}B3LgIeD0egk^Y zISiNBUVR)fdWj`a3>p_}L>iS>Ik06)*)_cSA3 zWM9Ue3Uakq!EiQ5oHOe*S2VnQaxfq_gP{~oDT9e|QL zZ5>sBvC8J=c4A<5_Il6Sipq(jv$U+bXG|&F@H-}+y2`;5r-6QuE~zUfWb*!8ZZ$fL zE6L{;?ie(AkWG{4qyKTj6>XnSTo;HhxhDYPnk#EXkFmZwb*?}`YSabiZ>uAKJ_FG+ z>t?~ulkklo+j@NrE~D4~r|y6WY{kU4AdZNNN-W-R#t4LlE-Wmrx4bj^Oi5WIv#B7J z%F=6?az=-22+^X;e~lc3#^x-ZJeQtg*7KMc#~7Z_&EU4TGwBKeVx>m@CJToc5Rk?L zze?rwkY^>%&sSWT{DAbt1*wGar}$9rddV~_Bbf(4M3ga3;K_IYGkGM=2^);cW8?>k zUn7Ubg0@1G#VsvBmHuzwn6~5mzgVd9(^%WlZ9wdC0rb@WEFwk$;9QqRAU3E;S$?|h z>fqov0pdR+gnR_6=!FCUX0Kr=!eQ~3Au;U#vzPq;zZJY*%6}gH#U1^F9-@1PX!5Va z_tvv%sC@67?WS-}J6OL$-a)zqyPUtC3NL^PvpuA-52YY)AeDvv+b%0!yV{h9T;?2P z8+FQEQ~12u!-a!8=$PH8a;4le+ZjP~N!tI_7CU=Z>-_MA$nsM(*g`GgkmjLp;J5JC z|9Xd8g7#0h_{lljmuq=e(!I4g4B{0?**z2xl?eO~Q~UnmC=yJ zOWZd6Pn>6{hzsZbzsbHKO+h+(?q~@Pv?JnGhAm)(rd_#i{`tQ>D+Bw}VT=!HYNaqI zCyVxlpIdE$PNzvK-};mP%l-!wcw*^_9$QVNFv<_COU$~@NW6K4RaG%6PE2Z)89hmnUzlno{-fzw$QN&P<8L7 zx14&TN;=H?%e9YQxZbdgz#^LBkIoQD&v?;EJ05WW8oW^*Z6%*@E3mfkLuj)s^?H?p z;K$&Pw3wZ+wvysMEKTn*3UTSLEEoZ(kT}~zkRf!igv`W_q{+QWZOPvn|NeU9v2{=6 z1}^9wiHHxn(>lETyJ|~sN+d;}(EXRe2kT>sKMlAdzkIUw``6yBZ)aHXdsY4@Oaw$W@i1#>lWEKXKYglhQ!yo(gm!FfZ>O0zIeBK*Y8zu_=)Z&sP{HAw1(4@On-%1-|R;Q z;AQ&H|Oq@EY$B2bMUq%sw$nnD0cn_Na?XPI9c^zv5ZK6xKAW2Xp;i4) z7+qUWpuWL-LzglpB5I7c)uIyR)Gj;PMl+_6p8Lb4+=p!QIAChu+wrP-L)ghv9_*QxJdZVan^-Kgu-($7K6vUevMj zVm5)SmrQGg@EQ^g^Um8_u|>}ZBqj|J4t!0pCi z>5ktOcNGSz!f00Ou`O4x$G%{)B*jX|p~aRxB#8Zj)v*eYuiDZH>6*rWAuXxNwf6|a zKtCI63@7&jLdneG%(J*{RfUZKKNw*Wi?4#Cl z-RqYoALp%w@JcEc)Oa_CHIP3|J1wkE6jMFFPP&wq# zb2vN8UeFyc(3nj-g2DD>$tljpy%pr)jT=NKXY>_;$y+}&=3+pN zz}qe2%|D>xdHb;|d)c>x;B=Pvzfz;6L$(8Tyld-sY&(-(B8t@F*u;3`<9sTag-{WetxZmg_| zuk8;Ho(FLbmVF_*-})QeP08C_PWqA>PC=1Agn}TMR|Zkz&d%~p zaNLN29?o6Di=6q0(6b5&thws9TFCDYSa#-&n|pAqdjk^do9x%H=i{g2E&8?pY+FFE6ES{ksv#E^h`mx&Cus z_y_ILreGLOEGlQm`G;6EOi{jDk=?Po?Q`wpSMS$q=nX{?89F8P4@(^&LPEmX8l|vV zN>0pxyVh^=XCeq0?9AC5FKtC4yKl)D{jI3t7Pr=9Oadsj zp|BdP0EPCaK|nu^;z^Mv&O~>^I5cf8J|7@#RHv~ZQ54=KA_aFlE6of>-U_2`8z0O z1h5oKR{Ed z_sHcb6S3@mB4Jwue`#lTEQ|7!&k-TOYAhe`?5x1v@3HzERy2iK9|`SBZasn{B<$%R z<;vZ0EDLAB5>mE;8+H4O&fmHQ$r(_oPy2(z+vyygq5G_oO9u5YTzIDECsPy zDNxr1>7a;XCNr!7%=T!RW?fy}Q8Gl9n*2Kke;<4Bjl!yf_$4}bJH3z!3fKhviM z#iaXl>@&a^Qy$Jw`KVp5F&H(znMKKlc3`h?rZKdPE_rQmR1_+5&%?0XJpunulp#f! z*m&iizLq5TqX$2yis1M_#NM~GQRHJG`FhNMi)s(f6eR9-^ZgX9qo=RQv?Un?q-rof zd-cV6q;lacUWw`Z-E(Ux!tB|h?ksKLKr}EJ3<&|-cxO46Sdz33%{8RHlgH}8YTgt% z)fI=177I%*!rJ2WTk+h(5m4VHji=GKb%D-5;J6E3K1`h_)`kxPt~3;n;~qeMgv>`Mc&-oyce#;=PNzU za6=W5r&vHsf?%nYvSLZGiYh>34ygSZVHp!&H!LILV;A)81O;>Rcn=jc=%rtE0j?== z5d>BidGDdQZJu3+dq_PZCoWIVO|JJ*Cg@~DL&F$0Gq>aM^kcr3$+z(dIyi#$T3|Z6 z^8a!3Ut@@nzUDXi`qvR{O6SVFFQsK6gRC2_@`}N9fCrhe64hwYn})DM8a!DAc?Dw! z1^2r0!`F~5rekomjhMgQ`Dq4i||t4=8EUl8K(NGC3yHl?~IzABP|$>t}kk$(U{*z(&4;jD2yAAi$S{%0+ze`Pq-t#s(J(UV**P2_y?INEs(zfYVri@aSy4&ZG!kGfI6 zA-+LtV|s@re+n}VgbZL0RlF?m58%y5lt5?!yL~$1LqcCSTbYhWXK9%$2UhDyuE;p( zYMi8;NW?~aPnNybN7H`zXJTv25#gBR8a^;K(Vf-NDwXUXYiM^jBjjY{z#frNZClrboFHnk?7A@|U zAf;HbVnu_yySo&3cXvy$K!6+G-}>K=_shNOemINCNzP%;o;_#w^UM}iOBW!{*QaaK z_pqP@5q>acW!-SoanJ}P60`l%SxCi+@elY49NX%Ia(Kt#&?xqI!eN;O>X=zI`E3LY z3|u=Am*+a}NnEXS@cMRmNxn?>Z%s1T`%xwUx_Yfb6@a$hgCP+<&~~*sI!A?TC$TZN z12zBl4e9HU1Bi`{C91N*tTX)GbzjkNv|N{f;1@>sz8C4P zVzOUp*<9&P8q;~p>n_Xnrf($Oc@z_nbr`q#!gg+n@!r5;^sKILi}!o3_Qq@DES1Yy zlyTy6-XV+`Gdq#EfjcfY=@w7tUov<>@5okPCMIPdP!h(W*PI)0T%1hqlGqR zKcC-X*1UHan|sEPGbI=BBK3zJyhK%^>nE|T3nSxivUk|*9>z>|-X6)t>g3p{pP}t4 zJ8d3Sjc;n2e_pB*Y}AtWy+lOT?yp|1@mZ+I7xt^al~9+L4UhC^RQ$?K;qpkWznEKg zckPH4gI0O2{`URtA<}J*8XHP*wfht=wb=XEMsxjIh|=qK)SBb~PN==TTSlMndNw2D zd4FkweeJ%qeV(Mm;yqc5&+XZf525K~KbEMDxpNN2oN!|n8%KNpV3pP_PMH`9=jAi| zjzP@_>ZwRnmOZ(Ei!7k#14mu&2Wru=AL#i#Ow~RSS>F^`TvMBw+3UJiq$R3rGtu81 zpXHbAd@H16ip-u6_!mQ7x1BhJ_;|BXQT_An|M3NoD=q$O;|fD_#K4P+j}CL2;kdc* ze(syu{JfYW6oq*(mCi32E`dUA0w`$#j0 zlt#{z@#DUnp@T5e0=syIPhVD_f}8*~3P*W170vvB*1|9XlnWmdYGjf($-yj1C8}hW z%hT7PsR1VRw1u9z@-Zi#c{p2%`((tj!-rqSNTp zRR5T4qDU78tfuL=o39deFHVyLUPwk9{Z7qz7sw%6t1BR-{(5AS|InmrZ`b`XYz#yo zI~>7FxEA{@4Jvqf7mz`GvTKpH3bb428#*>yI%0+am{wP;Uih?C_u!rE$WK8@#2(B_ zk|=wg>8|Q1P76kK-YD)3}t3rDku=>=!kw02X$tU$I66jU+G0%trn891%@cbKWzd6|Gvwp|`#WZ8wIx zJh~ym_EPb_oHG=0mRT*NS}E=N>*W{!{NpdxD8rudnSwy_{eUYD?>5)%k?LZD$&>|v zlX7kpKTDPrb_Y7~636lq)l*3cHQ$({NFeA8I)k#<0+g@_ox1+5>x;Pm%{Z+#S_KNE{Au(~7+L4i$c?5W?dgBb+{nJ_ z$Mq(-((mWuG|6c}cb$3W zTizKSkXl3V!?g;pDR;SXQ-j!jI%JwU|cXrKR8D9 zBM^t*{s9x29<{uxitgRJ`0*^cx?9F#)vnhhlCx{J;WK30uNY|=bFynhP}KKueUNm4 zsG?Cu2DZN^-4qEyAAKDV`}PZMc(qznQ;!8hWm<~!a8e6JrS+&o|4i>MP>cU`=;x{u zYMxiqcm&ssW!3RX8)6~`e(vUH`vOTySXVLexOFX#X(J%Rxy5-BFNu)Qfq@q~t;73^ zpxI>8c@npuNPj48neVo*1m;OF;@76VgcO1ZVpuxTcZaf!uAI0kM0iqn4Bif0f_?@geBQBalktCNDNP$R5qzw!VXeUx*miG_ zl2}#0HC_U|AN)8roe8w3d_~iP=(b?M?42nzSZa{~pCu(z`&_VX%#6)EIf5JABHhLX zs{3yCsKggqeZehz(u*I}l!gfP8w4$O-X4jMZ&Wt<~x9lE2aw%R3xbkT* zv#>CTm$bevX8FJS8+|)gjg2Zz7n{uF)@l&~_d6T|_&JcqUT$Rrj}JM}{o^yie3ezT zKdP5w1u371q1LfB!;3iLjAULZn%C48a5kP&J?RX3X+q~1RrTh%Pft9gf7`oUZ}K^p zaQ+FY3Dw_7=kX_k^JbE6DDr=-;Qt88|FNF`efK|J^nZ-!|HDt---QGRMt zU0u&vzPCq8gn)Z&Ma$8vs;Y{KixWS2mLoYhv`zr_&;VVe*xQ`EyeiW^0%b!(LpewU zvLi9}Gc8rl$iqFIq&g8e8rFqAOF5aRnxLqpgrYVy8ciqHEx<(dY~lA;PjAX&lz;3T zSm~~LMmKx^L@638UW7;X;VPMQumhlIo`BhvXD#b{oG9!p97NYOK<14g z(!VLzCLqk4^k1#2-wo~#>$5H~{3G7ZO|Do}X=)fY=spl8@k)3%Q@t3{z>o582#@;e zt)l*`EQVBqp~g3Z*t2Wg;K0rjzx`Nde&fMD^)2Y7pMtt0s9g+c=Te=nXtkXboNn#c zaK8-&4T+1cbuF%+Q@^VBm=KsGe(o*CDkbzku8KswAWNL`-g`}rVZ_AbV#p)q_aYvzyfUs%bRkCfi|q@( z7nGD7C_e)OUHg@;ui^7LIrA!!bzK6k&;dRh^JVwK==x zYR)7VlblX%AfjM!_?AU+B$DTXPI_0Y5nx}~=%3ira4bP?+AH@S`BKMYnfyBqVCn6f zpMT|xOn|z!@QSwQ#{CvECLuAqv@KrNV(`&0&hz>}QA>-AoCMb3)$3$4@uH<2U76SC z*4c6*TS3FplI6v&>gMKDh>n?-CTOF)1Co_R7f4Gx*Hj<%l02v-3^y$;%}fBuBX{ul ze5GZu+;Sk6pBLC%w|{O&LWS<)+J3d*=idb+akN%d8CexqORnS(bS2 zLCMny35$wu9vyvjaNz0b>0urW<>6(*ACAnk;~uE29A5H<^=McQDHA&%Y{~78_$`6% z&}%_=?~|(oQAl3Ogxr2k0fzU$C!00m2D&TpBFg$V2@GDOwZ?yBA5_C1&%_0;@9hO6 zC9*9eb2L}cRji5z`9AfypPX*p8C1tt{yFR6soevhroV4%^KUg{rO=qkwDXVkDA*|P zZV-S<>`V|!cg3xa3%(y{{?w%R_H-30VP?sXh zoejf~_4CdNS4fbQuI?+O9FWUiK`#?0X9Uu$nwXgQm^=BLAtw%ixs#V&{bw-bJVk+( zyGcTFlO9(85mLepT_8Dp(rz%xhJUQnPWnnE5)JSp)X7dut?*1v(k~j$;4j zbuou=a1Mfydus-#Jz2WQ@$a)YTmdqOZYUKgz+=l?Q^ptbhDJP_+{12e>hhKR>CAAO z7rEFa%W3Kp|E^i44RP8ucNl30KC?d@*Hkl+s-Z{&1g z`hIwbY`&@Y_|t!xQzDN(;aLb1-}j&Px$?o`j64$Bq>K)?$~CD>ZS77)|m?9H2PF<=vV*P?V$-r-ov*NfG-Lo9S)P9U$Q4FLaaQX(l!<2_Y|^V zfPnhq^`(vwlK+fVHbD+iY+MaH?{_OjMK)T#kUtZODQ|2(nSQf<=iQ(IJ-e{2Znd7Z z^=>>6*k6Zp)gIj0%m4(6?Y(|o2{an*j-VWPLvzq)N+7+7%UDI$3Wt02*95;b zXxSGwH0{b@Wt07^Q?;$97kC@1!qq63ETn>kG-rWkn zvgHEoZgVGBfxMA{10gheI6XVuptK@r`R8uSX{1HBPO8BDjXq7jcl0JAJOkWF2%;o3 z!Hsp@4m(@MiC6{2W-!A08`&v?)mWudV`+!w`8SN4eZMoV>-tvkr%CYWF$brHLiQO> zwnU@-v(Df2|2q8o9Ii0Vh!(B*JwJdqTQPDc>Ble!PzSm_Y`AoJ#9eyN9%gikN9S2U zZVMjVxX?4{enfE-f30ZiE(TX>5xV3yW3l=|T!|6CF*(tUAHoDM*Xu*&2#fl1?k9U* zL0%Fv_R{B2)oFi_YwfOG%=;0}4j&b>nY}+$`Lw^U0!Nvvvu2245})-3i#7in6rNeX zvpxsrQMv1htQkJ;$SY2m%srnZDDh|8eShn~{L$YIa{qTj>JTk!y%-v5dFpqg505c= z6(T`+(l!|q*~+`IfmUF|sNt}>+3a>~+uO)lXAN2nT16q$Niieny}5evEKJhdi3_eL zNBZTKFlpwhg@E z2lcS9K66uY-u5UjKKbTxPu-|U`JS4v&utv_knHa974JjdM=jTt-t+P-03Kywz$PU9 zRYRuqor&(U0*is45{UlZ|M|E&Pke8(9i(4QcLgl`#^|?t(U2QOGlpV(26pi28O;8` zq`O@=bPj-UwR`C%zIY?Ed!agymqIqM4=FAZ({t_oU88$(1!DvkBzQceUpHQT2|jZo zydJShnU}N}d_ShFE|V{C&O(lFK!v`%f^ZxkYrZv=qD(iS5UC$T%iP@D z4Ad@?DVxnw85|fmJ3r4TF8=-6w!WiOnoyf7kzSIRrd`pW7pDlm8;a&S48GsK>mGVF zyLNbJCjb-`O%=c6^H_^c5RF~^u}${qqm8g^gj#xS)6t!W`BI?m!Jh9ou+D`DK9sys z6TkI;_n8>d&iq$UMmKjP@+D4RZAY7}hKep8LAWtA95&Jr5D#a&3SSR$r(@V(+dvDD zeGj78sST=g6tx+C&FzKn*AVhk_0x{-iJLjB>*~0@{(w1l$Ip)2z21MsczHxI&vww| zrM9@=ZZaK>)!T15(tjs_irOMZt9%)gk>Eu>f~~y+qDk}s*^aQ*Q8ezmy4~SO>exOn zRZD)dX-o;8lg&VhuK6f;fAtK|houX(CYTnA=l(z0+ModQFI-3+QtBs73EyEII}u^3 zLTB*S==^(!aCeQ<_*7j7sOipV8Td=ngrmmFq2s^OMupi$rbUsw<0cFG^n>=j_J+AG z+!Eg}U>m_Fg7BZAkHZn(nVp zx&t9hGRYsmef!n~bJ>pD=u2+-JGXVGil8?WL9(zoHRh~bDsG9JF2iDDOywjMEp$1%(UDYWxQYUMzG z_8c3v82wp!6C(e!Vic={@A9_XcHQM*cm6nO@s7>Is_IbdbpXL`-50)QXmqqi04<+k z^fR0Cw?Jy2?^^>Np@==lxbJ@Ip-1^&ogY(Go-?vQ`F`NAEA8FTl=qkY-a;xu;<@70 zFBd;VW6#q5!VYg67;q8u5m5ZwT1&#GdOXRQ6}px+9XcX&?LK#(VYMAo4`a>=77|M!|m+K)o z`{M53C|qi(h5}~F4|}-eSbZlBbeMI$w;a0{r)<@Gzu(73V~z2XL#=z~3PbVk3L_MO z{9qfzQprDas3{Zi5jy#b^_GEDf-`Yw^E~?-K=_=9mzZfaBy??$Oqey;2#=N&o4Sx4 zm%1=`bVm8y48D(7htO9*P=_wzrA&W@>z+9>lX3-c8L4eCJrD**_$w9V@}2YMw0vhO zzR7zFtbN;(EgPfmbMn5YHXeeDU4s*=Yh+G!ouxq`GG_)w<968iFx(wNDo}`6vhTuA zI{8EG+fa5qG2~;D&|7&hX#hnl2d>lPFod@ddo;|a^iR4Rw0>FIhqStD0-DQD9TX>C z7m4YNXlBbMEPg&mx!Gf*yI$SzKJ}2Dh%`OP)U6r**UX~AUeD{-yu_ZFXtxLvuP9AY@R>i*i>Pv<|Nd4hSqx;u z%|64Xl?IWzj($aG7xAO`;^LU}pEZHp_$~_>ZF*PaY9(r{+Un*oW`W;L>`&BdBW3R5YzaTzzW&(y1*q#}B-% zbAo)%4pr5Gfeo4zep8Ukgd3`YRMIpqd9>UCGWP6?jPEsePp?;$)#SNtzi?n(F`nlo z&bnCuTW=58h)GGMU0ei^JGvIoJf3XePr}sT3Vy?ahu;7x3O4bdAHN;uy8pV+DU`IN z-#j@{L1wUVTk$Y&f|&~1l8;Y*&7aw~2Xf;L`i&eoBd30=H|=ZFlD9GkBE4U7D4xHo z2cA$-bt7~2nB5Az^D?N_#;#02=rfbi2$Wfp{evn_Up3Nf^!$UVs*pt|;B|i1kvk}0 zH+1)L%1fJlA^4@zJ>sRqJVU)z39`0sXKNoyy-TJBwuVeTcR|J5=PxmgR$B;s*IG>g z^wi6$`b(!`k5`4R$6F21WLGd;hTj!!8JtI2#|h231w-Z-z%xl%!;Njv!qjqoC$lu? zjc$cDpeH^EiPv7ySw*G~q7eupyRE7=X9@7F^Y)Llgoq!X8XHdp!|RPQKL28sAw41V zCG*%h;eLV6wrm_>?lB`gwPRqcyuT00+#B&8tXgB2VTN}x1Kv{0^Nwm3nbsEny8QG| zW-S36sduAh?{^`rz^=Tw>^$(E&8gsv_XT4Clm2*342wtu? zsBdgsZ*y&K2*XXE9U#`ubh4awW_yq0SwP}ONO;wA+-00!QGm#IzE(B)0mXR^;0Tdd zLd_-!t?iK^5=|;o9D_VwQo~qobGX`Qws*yHroq9UM77!bD6eS5z8Y6~#3_#uD2|Fu zuJc8I1C4G)z7|wL!hH3Z`XKUy%Hhr`_d3C#%rJ#~9n7|Z00@&%vPuXy_83>GkNs=$ z70zi$SYkY@5r;{c)o0Zmz0fGd_6LdQ;T+{wq_w`8={im967k=h5nw|ER4Fimf$R>in$=2+#!;78M`i|LPQDNZ_8MTX~vm6_+Bt!dWbMum(zM-z}{bR`ue~-oo zcGZBogd1o6M{8BENql-Bp*>=fFb9#6R}ELyebV(Y;B!L4LqS75taXIH)F0K{>ZV1x z9S9J<*&9v@0)dbbo|-ZBat%~!evaGI@xAB;TIo7{tDM_%j_QAigZ8My8R=ArKj?)- zX1l!ez`)V_4Xbcz%>m5A`qUT<@|I0CrWQFUe``56S~-qxB`q3=-wYzs2J2#Je3QDx zwFhS(wWT{b!nao+@zNN#<=#fitAV81hdPMu!UL4S(S~33L=ce`VlSIS1c4kA+E_k` ztFWiOX@YJ>M$3j>loVqJ*OlPW^7JJAfxcp&6&5~_(JCPnl~~R%1?qBckmo}_An*GB z-yd?3q_h>3r+=FAxO7H~nl3`<${y24&>t8nt$OPF)R_@G+Z!SWN24r6J}-T={y!lX z*DkU$1pBX_Mv4Xol)5>2e;;p#mv6(3M+iN>TF4XC;H&)sCv8_@x>$oA5a3{m1iYVB zvJ;AmuWm-FmXnOm=3Cy{OVYm_{R7I4MR9AJFM+o`KE&2vR2u(wxlFmqO8VQse0TGx z<=(bO&5cfH&eG4kSw{SLGK0trdSFFh5&o<)?`JQ|eq`fvwSGVbyfP!RfaI5z<)x?l zCi0mh&jGVAL!)Ty0FKZ>58-|1x*e|1<&x-FSd(L8lIrTj5YVk<-44)YSevK2FTBwc z-?A6=p~XbIZpZG{^Uq7qM6BK~9p^EnOZ=ziO*@b!tPGRzILLumy`^II+-cfS6r$s3 z39?`l2|f`3aSY5J95Yn1GVBwjdUkk2JFnlGZ9I2cWK$cwTCL-~>v-L?jp5!mfXCw{ zRo_6lg8^jBJ%e8Sv+W;kh7l9H-u>=DLc z^&o?Xhis5UE;5l${dw<+$72C>68M2Q{dWq~HZEQCv{_Rh1m6b4#>Ej+Pz)d|#=(&x zsZ9)z{Y7Bnm|q^c!;6~neQc|U96ji4St7G+WN>9tg1cIuvRmn1JVGI>OGYi7OJ*Gl z``?=oX)ZS?Oetj1Yv}~;RCZ2k;>UU8De`5QtE7;rs9akyDqGsQ5OoUZ9<0?=sYaM{ z@@_ukiim>Pc6y}nCmp`@7v06HpMjruV^Rm#vho@^fYo-vm%j(zU{2qU+rYbi-Rjj~ zB%))QyXt}5gD*F^Ht-tIBHi>_rPr7~O$pSp`PR46`I7V=>!`9Y}`6=*`)qApYb2knT7fT|+z6o5$=yBIy4wSl*$MWEj?k9MpPk$d0aZS1ZR zL~G62G#Tr>;MBK(o%BR}lIO}r5a5m_Q2Q_;5I)Jngw#a6P@OiSFi7iSDdxj1p+o0n z9vo5RZ`>YguyKqLbClF}I82CI z<|~0*t5&V)cF$a_!L{HAuF+1Qgmr7Xz~9DV7uQi$(RbxGT z&QX=%hGi!H5Te?e4+G#<6k71B|@gjEtiMMbr>ySpg9 ziev!kHn;k{pTro$1WV?qBF7?lW4zYxR}8!S{;%AmJ1?8NYnd`@TwYy0dKm_bY#g^v zfv#&p4vk9z4ITn&c~y_~Yt38WuDPbTMW&4*G8(yXK`k=T<1{0~GpxJ-ioc(@NdN{R zyx@&_;_Q8=qqMS(-R+;_0ERf(z1GhWl%g{SK=^S|Q}F_Iq{=}QULn>a(ho%C#NhC6 z_C^YcBhQZ84XJhenQ@iuhg*g^JAz@x_E+!Y(ArCV$I2mb!^tG=0j#yM%6+tH_c)gyI?&4vhRpDd4qY~}y zj(zUvb)B1@4giDizz^v7Wf_eVDC9=lY?3~uj&E&bqUlDcuBbto_%Brgq_GK@A0L}Z z9RPcH81+rRyI0<=ZBVtxc^d8IR5QIIBj$a1A=KoFmg73C!&1QiBw0wpeU9GtT!rb^ zYo~$^C1V%;F(#vkv>IUbcRyctGJKN|e4Lm(@ zNpT*MyvAycQYg_H7y@22y+&ZTl}&tnb4Z72XvHB}P=Hl`&$YTB{&&kGs_?RMGp)NtYN`6pk-$-9^NL`1Lc*XIiK01_Q-tSxk^m&#&Ky# zU9BR3_N}00YxCC<#`-(ST;uzTyR)OH=pwQRa_l=B;Po%P9QH08m?f5l=IH|!hkT8nsO1*wNas1+S1F(6w^Baa z68Kbfy+Rr}1--+=_+Ixl0+_pBhfXhwuGaUtLTS;0)O2)Izg)4btd6zJ`klkg{htxG z{rn=wJaQY5`F*nqxkYDD9gKH~TVvl`|Cep_2x)m`2X%Hw{o~Fr*#6+jV+#CuI)hLJ zzGlLdkxjQ0QX1$NJJFkJi3Iohy+;nH8h=X8**6~GZ-v%;DAIkF_4fLycAWV9{CxAp zgc8!YyZdYu_TAw9bs9*_c1dU)Iio2kDEaSbO!b1Ev65o-g$~S`GCJXVKM-hBakkPzF}G+6Ka@?K7z;25UpRx@a8)%M_1u#tmOCe7 zYXsaZgqE*7uQoCsrP0K%vEBDRm0((V(Klr>hp(Uv5CPgi2`I?zg-m9AbMia=i0>y$ z4HTa_ynTH9DCGTl}`{JYDeUslG4kgk3>R9y_+khoY;cW z@)|un|Mg_Ya}r&|VF)$VXO*$1R|+j7@pBzI+*&?T^e_v0c#q*8f4Y z26mDY+T+ZEkgvb5b{a{dQXCNPka&D`&Ybp91} zE8VG?HMFj&toqjfN99ynUj7-(EF3E~0Q5tOfX7s7=(r5L(wCB4_M@i76-I2P^4g^4 zK26-K_@pfh9={kA6c}yEBi~?o_vfFy3Zq~|;A}~XQ~p2 zI8uR1^+LkyCkIw(IyT&D*8E>em;(1YI|}mLB%gZz=Za{KDR{*&4e;rcHt`%&ej-tU z)?2UOsHP&e5tRt;Lm^^y>VTiEtAW z>7IH3i=Wx*o1~{h-om@Be$*;Cg<>&8Ex)X8Z~N%yOwZG0N!xwXJs9bU&ro)d$uee@ zW8Y4pc|Tqo^Xv$k%l>Lcp~&Yb>2|Lrz>me*KP;GmXoN}{ipNIZW1H_IDh|A4~ zW;u?AYcfyoX9Ha5R>fxIelHgE%quCaQiA#QO2;kuY5D*PNLBRcqjX!M1#q@pXe2L< z)~$jTw*%~UcA79G11cKld9^~1XrpNLC4vD4QXa?b!0V?*!vn*7fqrb*% zhHmQ`9klO8u7U%I>B{)aoV*_nUs5+E$qhcS>$OgFINMg zV`8ScQJpVuc6^<}q`U0({FTCKS*u?HNOcqCM2&u4qvQgIHo}~l}Yi=UWQ|`{Mc~aFnNNZYs0jz(Q4`K%e=>vtwtL15yWBHj!Wd5 zCG&WixQc|XU$Y`i!1QNPK{GW5P*Y??wB|5crVRtodbafY-PN(a)3CtKenb83LD4x3 zR+S7Od+{RF*B1Z?4GkR;#lGDD8S$8~=`S3W5wH;PndD+;8NtO?GLHxyVD;v@@Ame3T<>cz!ES!k?}H_bKp18a zja6MxG{wulIkizAzTAzI1H}@R*>g(n3~i9vND4N8*+sQBT(`;9CXa7Xx_tsD{XCtG zhNdCXph_eltcXu~0*C+1?Z8i@y}S(WIgDLj(!0~%MAP8I@IP4oAxPp zxe25(F3rU~vRSOf-)p|f&tFW4i>t6%e3$z%@$1MQ^QBAR9?t8<#-!dnO`YsMg}r~% zE(YH0mLgYJ#?Yzcxr*=Nv?gf9JG<31A0qBoz9FAPRO=qaeQ)Nlq!d1>E}>h8k-8%3 zYUz<+=!Mjl;hh4q^ywlUK|Sp+Ul!u(aU&4dOt@Tj=G9Jhe<8afUGuIs)(nydK}L#- zq2X@CAE^s>5k#?YUZWkOW_bLaG1dZyv3Lgp4wL!xDYju*3toZrx4;Upq$y>QF4mu~ z;LEgPD_(5GX@R@C$OvfFM0_(R*VNnpsFi9XBQJhzP=Z-N@~xi|_CnVst{^*h7)#rg z<*^LhFz#LG<;DGOs;)%?OF>x~!{YKseQo?ANd>cF{xr4Ntz;~(D$L=J&#F-vu{q=- zw~*2Q{#Du9)>e0S=WGFcSypDQV9%)x?qkpiLvojm4loF(4=QWSyOz3;LY@sf-ZJ>r4A5&Kb`7nfyYhUy4GY!sclg zb~Yf_gLnR5)n#a5?#0^M5SJ)H3P{Ee)Y zhoh=dp-W{u%=;Wv32S``_p>$I0)Pt>79rJhI2?ZS03VJ05K9`he)mDSkh{ z7~0iQLN(hc)qLx&ChmYDfDv>v30$#c_L$K_M6WA5J3AMZ^_k(C4gEEN3APP1x*RTe zo2C%LPwx+Ts6Yp8J01o$Zv1T}E+R_i)L_-!MJw>p<>To-;_5_IwdG;jRS%BLNcjBf zMfsI;hs-W?%aPN?#j{w&`XwGFa-yJ0YG{y9 z9;4p1C6^Ha(nef3ILiv1c1AUQgzAB*L9PGxssRPl5K!BFGLhhS!~Nxf_MP}rfQ@jO zqK=Ig%E3?%AqV(uYQEnS;H-q)!$K(Fm6rnMEfA5+EEN*rdT}(qUZ*Xy>~gF~W3Jes zDIUpdE+E*sqw}4?ufi3CgjvdTV8`@hziVv-=a44U2U}atKD&m%SH4_pRb~|5g>#R6w?&bdS}lL>(?R|6_w*F58^Ry+&!64CdWX#gCdsmvTdN{0qpb1Z7|p|3 z*}pj}pDbVrR+>=$0`M z$uI~;P^UYCQ%m?3KKOp2K(}F$R944&zqtAQ=Hx}Xd76jp&#S|}Ef&o=?|z1llEPVo zhjt0;8~ZY9pScc{tb-|`{5)CW`Qtij=E#VZ#53kT)70I|Fz&prdw*iN~ue`_8nKG+79`IIW`7m|t$1VQYX-mB?tl zT)?`=K^4fvpM~fJbsTKK1Ci@twcOLk@_w_su?by+#X37Xmqg3f+bN(TL9H z@$9-2J0PLY@1_VLd5@m2ec@eMCAGI56WWW=t`Y{3v`be6dU`;<5?~ z3JHtxce4hOZ8fguPs+0B2tGQ0nr#tBs;bQo9E-<3_jT8>?imOW5GP_#)mG)=k|M8? ztC2@X!yQH1-;a)tSvyzTynJ!0?|pY%m$bF@4S<|(6P5~=*n2H|Vp1rEz>-ze5?U2U4+kGF z^8^llU+%O$8JIHiCC_Rutk0?*om~=&fa$>>mB54X9Fy#NwZ%Q(uNrSM%$)!HqNl-5 zA&^^l78>x@OSL=1i5mFBpu`W`8J$H`T9Ot~npYHD8z79E!^2y4qUymwEE3X?urO0( zm6W9xW4~N+D4KF(yP?N68IRqJyOZcU+MvHY;j2ll4<6J`wyhI|sflqiNT4JvEUZuR zs=t5ho0Avf=KN^Bs&9z^8+$#`Jk8RjPb9`}-mnQSAGtf4@-B1wSm(Z4?muHB!u!%^ zVd73ujD6?;mTTEm1OaO1sgT*=Po3Z(7os2Yl{wQ0(UW@VC%S)!HOf;weZ)1WfFx%i z5?MItY`yCp+<@E51P&ulM?~nHbqWp-PM20RHrTyulK-mH)Yk5aN5rh-=xVnOw-b^5 z7q0`3cP1Pb8Rk%$VPSzUi8M|u&1mW9am;G5G00ygYpFX_Xz7Wk)`+h*izM64OHe~c zYg&d9;Jj@%U%VdQ-8WZU?y9OnFw99vtI!KJGDFqm)a!z9r9q#N@P(O$70`a#%hZ2& z;Q-_9dksOSAvz3=izB0I@MuKyOW&oHf>Q3w~3s6}ZMW0W@+iDF`6aW!mP>t#tXNbvvpi; z5CHT5%ISrcc`tbn^bHH@1V1hCJ{?_GXA=Vu{&;YWEZqV1Sg{Dd`xSV^MpnId7L$HISnUuD&x`@?P|IINf0CX$gZoSLO236l*zB9e`xpr{l4VBLiae~hx-VfEi$PmnEO_k(7wDcmC6tn zD>kM_69J+*h(yTt&j@9s|JRiX*qn^7>~GwSGqBILAC(L!bOte0YS05XLb&oZxt+d1 z9`U1*TmB5NcGa(kdXpb^{2))qPa>(-GzKJB5IBq>pWWs%4k9XC*5BB}+SyIF7#@AY zCcr&3J1tgn54EhdTV081VvTmj(emz;9obsw12Hh1&>@@IBWfYyGJ8!ufnRyTM#Dzq z!y|8S2iwwCAZcdbe#(lyGar(96qDx^<3H9dFuQ);Y12t+Q>s^Whrdp7)E<30!_3#o z=mb9k*RX9$$sO-ZT!d$SvwqXsCB`hCyZN~QC85bM=V~zT)z0C-FY$^GA0kYlK@Q|S zu($BXpb|S}(s4p>Ifq*ig07e3di_}cZm#SbrM{BllH5}hakUC`I5us|9Jly!b^BoJ zkP#f>w`&Kc^4(^iFVV|v0|CaEnD_okd z3Y4Y=s^2VhTFGmCxMqXG?|k%{QXtHgB~UqQsZnHv`z@R4Ec9fn&6Nd=9Qy9FLkJ4Z zKKRsr+Q@MGX%sp3%`ra=qo*I(sk#}kVstJ+$l)HGfk)OS zT&kYX#|ci$kR}h?>`SmF7=6%1A5D>5Sy=Y2HdEr$Jz#%LeNLW-6aKNe8_USZ$jZwI z)mN!Up_G#EFW-0b`I~2*R3y$9m+N2u36b*?6KXbqn5Pf_G}vHXKrc|+eProDrqr1o zyQAKSP1C89Bu0&^8D0dnoJ}j2RSpveTk?I|F6o;L+PjY^RHX!ac=*46j|B(pcbYYT zsec6z2Z6pka}4z9;a(sl-o{EBQPaYTb6MNQ3lOKRQA||1M?9mG{T-D_FU)jILUTZ( zaC47Gm)6=gZ8f$opo%@a)=O3MbJOqlI_ctZ0k*nhRr?($^CL;~sfL-zkpD#T_|5$i z2ba6U1=_fp{;$m~bN)+FLt+NK%_J8mN;Ux^yMrByvwID^R?hnPnLlaG!oW}wGRG+_Lp?PP)@8gR~gF&SC4oCJv zotORFKXyeq93dVT5gvHR(GA78F7`k%go%J!Y^4zoHv+NEhB9zfe{E zXb$@L?nu&E#@|-_4BN23MaX(e)1Zx{4jixkDH^qxC_fCtJN>J&`Dv@ni>l8{msfY_ zdo=iSIvCfZX*kx#!$&&Za@Ms(RW}}hlTbY44!PiO5bWP$80|yYO9Hl-VxfD5=mK#N zkVMNEx}nrSsok@%X4Hhxm-&P_I^3>kxmUa+fn;9qoEFC?Zw&6a)>sgX z>>1y#t#=LxOHE>JTBET_jk;axj=yg9#R%Qr+OLaj*kGzQ^)lYU=2Cdx+N!?IxWA3^ z$@L9cSKB-A&6|m1Z9yTNJl;E(mRU;s(8wxPi0DS|*p@i+qNR_Mj5W$S%C}M7?R_VC zP(pX3`n+@I?WYRcBVpjF=jfc>?5JL%-6Fyjdo1exELyTqr8OEI<8u2tSKhPLJ=Nhs z!8U|BavGza%@V$**?+FyUTH}HpYp&T(v zAEfV?=3tI60K2>m`uRd4S%LAI7H#MS&;T=P%ETA(2>+3@#_~Y)8decvVjH_Ai|8?L zghSrd`z@wW()U@z6EW!SsM5Zqnt7Ul?jQ3O29&%Zk&VMSso3wLb%Cl!&kSTd(7sJ~ z^ka^R00fVE7g1*39WfS-G>T-0Mm8$z9Hb-F!Q1QY6uY?jpY|S7L{NJkQ?8~K030@N zp+%|DBe$HZr0R=J9-d~ho_6EurT)2qwsSSe@CAg*L+fnNOs+H-FZYqzsC5-4nE?F+ zZ|rUult9IEB)W^Io;JsuUH_c0roB2`0i$RSw#L99ZOy+W)_s8;E2>^bsv0JD)^ zSKzIR<4o^(UkZ2^N23H!Y_%X?6?2R|aOrQ?d>VO)r3-OF{kDHgob&Kl5BN-6*_p|a z*^A#0*?|=~h2>@gq^?pW^T~eeV=DL2L#3rX!Fz_=^I22IN<|x?+v5d(_i1IgbtLX})Zqhr3nHuXr(SIVnl>K1e# zBk&tF=xgS_;6JA>0}t?}>Yti7nMDsWV1181*dl{u&%Ig4LqdleJ*4H9_*%jT zC^sYPcPh^;{%^_r5p$16=$6|oogBN*WN1w4DqGui!{l9Fe!l#T`B31vUivx;bIU7l zWs)s!C1M(j=X623!GDqiOBj$u>@Rp@C2Vn6-=~jXU;nER2Hs-%Z+x$>4JO`rZ8pdh z-Tss{Nn|kwKXVZ5bLxvH_YZWY&lY6A=TMaqd_=oPV`1k!S~9g^6)W7sqd?D7 z5g6fOL!*Yw!DWkGp%W|fv>1j47?Bp7` zmtW=LLxZf{;k#zCRpJvEIrC%vp6oO^(4yOg??$3F`14m2{2eQ`&))zQkp!moi_gC% zemkK$JOZV#^7AsQ!Sj!HCvk_@k{uN86Ey>6UAJ*gnkS4I-ZM2`f+n_&xyi-_P{8m~cB*kYxzLIwJMh*0}=K9NR ziMQ&VD)~A8t?J{wNXGK$JyKmi$jD%Tn>iQ9CVbmd>e9{4bCtz#!x3F9%K%j6LsULxFSi*^X8K{AMd zGHP(&U?9&Cl00akTGPx8Q*bQ7hDnK}xCNh}N>;wnhYAS^Deu9qa{1(IE<6_9Sfa#f zzdh$WzIHs2Ssf);=mbF*^cPecQDL=VjsP?AldE2}C`flzoRb5FW*CHzxFBaY>s^V> z_=b~EPEJ52HkwV+#%3I6Ywc5(t*y-YW}PNGo9J~Wr%@!s2YMD6-H291$zG~uW1LMI zW?@T9>?fM%YTbqqZg#p~SnxdJqPd)EQ3S$`yb^61r<8HDk!LAI&Cxcx)Cg$KU(4G& z*3?22(~2x(nERVlP_@i-7Y~7HUza0!oW0#-kR<1O2!Rd-qsG{{S@-c zYOSXfG!Iak%IRryiK;AHt1%4>97+^c~( zU0D}f6uZl!SCH<%A?O!Xv`U3*COIm>Z02Rb?62$xxwKVGvKCn&rjSgX)me-Rf4tt4 z#Pc#<67mZG24081v@LpWk#>K_t0T?7kUh&NIMWvZ8KC}bXL}dz0k_4U0>4TzAgn~v z%#~<0Z|lh6VkPUa*w|3MwI0#pkFBtN_5F95zW?js>VL{78$qc(@L~Mr)YC>rI0!vh zyee(Mtn<~4gkF{-x4gW3F+vrMXloNt#`G?hR zZcrjDBzLV{Mg1zO`2`(dHOEpFvZWluq1dtyyfH@@cp*?=I6b(96&;7@YEjqEx13*o zr5{=NwevyfYVrf(7`br>zd7uNUFSIW$QFK3Oe&z5C(?5DN9Gu+XsiC3hoFBaOPPAO z-pHG7-+kmx_;N2Ue8J@W{)zgYFd7^_crHEXb8%>e;gXE@<%HA*zMk!ZRJ-z~-_)&d zMzsdT2mxcu48*a-M`igB!d!FsdXg3D#iFC)Tm1>On9SGtmF*J!y0`D|6W8fPDOluW z9B)T$#puJMX{1vjA7FKB@cX9{45E|NpWo;0ggqJZwg`1x+yy^+dg5joW!cxm(t$H0 zqw9&v6O1ZLuAPdPZq z^xl_1xNMo8RV9EwV9t;eel%R~2&eK`i;J>&#_U~17Ys%F(Xpy`2p>a4WKr0WlD5nL z@qy*;Rp9gO*#_l#1&B9c|2tF{UG!5ttdmVEiC!PHr|@xN22y_RqRe!$PTDt%@VDbn zLbIa1tmN0##i|bRS1l+^LVqIAE}ylXz#kgO6pF$!vX}i_h~r)HyPNv~Nq3E^;rAK* zo9`>YA&6r913=R*)+V%?zdkkHS678rMi-X|AR>Sv-R0%y8n)dMy zR=$~*_nT>7sWHH34xV(K2Q7M;IU(F)1E+3a$vd;LiyTxM6k-@FdxY%Dj|#FY$>2sh z1?fRdleMg%>0>}=fUl0x%Kd5JFY$tlX;H)G-TNbzO40mZN2CTQ7t{O9e^QLc#Ewlm zU((!=Dr;-|HwK$^@xealoAx8UGxbyXCmSsh+eJpvxJ(-I)W;|j{W~nNo5h$qt2*)^ z@U5KK*^@@^MNa(b3hdMtyCCbG$(eteuFwZXf2f&<;c}ynY>XAqMAa$Fqr<7f$-v+U z3%636B0I2f3^nRJwM|sNOmW4daJHweDGmaC^_sRp&ldvo@8=`hl%94Gl0+|>IY6T0nq1FcLFH+g6)#x^#gjsR7>bgpvnE8myF&h)(?ycK z0baj$YD2q#$N2psoKU1?O)Jk_+kuf@eYVG4-q5qp?|XMHX!&jD&mp?^^_E5RlY5o$ z_o9nZ7zdAjC_0)bFCrQdSBEZzpYI*_PE<6qqvIoAGv8do6YesBTaFFO=~d^h{?t!k^3p|0f=qN%p4V2(O!1Pk#2Z7A5K`0MCw(QW#hq(z8i%)o4z_BWqrH zg(e$ZFa>pbV81IsChJKZH(bP0yzUL0f|g2oU-hxn1tH-~TMGmM2lN;r44PM<_-)Q9+B8M)p0~h($1l3SP(O$aPzPmc9AqkxJBp&ogA9i2%X-SkZJ~n&-ru5ZM=~LH z({~^P8G-!($tBlVn@Jmb#$Rq>;`pATcRNwEZ|*h&xDl0C#3NfWYSuhR+IYlFBCm6D zN3LE-ClfS<-5L6_w+vps@At((U~5*B85dy@5KqPPw=}knue5?LR3qSkr zu}5V4IA_I$%n>#}g)OLwjiXtYNdKtq5OFn=*wK z)s}V|3Wx9gWx>6tOxQjPMCUf8&{zrRPM4&kLG7>!PAF)Cy)LYefTz6b6t?UiImGPs z-~Vf)Hdy63BXafW^hdsEV5IHDu-CxQP?|+XLJMIL!5we_Gqt{*z;K|y$7iMch2`Jy ztNmVme0PCvZD2gLgpx~Lku0Lg(q&a(3ZViSQB%WiH5|(ulX!J4m&_*BcSrv&%{fFw zcBOSCr55VbxvTkIs^lJ_PK#(O6J?YHAVOq-Kl_AM;CfAj(SL{R7w~ryYNf1*F6e{0 zY(_);hLn&@OV+3pLt>MuPAx&(KmwEY+=}=OD@r;}3sn&h(N}|F$75Zt@6YUjRyRF>BjhnYAS>_5Qx12jaMYw3YN& zM4ajS++0)XgUzPnb5CU=mG#0aDwx~1zmH~~2A@w}<+2Gaglj=1fsLP}?54a?(*Mh>R)Ma%1(F(WlwJzFGOb`6 z6XN~)8{FH>lawb0Q6;o>B4*Rta|ny5YZYUYD5L`Jt5ZgqHAG2%j&%Sbi)1=p9;kcS z-BCbp&W&rXlRI?6qclX`vcCR;S{*XfZf3XYUT3e0oW19yp7-R>5xI&>W-&g)56PKE zt`S#v%j28DqJCBWlh<@C>g{;w&RdGB8tR`!>&G5xKy6&)gDojH)9fY<^+tz=?#v*g zUUwg19V-ea{q&;R8ZRxVsX+M%Eh^28!va!o58450YQES@?%P{EheqO}H{{k$3#$p0 z-kk+VVFxYuAB&@7$}qFYy9VK*RJ{O&PtMCmm)eaz!8_ikjOflL<9PEG1oz{%aW-Wm zZ}juq5L@vEBY(xJh`NwwO3Ks4rHfbvlYr2M_1(y_8M<8GXF_^fB$c~AIPb{)-`Wdc zeNHdA-n|h_qE&UJ=>3GkW4(*|-|d*PXx!eTzUb8EOvu5-&-wobn2~*nLhom;O8}Gw zoV1b>lN;YEu&iKZLhJ({T)Ri{S?mI<;DOCLwubCddgTE6Z;=mN`;`Ma`uaA6MQb6) z!g^S^k&87*Xa8pDgPkmRa;s3)To5gFOx37JJ>8tBTIj)OVm6sGgv~(}ELm72HgPxpwiqm<@&Hq7B-7gkM{@GF_?(5W`q$2$WXh1rJ$qV^}$VXVIU&h`} zz_A~fcw<_zbFUI-TAb=AVDl4&YzCNhZh9ChrcJ0 z_sX#|H3$g%pq^A!KUp8Y;XxY=sy`1>)&##7Mwplq!!YH3id5ioKf3O-c4gf!)&RF0 z7`1;$CByFCCKP9G3q~3m_F=`#S1#jM#d|#hcOM_OuYO)$UKK+l&=KW!q0ZnURWIu7 z)ks%@{PNv5Tw?nb-`GTwl9=|YjFEH>?eCT&WQ^CF8LrgGd6y?KQrRWKPOBwd8YRAl zDv2CSyWphiYJkm)7B*eiJ zJSXy|Jj)H#n_FzX6`Tq}NJd5=mbXN@9a9^kHYsarsDdf`89lQ%2)%^)KZjwKoT73W z2fbUSXelZBx4%c)zETL(@6R0e3@m;Xt;B!<{*s9oyxcDtmV(jRo4VX<<@J5hTch0a zv(1@>P3PfuH$19NYNR_jd+(0o#x6Vt118F}T%rtqn4YazVU`S9D5&zf?ANbY@DZ=U zscrKRNMkfPNi7g}6nxLsdsyeh1F;iW(SdoFtFNt{0oURd?+?8RXqL7-9edup(!cna z^@-@gvUn^)_sTNN2vsw<7J-2x1507qOt;b`MQ4Ns<&_Kzrhn&&^}|mVPtjfydin7a zs(T*q#Q9g=jalQb(9tI*{s`xMooFh*UZl_dTpO)J8LhNv&hPqVoH+y6S6Sf#35~ z0%Jix?}9;Ys}XqMWyS2Y;aWsHlR_x+ZI&H1As{Kp0h;%03;yC8=h>+|>$4TeZ2EPG zr1n33+E%A!M?fu;(rCgq#!PVo66&6s6giWHggKgKy}?gNL< z;&ui1^3Sv52nFQ-cS5@VE0JB76x=mZY8Ho4nZlOheRYe_T9=KT*pmknRQ~z%9u8_o za&tg>bsy}#?b##s=FF361Dym5vb5000$&qulVDQw59;c1Smx%2UJs*h|K0b!h^bl> zWwi;WI83A~r=Q9SP)x}uaYMP6fg#&E9^NxLWAkoQX3r@AmWk(zxL>&&&3f4J&p`kI zJ?e_a2hXURjZ?R{*K{F;l*Yv+Ov^Z=+lLi1I{G#WCA>T5=i@1w@&6zhGpo+Juhf15Q;@x;~tV!JcY=?u@QH|(f4w3FlV}_DHinH z6!1iXBz9j1g4ILMn_y_Ti5KPZ4I2JAowYUtK<5+XAP9uB zIJAY0M2JaM#3X9$ZrXD%KoN(F(03|4LR~k z_Mdvyd%Bx1l5_1CJ>uk4sn@n%gmBIStflx)BbYfh`zBms_^Wfdq;CiKdFhd!Z@4?2 zyvJ1_T$VrS=`R|BzFMCAna~KGJ~LutC80ul#Mb;dC`Q)yCAv$(@+80Q$tfHyg2`H2ZJ|&ENla#lL|(WY z;=v|?!D6IxN~-$@mp8vtpf*fF52jSlKk4<-(sVxQMs!a{co;z@yYD23VcKkRfJ5?q z;lR>dWvm?zzrFR~JSRroIyonl3W=A@mb|UkLKcJ->~S0~Q?z->4xHi^m(LydEe-t3 zp)m;`>SmD7Kl))qt?ZN%Td%|MDA7lgbq$Q8%bSu58?9I+JW(@YOhSMyCJc=0p*Jvw7oA=9Dg0RSe=7QE zSUf~DXT{zUbv68JC!cvnk9&GeJFcdAYd`s9*w`&&vKJ6j0YGM3xA^3weut zf&YpgmeCEHKmUuF+Y;PX%->-zJ}RE3>OU+3uq;OQeV*cL#cuJ8-#jE_Y+X_kSk~(F z5qsIV#rj%OGRDbPR5~_!bN7yj#{!$eMXHbQg~mfir}_hz#A|-`T!I?!UZX9Z- zuzT?PD&^lrLw(XSAAy&t8FNZ#UH~~g+R}F<4uu+_|J|$~Y9Ji726CPmgvp^bv7#GP z=%hRh0QS${U4-I*{Z&CJa`GjpgsAbt8tO+VC^@vf2^XSx=;k8D^$Nw+GTz8D-#i_4 zf_MvIQ7w;3*b9YMNpFpvnAFnYR2%*KIjxVFn6>D%hJF@xSZvvlsIHjlsfJ1(kDXBR zAl0n3<>j>9-LIvkxo2OHt84gm4ef?Mf7ux#)tq0lb@zY1zl6Hr4MzF&6^xR?o+f96 z-3iRO#huRZ_Tuj1`GFn4vb@*kgSqnbrEo7AeVa1-nyZeNjBYN2eQ*=*0RW z-`^>uq#KU?+JR7MF5m2baZXetAxxIjU!{=<*mqM)NMK?U$eg$1`v}~^CKJLk-rfek zte(x6%l#zIc1a{9(mASd*hb?<$uR9@917vH6hov3%xg-M(>w&G%4VBofgNucQ;SU zznn?fHe~L-p9n_>xSAeLU{FHt3~c5;(%~h_SGezdL>^c}Q!;uP6Tkey6c!!vwPRz! z&$a=r^4)u7%S*RRbzHwp%zixaeCy;GW(Xkm>)n9O5grPIbTn{iC*-?j=*3SWpWkC> zF~K{VN@IY%b7MGL2}^|b4rwyUJt;P4?lL{$FPQWbWKAR?qqu? z665UfeTw9Xwxf;^uF~_F_T#r#3pyrPNYWJ7`H5aS#p6wJf*%s$=_8fOPgni$7pFU3 z2ICkEqz-h4S$~;-V}fd<$m#U0gu9zB@bm-wvG-gW&*8Ag?$_jp(JRiy<->9+(LhRf z!%<7?@_G%^T?*2SC1f49h5@mugc!<^D&3LpTEIts4_gNFpuBg`K66+(2JOkzSqFkT zr{j6I{q8ZO_Q?yE_H589s9_F(kTfZU`9$h~_Jl)H-u!^KsS84NwX`NC))=P>&hOGR z_DOh|U6BJqigo>ZMQ_jkgTbCH%Lm2r)%PaiZh}{Y%$FNURvh3fvv+E0jQh^?a}O*z zeY%cpiSCkq8Jb&97@P&psbCRcGG#ufZf&`kALh{TK*nFB@SC5*6!j(y z4c#j`^1lnwc3t+i_-Unds-=1f3$qs($CxjLv@m^TW8H|2f%f!KzEZGv7xmX@R%j)_i-9N^_lrU`k{?+9=AN6<9r0eEXN0}@nSyL`Nf-MW_h76Hw^E9L zM|n%GxgDn!C9%)xvZf!4E`0O{0oiP#DtoM>EWr=-@yg5e3ySX1Ls&QIIl3_tCeEzI zm*qsm6$K9#0dfvX4a}l8(QFmTeU(B6b3i#DvFCjUg#htht2TCZ@O$~l65hDsI#|W@ z7(NzKP>^44T59S%F|mNx%Jt_Uo$DK~pIcibK|!tD3I))HP6hB0H;ZtcL6-mcR-a^? zQ+<-yB50V3-Fz zy$2v#g8y0gJ<2T`nxE=|zS>fcEu$x<1td8(Yp2onLw%cDjylatILFTPK&hwCz`lmv z#pIFO-a3vvB9z?Y`3X8BmC31n&8xm+kShEePckhWjkfQOX1<{-UTkSg)l{CEBH)tO zKxNk&y6{*2Lyt3S&GQx^jcISPjnk5MjvXgL2i4%zdPH;NGpEGoPdAO}G)^!i;rWgN z(&)4E8=s_BxYRxgZ2)Ui0XJU`me1E6Ie*bITmI?F=a#^1HfBqF{97bUHE({4Gf@~>-ybQreJ!O^gx&k?3fR9-AqQpfh1(>(CcJg zJkzo~u8o8@m`NMmNblMNKgB^8J7-^@XzU0XwNXTjI z3Hz2fQM|U9*T!CMw_g7N_ef263JH%GV{&Hx_Bl!wSWCL@j z$0Wt=D5{85VH+*{?yhP@r-or{OkDWCwE&)6t_Rm(-*7Q*+87{=D4f=XY*tHNJc77# zDglsBy!{uE?J$elXW56)n!!=Ogh~NQ5jmti1 zfp5f^qZnh!#UNpEx9GiB*=<$PBV*J;t0mFx#lTxE^7WnZj7M#4&GNk*nqPr1{WCs3 zX^`xnLP!fCUR8cTWctzVou!)Ri35$F+*$uBC~o_8`9?R9sbc(x_=bj>L0DE+1%k=? zE5aD%mKqQ}B+i^|B&N#!JYb1}mb5vCgkc~(6mav`m)FJpURrX!!vhTx{(to!fC0JJ{R)R4Pw;C@skH5#q zZvWg35Ju3GgG`Aejb8{y=DB&+15yz@NTkZd*3E}@k_;egMol;0bfIMl4I5p4O7HWq zAHKfZS!UF-leJ&K;LbpBbG4=>wD|!>Y}Qe87vxj5qULMEByY=4L`29U=}|7rY!|@F zCg~Ab+-QYBr#7Tw)VX}Y*%torx`Vy_4r3N;uMe(Vt^6$_{9_ITlm$}?`I*^wPwcXw z)PnWho}tA4am$eLl-oe;dgD<+malzETw}Xp(WI1Wqan=MHR3!L>-+`DFyZx^jolLO z(w39j(iQzp;f-%NDF^0MY#P+LLxB-B?7j6j6qt9`i+qe|I1I7 z#j2Ucy-nJ?L&nlw*<|_t;6@3lS6#!v52jCrn`ZqSL22H^U)Duniv1Y<)EAdUL!20f zQ1U2RPHI$Kd*te#h5Z9JuqM4)LgEXDk1C`l6&QL^@*Uah@i2HAIx}?A19#}Rz`iUb zHxC^viIriyl-5Ke)fQFq*ZGD4>Cg^q=q6QQh6LzHy(QcZ3&DiW>K?2_YPLjT*J^%a z4z?`BZ0@et4C?z0|1!OhTIsP^IH=}iCTQmBZ@kev>(JU_e5Qf;P@1aK1K%@53Uazc z-hQ%dzG@md1ofpa4Ges(D}QI{zk+L#5_AKMbX(!8DzC$9C{v{#=MI8FzJeQiWPUDQ zIZRD!oH&7Zj;VhHNe<%El=34vplkHDDd!oYmJYkedM%r*ya4+RYans@HU7kjGn~kL zuVJ^y?oay5RgXqEnA_LzC?Qwt{c?53wm|R=@AdvU#u|2FK@5i0{GoR=JoWv8?%ew2 zyVgdJzkdE!?+~7cNJ`375g?_T?LGsh3POU?C%xQ~MGf~gX^b)X(L|suq`ZgVtSy6uHt}P{&a|&^& z+_bCDJ!ZcpZa+o!J#vFQQvX9^qFabtrRX&5v*vK>d!5_@jbkB*nzH&&>r}T#!}2AT zzojSUx!gi1OPg0@C#z+y%ZES5m}x%lyl`N=cb^~Blk(dltJD$8H`Xn2L5uC^$}N=n z6fPZr0v><93LRBJ#}vK?nzvS;;4|7x3|OhFdXZ@CMGpx`K^ zAXRV@9b2U$0r$OuzGNABya@!sko%fBnZW9-uADAB`T8BvJPyL zUtoV9(U&lL_^_1KeAK-mr@we3%;#nZi=4_4BY7P_j8xTosZgRpQRV(C#+HvE_(a=rU-%XO(Ce9W=9kJ=&$F0Fy{q^2X_X_2X*Gtk9HpkyDyU^=u&9baT@Tk~3#f34G6uLmm6Z7eqOotaR~!o2Bywa= zq%j z3YhhS0Lu}rvgYXyGHTOd+U-4OLtD7N1y|~NT+I>?6dX{tk49${PDc57cAFJV3lOby z9x;vs@_oP{^Msx{x}w|jhqWQmbf|Ya9>N^gC0@SS!1QEx&jh6aCBfQ-t(gVGmRrFZ zhL~iPg|ATDr7I<2Y2hFFQWk*V6fviwRugiEBhLB8LIe>pk4_X0G*9JeEThJ8l!Pb7 z)At=i!PV6J^eUzoj>6_|-vv?a4}-uENh#M?83h5J9Zbc_&yTHB?qEBSS?4is6xFR} z5ae;xjki3aeV?{XKj&eB5PI(Bk#sfr$y` zsXWNVh4bSBzOa}%N*+yEvUvmiiQ%PbqJ6JhJZmzWQqfaQI7hN~v<+`g$Hoc;;ZsN{ z3j*HjyoYrvyql(wwzLMU2_7&8H%Bm;i0P&ml$WbSK`^#|F5)*HU)7y_@C-$hd=%;M zEt*rTo|#+Hd+T5le0A894J6gkXRR@;lk2jiI4)QVHvGb)=?nuzCdh#wYwn;Zi6C(F z;!MTGIE5dmc7Kwq=ELm(%Cq3iJn8Ql!>^AI+Q6r^k|Vw{&4ku#7Il+0Sli4zEifTZ z+Oe|YX3b^$OnR-edDdBO|2)BaC+@z~xm?gsWRbt(Z%R&>phUZb-x3XZP}9z7ZbF;I+0~5Dz(xdYRsk{QfVYd7n@4kiI&m4>B7& z#4+&a^cnF(Yg^munZ-jPe=DoE2fs2JR}(0VncqQJSVG z4bo?1WOe5LPXmyFpgGg0I$7?HK+x~8m6PaAW}M83s_?>jGpUL+O$41pS$l7pSZ&`K zYJGko=Xnrlc5H=e;UooZQU;)0IE7LN;V(-Y`jN!e9~^Ur>J=Oy`*J1XhhsY>p-NO5 z(Gph3=|;*^Cm-yo9ZY(_XJ3S8HE6-S`yvT!p&dw)J@ThTc-BM74Vam~DJs~J<7odg zh%=J#my0=xki|b%YB(6Cft_rhDPjPAENKtr43&|q!(a%8X@``b6rk(KF&i(^Odliw z2H$Ud#aLuz)v~!M(>28l)>QtE2vcOpOZ2By#bxL5Pw9+jq&b7U2*lb?869+pSCgIH zH6hUJVYRcqK!L{ugCsK61lZNWxNy@|bEo$n2^j<2*YgxalM>`jddl zzTNRV_9|Y@;Y#m0UqJ ztX0l`>HQz?ix&puL1zk|53vP!|Q3t*#lg*!Q|>O-V|IMtbmIo2l=^5dBb%g|(9*d?z*WclBu^wWF3 z?XB|kcw60;hVjPLphg-y8om(d7as*896`~vnS&RvGg&X!o2tB-l_kn_XQJ`cd4?>) ztNO~v#4)#UL;z&Q9?m}3jj@UzJM4g)-K&S7-CIA!94XP=C~<`p!EgQ8o#VT8ty6BT z*9x~BFYZ!M)pgpzKX2q}%f`!^Ck&_i&f-u~&i_7>xwuIC9&@z6cf@hNb&_^v5O}2p zPI%;&f?}K^se;Nj^4)EIw0+$NK(+wMLgAmP)i}LjP#^KuxRHn4pg@^$)I?*q0EiCd zs{X0G!tr^+J32sBQ*v8%^(*FFrcHN|>WUhKe+0$g-=eVL`Sn8>MceAHGidK`RoYj9 z&bHT*?+o&0938hegmCWHoN&fOJ#*d0t%RY6L3t0lWI;wZL}Sgj3_csaoMz~n62AKd zxno`ZlbwdmUv36pQ-m~jy$bZ*8Y$7f|C{v@OH00_`>?OgoX(;}@^HWAfr(m{bt}6q zxVqouohC<*6;` zMhn^PStPDIh%m~vROrqi-{vY~-UxI`{|>w{DXUuS_qdg{{`iq0$WJ7X$ftX)_GM8P zt7UKD>b8%+s>h3i8IJu24!M4XykMig#ry@=EvPCLwktu*9{*wO$^5ejH)|l*k6hpK z;kX^8y%jERce(-^C?$sQmie@hkwQo#Ev~|0k-#jhRUG%L;4Dm>cN->xk|W8wnZQK8 zC^(@L&=q?2H@t+$Z}UUE(S|l7B9^N)W%#WdA~w~hsK!qv683xwGbm@5Cxas__G z0LTYju$#d*7@J;E@Ao$nQZ&y%&!!bB@?(Q;R{P#hRrsg`J>6gnl)rQRm_Au2*+p%F zYkzH_G1UcfN#BD#hL$$I6?^Gzh)+w`cqlU)hAr9Cf@<#?PS0QdRNxw^4J*^Ok<4ck zO>LR7b-Zk4>2-B}{p;$Zl6rSPRg(2GXLdivu?hE}pf#Z!WKOLR?TL-gEqx_`qeUS>|J`fBC8mtdWLdb8MvFfL(v|DjHRbrXN; z$9E-C%|dd)xt)}eUB4^DsMF1jTeipDNqzsHBEuYJ5m%IO! zeqS7f@py5!b7T!-^&z*S@b{l2o%1vr)8IV~F7*E5pjWh0uU-)EuG# zu+rk(ZzmPlNSpouw&NUU4TGm{JmcLMxN5=HigIO*gPkwNSm5x{gzBRwl;D5zR;P{W zg%vN^6S{q|$o=c@<{VuioiCib>Fi#5daXZ>GtZKrkbAZt$Lf7XsrtSN=zH~wd?k$q=z{GMk%c0zPNondOP54R3t8@EtB$k}t|EXIT!8iH(9OWl| zG#)>$PGVF#nWT?vkr5#w)Wlr=TRU7Mp}} zOog`5$ANp;C1AmD0cD%|K;0KeXYRI&F?;+DQBg{)F_}>TnxJzRarO*Jv%O!o{T75H z52^&=RM+f~D$7K2@e^MnNHpT(c8N(yk`ga15*|rsl+S)RBN*p`U(-u(jRn1`nrkri zMeg}2zYKo1jQh~Lz)(6m^9&aq2;8{z^pMW#`!ji0FEVND3;11bR4xUzfL%&OC$?Sy zUW=+vX>ugtZ@Uu|nNe?l78L)l)Gm5vQ%T`k1p*K6D(l!rlhTdVYznf~3d{&r(;%V1w)Bh8B*GG>-#skulmfw>E=;LuN zA62!q)%p1q$-q8@jLK0=22#e^9|~++xsq;e#-cD3LQ9he2{kpsQqQi4R9~6DAzb+P zb45tplnu$a%d-lVC*an(bS4NZcrUUKnJ(~I_2#SQ$r`hv$!5??U6%=Uj{ccm9(m>WPU`2Nvj>;L zxiPwOGxEPh;cu+NW_{f4!L88vd4Fk7<8QCjM;~;cRv=+YA>>MhMNUgdvRADVH_++f z$C1gSmbc{xWk5^}?j6tSgYFf0i$^Pb1BaNtEYMH%7IpBJ6 zuSE9>&lwTE!B4JyB~ks-7;RC2^UQ>n~D(FfX4Q4M+(f73MQ07y`6nc#<^H^ z_i@IneW7&;TrpPXIKx}?hlE9!Jtjzec`oMrL=NoI*;d<^Q6b`r*X7Wwz$7|lQI0b8 zlrotl+~W}hwc!U1bV8yK^`{iNs@)%Q_RAQvrV?ZQqWcD6<4eP;TO_SBGuRk5n{(#{ zG-#t;^Ot3n$VL-0h#7NiK2ta~tOm#{j2m{EZ;BFH{pbNr2>Pw2VT#Cxg8Bf6x$QI+ z^kG#u1z7Nca#z!ku4O=NuKIXlZb0Ou0H29KUpTyfi}ty@qjv!1G_+)rouQON68s7q zdo%!!#qe^?k)28$=M`yt`FG+hW;<#C!86Mg6cps>=;)j-Ns&GjiZv*jhB&_Sy~K#0 z2|h+fM(XJ4EmRyO#9d70X-)^`bZvlkDcL{IaE*Xtxrnfu-V}6IyW>7f6WbNMhG7;=RRw3!@f4ZBXAc%I zVyk6B5gm{6l2^#mJW=$>T-{Au0^#;f8IoQ%i`4S(u=4l=c>Kbnx_Wxlz%{D`*0 zn_5bM#3y8HEa+WSDWkBjRz0S^;RFe_x%rxdG!iZ?mnP?~_%kX%yQE~%{ zmQ6dHuTTXbsy&#|0_cz8S#`?+S|%oH+DY)ZSyGs?DGm1&c9c)S*bgI`BZo&lrZ~c) zd8(urgI&Yc znHRK?j%pDXd&L09D<`I!$)7$hG9&4Lg8-qS5DmK#Xq+G^a0wOdQG`)uV-vkW4~WY5H3T{)A3vTdEGYwa}?sVXz#%dKv9d9;XmWIgY5yZSKp{ett9IkCE$ z4M7_*y=Z7&XDb}4bEExBu?Sq8Pefb6XM4+QyXC|FxOopKTvj(@TUj~fL&+8S8d=3p zG?v4kkQ{26oDbA-1&ex(8@P96(!dXU!(ZXco*#}SJvp=)EiNYJ)YzKF3-@9TOUFxy z8a18S18>&n97p~s;xCAtHh<>4cz%Aqe|RWfK3=r3u&@w(WI4Y}Pk-b6$&}I8*VofK z2bkcTX_4qIXqRY}MN27}UEPCIy_+haa@5p#St641)r{n=QKq$n3gTVe9K8&wfJBuN zxjOD-&4oKdTVQjLCb+<&wvjf{XtLETC4gmGVx*S6o=&Vg9)aibNPofguW8o@0b6F? z%p3I=zSSyLzz6=ZK-e2VbzdNc=eA9_4&5*PO|Em1%fgyi>a`ks@W;|lzcJkT!@(QVnD=H{cv1l^Xg>~zcaz0v2h<78T^gv zX8MHW2jg5Gx%#}s=#@2Rzl)$ePEX+HjBDTYuNkpwrJ0y1_ks#&Xhz%%A5D()=%f%Psv5({I*K2uC7NtbAMnYnuZ@^K&q-SgMmSUh$*Va z*o}_ty=S?aHG^sY$iGXV8p?{j%Cse;^5-mn@{RWNbwZkdgTH@aV06TEC9k8Sqokp6 z_O<#ex$R?kAaOB52bA?6EqBqVW?mzCSX7zAoX%5KL;djDjHX$=kd!X<5K|ez_YwB> zkv|6$2dBHVps^%hDaGq`4(`6$m-<+N%{aXrjIwu1PNC-%7G9qpA3~A~igaMwznDwL z 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
BDOo|MX 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 F{2v?X39SGC diff --git a/maps/entrepot/entrepot-1.dmm b/maps/entrepot/entrepot-1.dmm index 441feee6178..5eb47f11e0d 100644 --- a/maps/entrepot/entrepot-1.dmm +++ b/maps/entrepot/entrepot-1.dmm @@ -4,10 +4,10 @@ "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/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"},/turf/simulated/floor/tiled/white,/area/entrepot/cafe_1) -"ah" = (/obj/machinery/kitchen/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) +"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/kitchen/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/kitchen/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/~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 From 3f43bc97225d3e231997db70ff1b1c9259dc9855 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 5 Jul 2024 07:39:36 +0300 Subject: [PATCH 19/22] Recipes convertion part 1 --- baystation12.dme | 4 +- .../{recipe_bread.dm => recipe_pastry.dm} | 0 .../recipes/{recipe.dm => recipe_unsorted.dm} | 19 +- .../cooking/recipes/recipes_to_covert.dm | 754 ------------------ .../reagent_containers/food/unsorted.dm | 8 - 5 files changed, 16 insertions(+), 769 deletions(-) rename code/modules/cooking/recipes/{recipe_bread.dm => recipe_pastry.dm} (100%) rename code/modules/cooking/recipes/{recipe.dm => recipe_unsorted.dm} (99%) diff --git a/baystation12.dme b/baystation12.dme index a0bc6715f8b..f0265828530 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1856,11 +1856,11 @@ #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.dm" -#include "code\modules\cooking\recipes\recipe_bread.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" diff --git a/code/modules/cooking/recipes/recipe_bread.dm b/code/modules/cooking/recipes/recipe_pastry.dm similarity index 100% rename from code/modules/cooking/recipes/recipe_bread.dm rename to code/modules/cooking/recipes/recipe_pastry.dm diff --git a/code/modules/cooking/recipes/recipe.dm b/code/modules/cooking/recipes/recipe_unsorted.dm similarity index 99% rename from code/modules/cooking/recipes/recipe.dm rename to code/modules/cooking/recipes/recipe_unsorted.dm index 8ee1d1a1533..75e37a8b14b 100644 --- a/code/modules/cooking/recipes/recipe.dm +++ b/code/modules/cooking/recipes/recipe_unsorted.dm @@ -1,3 +1,4 @@ +// TODO: IF YOU HAVE NOTHING TO DO, SORT DAT SHIT //Example Recipes /datum/cooking/recipe/steak_stove @@ -66,8 +67,16 @@ 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), - list(CWJ_ADD_REAGENT, /datum/reagent/thermite, 1) //So it cooks inhand, totally. + 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 @@ -1000,7 +1009,7 @@ /datum/cooking/recipe/hotchili cooking_container = POT - product_type = /obj/item/reagent_containers/food/coldchili + 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), @@ -1107,9 +1116,9 @@ list(CWJ_USE_STOVE, J_MED, 15 SECONDS) ) -/datum/cooking/recipe/slimesoup +/datum/cooking/recipe/metroidsoup cooking_container = POT - product_type = /obj/item/reagent_containers/food/slimesoup + 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), diff --git a/code/modules/cooking/recipes/recipes_to_covert.dm b/code/modules/cooking/recipes/recipes_to_covert.dm index 1277e4d0574..2fe2e8257e5 100644 --- a/code/modules/cooking/recipes/recipes_to_covert.dm +++ b/code/modules/cooking/recipes/recipes_to_covert.dm @@ -1,5 +1,3 @@ - -/* REVIEW Need to write dumplings /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. @@ -9,17 +7,9 @@ /obj/item/reagent_containers/food/doughslice, ) result = /obj/item/reagent_containers/food/dumplings -*/ //Somethin' the fuck else -/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 - /datum/recipe/donkpocket/proc/warm_up(obj/item/reagent_containers/food/donkpocket/being_cooked) being_cooked.heat() @@ -63,37 +53,6 @@ I said no! items = list(/obj/item/holder/diona) result = /obj/item/reagent_containers/food/dionaroast -/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/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, @@ -108,53 +67,6 @@ I said no! ) 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) @@ -169,54 +81,7 @@ I said no! ) 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) @@ -225,48 +90,6 @@ I said no! ) 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( @@ -280,14 +103,6 @@ I said no! 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( @@ -312,10 +127,6 @@ I said no! 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) @@ -328,32 +139,6 @@ I said no! 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) @@ -366,22 +151,6 @@ I said no! ) 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 @@ -394,11 +163,6 @@ I said no! 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) @@ -406,43 +170,6 @@ I said no! 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, @@ -457,43 +184,18 @@ I said no! ) 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( @@ -502,22 +204,6 @@ I said no! ) 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( @@ -525,166 +211,12 @@ I said no! ) 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/spaghetti We have the processor now - items = list( - /obj/item/reagent_containers/food/doughslice - ) - result= /obj/item/reagent_containers/food/spaghetti*/ - -/datum/recipe/boiledspaghetti - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/spaghetti, - ) - result = /obj/item/reagent_containers/food/boiledspaghetti - -/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/spaghetti) - 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/faggotspaghetti - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/spaghetti, - /obj/item/reagent_containers/food/faggot, - /obj/item/reagent_containers/food/faggot, - ) - result = /obj/item/reagent_containers/food/faggotspaghetti - -/datum/recipe/spesslaw - reagents = list(/datum/reagent/water = 5) - items = list( - /obj/item/reagent_containers/food/spaghetti, - /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( @@ -693,52 +225,6 @@ I said no! ) 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( @@ -747,97 +233,6 @@ I said no! ) 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( @@ -849,44 +244,6 @@ I said no! // 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( @@ -899,114 +256,12 @@ I said no! 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) @@ -1032,10 +287,6 @@ I said no! 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) @@ -1071,11 +322,6 @@ I said no! 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) diff --git a/code/modules/reagents/reagent_containers/food/unsorted.dm b/code/modules/reagents/reagent_containers/food/unsorted.dm index 40bbdec8dfd..761938b1bd2 100644 --- a/code/modules/reagents/reagent_containers/food/unsorted.dm +++ b/code/modules/reagents/reagent_containers/food/unsorted.dm @@ -2406,14 +2406,6 @@ bitesize = 5 startswith = list(/datum/reagent/nutriment/protein = 12, /datum/reagent/capsaicin = 3, /datum/reagent/hyperzine = 5) -/obj/item/reagent_containers/food/slimesoup - name = "slime soup" - desc = "If no water is available, you may substitute tears." - icon_state = "slimesoup" //nonexistant? - filling_color = "#C4DBA0" - bitesize = 5 - startswith = list(/datum/reagent/metroidjelly = 5, /datum/reagent/water = 10) - /obj/item/reagent_containers/food/beefcurry name = "beef curry" desc = "A piping hot plate of spicy beef curry atop fluffy, steamed white rice." From ea73d4d3b8454f0f7d7635c13cd7d770a962ce18 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 5 Jul 2024 08:51:21 +0300 Subject: [PATCH 20/22] Update food_ingredients.dmi --- icons/obj/food_ingredients.dmi | Bin 4324 -> 5259 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/food_ingredients.dmi b/icons/obj/food_ingredients.dmi index b624a82058af52b02c2c66c3007e9b50c775f9a9..b653cae9218e90ce560225ffbb7f30968e35be74 100644 GIT binary patch literal 5259 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 B-IV|U literal 4324 zcmaJ_XE+={^FJX@jhd)YLi8FnTvTQKA!~pCr2AL_3|}v=cp?cDmC`MDHzv zaEQ~(Uq1XlydU28!|u#J`|QmAX6Bih-6&mcRdNzW5&!@|uCAt}e@j2y4l5$U+j+v@ zU;UPR_cw%iDcQcW@qFv<_14W50PxL>9R-neijdu1o{DQp^k{J#~h6#42jOL8r@hbC$gV`vhVFyi~gs6oh?TBi3?~cq- zW;nxN{i7aH>TT+VaNlS{P1T$m786BT@zJBK%R5pTIV=dk)m;F9Vq0BF!O%BzH#5N9 zY$6LIKQ%d!B4Ac+je&LH$x|OXWa>sd`PfbFMLbSiqiJd-YkTLeq^#Z7nf9hijboVh zS1ouYEzctF))U)l;6R%lVdJw|L2t=71_|KoE|^->?kUxr|8%wUOm$gPaPJhl8V6nf zxM#1DfAQm~>dD1b)>4D&$qNS;7iIQRC=@u z$cZ)zvru2TeEMa^?vqQ7YcQKgz8+EnPZW%{&@sY!pI$-<6moaYRF#I7F8Kwzcdr9>99vCK+)An4+hV4^k^DgY-v7 zlN|o!16y^hy!inN&z;P5obI2(XAxq?z4I9T=!VV5^ZtvD{8)Z_4=aCce%_LN$jc(z z-EA4l_V}VsSyAniUTNDUD1hr3YB;N7`b>40Y>szyN3X=tx5Yx?A;MW9ji|9P?Q|=| z+M_BBfzaUTAHhH%YOTA>uh7hggBqyU6XY>aKLX5edc5T5^nMZ{a#_^$9438-|LNP^ z*IbkU9%Csi69fX)2YuK959G~TH-6(S*RwChaVpBpa=B@6p?4lxIFislSSP)|Gg(yz zhE2xnOog#rpVZjQU&3{2`es6={L{;AfMc7RisdAqwL7u*9=`UD`VxM@@?2cdR&fzp zR!1tWf;pe4EM6dH0Lu^;CTDP9HOBiq9y(CjlWE{p8X9sNg}01I8o#XGl{uKKc?1qx ztBbGegY|{77Zw&07{J53v;9LwIov5g-+xFy?abt*f;Jy+GUy1M=v^rE%j;~f_2~$zUG*( zNjj07(CQB1u0?x}sdv09@3VY&OsYx;$=c3keFk0NXk;jIjWQm}p?S5|Y3=bf8{rcO zkA8#?Vr>~p&F#?FZR=X+><&{IhWdp!?o#AW71N(}2EP_C3!mF4SX%`^b71||`u>E3 zdQw=@xjK|TK>dJ+dazzo*0WW5sq;3tN?pAN{+b7L8X+4F7PSUzSrJV))D4Ue z&&K5l{|Gt4jYZbot#`MSZ+u$grVB$i@j9Y}i@Nk<-fsL#I;=MzrPer@A6T>}H4(0& zt?|DqEXIWLi&<=Amjp8%f^yiKLXtDEJrf?0x12hRfBkXVqX}#aM;Qe-Ozt%$dD-YZ9zcBEE>wULFX;9F+yzL}PgLFggjsz?qy zl6ar1LmI|7_9l+gv^YgC3h9#8V4sdLwhEm`<}LO*EU$6rTB38*`tK9Awz|wlqH(cv zJXN&g9=}14vM93Jm2Uke_*OU0XN01w|FNATQ~eW(Jq20MsO&wK($W-<{oi!rWhP-b zYgWeZ>Dku`;*8#1Lc#0@h!1g!sV`madiNklhz)Mj{;)0Z;&%=2-W_eFOWz+#;{SlF zaX}i+TxIUHNHy6n7C%n0<^q*B9K}z1u`TloR?!=Bgm~qEhPv5-OU0HEbGvq0L*C48 z^-p$B@?96Xf71xa6yh}kGk;3CCPpzaW_gYoyP}!E?>|u&1+?|WytWY83O)8R=~VIN zT+gX7G%R9HP9SFURc6Bx{vA9fQB%=!5#Z#;mQ0bx?fN;qcs5=>wz*OD8u!BPa$I`B zwb36qcD-AXr+uu%QH})kT~$i=KOSSJ_bc(bIXvfcGRFVgU=|I{YNtJTcX$x>=0QMC z?BY9n14kXyv4Ss0@3?WJ0Umgd9~R|=G}b4d=5ByVob?9*RZ(zCK0Vuj9$EZY6%I(*dySbj||^TzY$Zi30vy;4Uq(1GY}}Woor{V zj@qzV;<$9l;t3vCEb?x9G1mH>HEiI5?{vQ8F(piYcG##hCeP4plvitul%75sGjh4p z4Is9@K6_|wV#}+{Kl!N~K)Fvr5ihn4`2GNU9>6o@$OF3MT7a7;)j5-sNd|eDU`$<_ zm=yOk8&_r~Be@L8D1it;Gv%8jve{>X-Cr_?5B}y8rZ;a%!}B)bAK{MLC`Bu8Ki;4$&Bfr^4!46t$gK?&7#k@((=rG z0f$5LknQ!q3c+0?k8MAIWPL(g&JMOL(H=&dO-jY{^@6%@25Amk>$00y`FKP`$B%i7 zG{gc!6O>+|sZ+U57tANb+mCUd z3t3No*&Y$#k>BGWVAmu2qTKc=KKDKSWBVqy3d(!vdmBz|W8G(@3xlVD0{p^Xk-?Fg z=HzOtPNi-gQtm=1kC(nnWT>J`FPO3vcs_sp)`*e86-}Y`o{tWl0uye*Q5h(eCgEDx zCL?o{1OjYazydn~>@MD$>+1x~VowR=f`KEz8v=v`{ddzpo%rk8jUG;dNelH%{;h8g z>u+M*R6cAGXTpU%uDp#PgDNsj7f<-m(6xHSu9G1Gx~#;i?g)aSPZR-H>;peEor^m|2%@h1M?3w-Wd(YW6ceSrJ>rZ%1c2Cb|M<*6ydLZH#f#~eSqTwgMy)c1t@(k-=%6+sBFk}9 zM(T}E$cCyQ?ba)TbH?y27tfpa-!p$=Hd0&HIlY{oKZv4GC%d!J5iwWS>O&OTuk@LG z0NkDU=_g`}paNY*Vip=38@meL`TTo8%Iba{k;E#u^+=V^zCj^2Lsb$xgTRy6p@z&OC4v&1e-@Row%G9}pJ;>e1 zH7Qe8W=lu=9G_h#k-`*u9d3R`uz#Vj%87Jqql*g_#?Qyy*^0albBL3Ss{5!exq!0M zHYXzCj|HyJJ@$`lQS|WhHU)-JJKd~VjHJm2%L4|1q`Gl~FaW z-q2IhFN9$t!j-i`4D5*=maen!rJ|)$w!rpeuBk*IY>5(Dse^a(pWBz$X+?m~mX3rR~RLiPm<IHRk|u|&REDIE1d$7N0BRDI zHX^s^_g`sAb6=%;^NBaK3t1*+WcR{RTsN$_W!Sq1$kA?$;@qA}mA@puCLtKEsGonO zW}ZmcD@onZ&Y}13DbVk-@;}SU|EM~~8!juJi-Eruld^FE%MJBn(9O}N+whXfEtd$A za^!q&^S9}d#^l(!;VU~gQu))_@>J{jb2@pQ0rmLMR>Uy#&S-JqEJO3xCs``-1oEIJ zw00fVGZjpoxia%WAk9r7k1MhXD1ACBRMk&?@$xjJVwc)LqCI0|p8rLMWot8Ma^CZP z%?RT4RSj&B?ZuA%H#S1{TfVceo^3@G9EIT7M)q4rB8wuG#1D{rt=!xGC>MQ(`k!eA z+T7Fb(Gd?9fyKw%ysgAj?>B>-`Qwut0g`LG+;we@*Ucv9%R2g#`=d3`j z_!l_QfDh%bSr^{xM4~+7>Q07R0E{n<5*+)bm&9njgY)#DXnP*JG<9|?UOC{9h0SDj z8?OM*ij&6K1%-#1rUxhC$v@0qv82x|}7~yktriGXhOS$@kmD1UoWDB%ejBv6ws!O6YuL3u7BLd=)xK#HIec^=|W-`S?6%^gJ1G_E*H$ElPRk1!C>xH;1aZ z?&IxdZjHRgH#IqTpBNQo-mY)50ys;~6QME?*Kp0K@_4@_OlJ-AMtJ;xYrQgWfK`Q` W9B#s62XDVE0P4!xO6AY3KK&nQa9+d! From b3829b29537af544520e5650c970961ffb085966 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 5 Jul 2024 08:51:25 +0300 Subject: [PATCH 21/22] Update food.dmi --- icons/obj/food.dmi | Bin 125018 -> 131651 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 65caa7970afabbc80be4594e056125123664d7d2..a8b890e50959e3e88e53ceaa63f7eb8a4b41d7e8 100644 GIT binary patch literal 131651 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%0DBYLYHp*5)`$rK4^L_$J> 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

?mL4J4e|pkcCH{uG=#C1qN>J@Am_|yhby;k~deA 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 OFG*23kuo8D-~R!S8ycqo literal 125018 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 z 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�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 From 9538f2f249da5b6f7858e0425b173ef053851482 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 5 Jul 2024 08:51:59 +0300 Subject: [PATCH 22/22] Update unsorted.dm --- .../reagent_containers/food/unsorted.dm | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/code/modules/reagents/reagent_containers/food/unsorted.dm b/code/modules/reagents/reagent_containers/food/unsorted.dm index 761938b1bd2..24139d62be8 100644 --- a/code/modules/reagents/reagent_containers/food/unsorted.dm +++ b/code/modules/reagents/reagent_containers/food/unsorted.dm @@ -334,6 +334,8 @@ 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, @@ -2002,8 +2004,8 @@ /obj/item/reagent_containers/food/rawbacon name = "raw bacon" desc = "A thin slice of pork." - icon = 'icons/obj/food.dmi' - icon_state = "bacon" + 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 @@ -2012,6 +2014,7 @@ 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" icon_state = "bacon" bitesize = 2 startswith = list(/datum/reagent/nutriment/cornoil=5,/datum/reagent/nutriment/protein=10) @@ -2131,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"