From 886ab7228930c2a082aca880ab2d1c9ab0560dfb Mon Sep 17 00:00:00 2001 From: Rykka Date: Wed, 22 Jul 2020 21:34:13 -0400 Subject: [PATCH] Huge Bundle of Fixes, Update Cooking to current Aurora Cooking times are now no longer 10-15 minutes per item, the LARGEST items will take around ~4-5 minutes, 6 at the maximum in the case of the superbigbite (one of the most filling food items in the game). Cooking oil tanks added Appliances are now constructible instead of being eldritch black magic Recipes are now reorganized to either fryer/oven/grill based on where they're made (Although recipes_microwave still needs a LOT more sorting) Critical time bug with cooking fixed, AND you can now upgrade your appliances for even higher efficiencies! --- code/datums/supplypacks/hospitality.dm | 7 + code/game/machinery/frame.dm | 25 ++ .../items/weapons/circuitboards/frame.dm | 20 -- .../machinery/kitchen_appliances.dm | 74 ++++++ code/modules/food/food/snacks.dm | 2 +- .../kitchen/cooking_machines/_appliance.dm | 50 ++-- .../food/kitchen/cooking_machines/_cooker.dm | 33 ++- .../food/kitchen/cooking_machines/_mixer.dm | 2 +- .../food/kitchen/cooking_machines/candy.dm | 3 +- .../food/kitchen/cooking_machines/cereal.dm | 3 +- .../kitchen/cooking_machines/container.dm | 9 + .../food/kitchen/cooking_machines/fryer.dm | 8 +- .../food/kitchen/cooking_machines/grill.dm | 30 ++- .../food/kitchen/cooking_machines/oven.dm | 23 +- code/modules/food/kitchen/microwave.dm | 31 ++- code/modules/food/recipe.dm | 90 ++++--- code/modules/food/recipes_fryer.dm | 16 +- code/modules/food/recipes_grill.dm | 231 ++++++++++++++++++ code/modules/food/recipes_microwave.dm | 228 +---------------- code/modules/food/recipes_microwave_vr.dm | 86 +------ code/modules/food/recipes_oven.dm | 14 +- .../living/silicon/robot/drone/drone_items.dm | 4 +- code/modules/reagents/Chemistry-Holder.dm | 28 +++ .../research/designs/circuits/circuits.dm | 37 ++- icons/obj/objects.dmi | Bin 131417 -> 132559 bytes vorestation.dme | 2 + 26 files changed, 607 insertions(+), 449 deletions(-) create mode 100644 code/game/objects/items/weapons/circuitboards/machinery/kitchen_appliances.dm create mode 100644 code/modules/food/recipes_grill.dm diff --git a/code/datums/supplypacks/hospitality.dm b/code/datums/supplypacks/hospitality.dm index 6547b25e70..fa7f09ebd9 100644 --- a/code/datums/supplypacks/hospitality.dm +++ b/code/datums/supplypacks/hospitality.dm @@ -45,6 +45,13 @@ cost = 10 containertype = /obj/structure/closet/crate containername = "crate of bar supplies" + +/datum/supply_pack/hospitality/cookingoil + name = "Cooking oil tank crate" + contains = list(/obj/structure/reagent_dispensers/cookingoil) + cost = 10 + containertype = /obj/structure/largecrate + containername = "cooking oil tank crate" /datum/supply_pack/randomised/hospitality/ group = "Hospitality" diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 17cbfcfe53..601d65a616 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -81,6 +81,31 @@ frame_class = FRAME_CLASS_MACHINE frame_size = 4 +/datum/frame/frame_types/oven + name = "Oven" + frame_class = FRAME_CLASS_MACHINE + frame_size = 4 + +/datum/frame/frame_types/fryer + name = "Fryer" + frame_class = FRAME_CLASS_MACHINE + frame_size = 4 + +/datum/frame/frame_types/grill + name = "Grill" + frame_class = FRAME_CLASS_MACHINE + frame_size = 4 + +/datum/frame/frame_types/cerealmaker + name = "Cereal Maker" + frame_class = FRAME_CLASS_MACHINE + frame_size = 4 + +/datum/frame/frame_types/candymachine + name = "Candy Machine" + frame_class = FRAME_CLASS_MACHINE + frame_size = 4 + /datum/frame/frame_types/fax name = "Fax" frame_class = FRAME_CLASS_MACHINE diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 5bd472be6c..e9c0ee728a 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -121,16 +121,6 @@ /obj/item/weapon/stock_parts/motor = 2, /obj/item/stack/cable_coil = 5) -/obj/item/weapon/circuitboard/microwave - name = T_BOARD("microwave") - build_path = /obj/machinery/microwave - board_type = new /datum/frame/frame_types/microwave - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - req_components = list( - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/motor = 1, - /obj/item/weapon/stock_parts/capacitor = 1) - /obj/item/weapon/circuitboard/recharger name = T_BOARD("recharger") build_path = /obj/machinery/recharger @@ -250,13 +240,3 @@ /obj/item/weapon/stock_parts/spring = 1, /obj/item/stack/cable_coil = 5) -/obj/item/weapon/circuitboard/microwave/advanced - name = T_BOARD("deluxe microwave") - build_path = /obj/machinery/microwave/advanced - board_type = new /datum/frame/frame_types/microwave - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - req_components = list( - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/motor = 1, - /obj/item/weapon/stock_parts/capacitor = 1) - diff --git a/code/game/objects/items/weapons/circuitboards/machinery/kitchen_appliances.dm b/code/game/objects/items/weapons/circuitboards/machinery/kitchen_appliances.dm new file mode 100644 index 0000000000..1af9476aff --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/kitchen_appliances.dm @@ -0,0 +1,74 @@ +/obj/item/weapon/circuitboard/microwave + name = T_BOARD("microwave") + desc = "The circuitboard for a microwave." + build_path = /obj/machinery/microwave + board_type = new /datum/frame/frame_types/microwave + contain_parts = 0 + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + req_components = list( + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/capacitor = 3, // Original Capacitor count was 1 + /obj/item/weapon/stock_parts/motor = 1, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/matter_bin = 2) + +/obj/item/weapon/circuitboard/oven + name = T_BOARD("oven") + desc = "The circuitboard for an oven." + build_path = /obj/machinery/appliance/cooker/oven + board_type = new /datum/frame/frame_types/oven + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 3, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/matter_bin = 2) + +/obj/item/weapon/circuitboard/fryer + name = T_BOARD("deep fryer") + desc = "The circuitboard for a deep fryer." + build_path = /obj/machinery/appliance/cooker/fryer + board_type = new /datum/frame/frame_types/fryer + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 3, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/matter_bin = 2) + +/obj/item/weapon/circuitboard/grill + name = T_BOARD("grill") + desc = "The circuitboard for an industrial grill." + build_path = /obj/machinery/appliance/cooker/grill + board_type = new /datum/frame/frame_types/grill + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 3, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/matter_bin = 2) + +/obj/item/weapon/circuitboard/cerealmaker + name = T_BOARD("cereal maker") + desc = "The circuitboard for a cereal maker." + build_path = /obj/machinery/appliance/mixer/cereal + board_type = new /datum/frame/frame_types/cerealmaker + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 3, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/matter_bin = 2) + +/obj/item/weapon/circuitboard/candymachine + name = T_BOARD("candy machine") + desc = "The circuitboard for a candy machine." + build_path = /obj/machinery/appliance/mixer/candy + board_type = new /datum/frame/frame_types/candymachine + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 3, + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/matter_bin = 2) + +/obj/item/weapon/circuitboard/microwave/advanced + name = T_BOARD("deluxe microwave") + build_path = /obj/machinery/microwave/advanced + board_type = new /datum/frame/frame_types/microwave + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + req_components = list( + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/motor = 1, + /obj/item/weapon/stock_parts/capacitor = 1) \ No newline at end of file diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 77c4411ce2..abebd0b232 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -4366,7 +4366,7 @@ //Code for dipping food in batter /obj/item/weapon/reagent_containers/food/snacks/afterattack(obj/O as obj, mob/user as mob, proximity) - if(O.is_open_container() && O.reagents && !(istype(O, /obj/item/weapon/reagent_containers/food))) + if(O.is_open_container() && O.reagents && !(istype(O, /obj/item/weapon/reagent_containers/food)) && proximity) for (var/r in O.reagents.reagent_list) var/datum/reagent/R = r diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index a182d9edb2..265b0c95bc 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -16,10 +16,10 @@ use_power = USE_POWER_IDLE idle_power_usage = 5 // Power used when turned on, but not processing anything active_power_usage = 1000 // Power used when turned on and actively cooking something - var/initial_active_power_usage = 1000 - - var/cooking_power = 1 - var/initial_cooking_power = 1 + + var/cooking_power = 0 // Effectiveness/speed at cooking + var/cooking_coeff = 0 // Optimal power * proximity to optimal temp; used to calc. cooking power. + var/heating_power = 1000 // Effectiveness at heating up; not used for mixers, should be equal to active_power_usage var/max_contents = 1 // Maximum number of things this appliance can simultaneously cook var/on_icon // Icon state used when cooking. var/off_icon // Icon state used when not cooking. @@ -29,7 +29,7 @@ var/mobdamagetype = BRUTE // Burn damage for cooking appliances, brute for cereal/candy var/food_color // Colour of resulting food item. var/cooked_sound = 'sound/machines/ding.ogg' // Sound played when cooking completes. - var/can_burn_food // Can the object burn food that is left inside? + 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/list/cooking_objs = list() // List of things being cooked @@ -40,18 +40,13 @@ var/container_type = null - var/combine_first = 0//If 1, this appliance will do combinaiton cooking before checking recipes + var/combine_first = FALSE // If TRUE, this appliance will do combination cooking before checking recipes /obj/machinery/appliance/Initialize() . = ..() - component_parts = list() - component_parts += /obj/item/weapon/circuitboard/cooking - component_parts += /obj/item/weapon/stock_parts/capacitor - component_parts += /obj/item/weapon/stock_parts/capacitor - component_parts += /obj/item/weapon/stock_parts/capacitor - component_parts += /obj/item/weapon/stock_parts/scanning_module - component_parts += /obj/item/weapon/stock_parts/matter_bin - component_parts += /obj/item/weapon/stock_parts/matter_bin + + default_apply_parts() + if(output_options.len) verbs += /obj/machinery/appliance/proc/choose_output @@ -228,7 +223,7 @@ else if(istype(check, /obj/item/weapon/disk/nuclear)) to_chat(user, "You can't cook that.") return 0 - else if(I.is_crowbar() || I.is_screwdriver()) // You can't cook tools, dummy. + else if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) // You can't cook tools, dummy. return 0 else if(!istype(check) && !istype(check, /obj/item/weapon/holder)) to_chat(user, "That's not edible.") @@ -301,7 +296,7 @@ /obj/machinery/appliance/proc/get_cooking_work(var/datum/cooking_item/CI) for (var/obj/item/J in CI.container) - oilwork(J, CI) + cookwork_by_item(J, CI) for (var/r in CI.container.reagents.reagent_list) var/datum/reagent/R = r @@ -328,7 +323,7 @@ CI.max_cookwork += buffer*multiplier //Just a helper to save code duplication in the above -/obj/machinery/appliance/proc/oilwork(var/obj/item/I, var/datum/cooking_item/CI) +/obj/machinery/appliance/proc/cookwork_by_item(var/obj/item/I, var/datum/cooking_item/CI) var/obj/item/weapon/reagent_containers/food/snacks/S = I var/work = 0 if (istype(S)) @@ -725,18 +720,13 @@ for(var/obj/item/weapon/stock_parts/P in src.component_parts) if(istype(P, /obj/item/weapon/stock_parts/scanning_module)) - scan_rating += P.rating + scan_rating += P.rating - 1 // Default parts shouldn't mess with stats + // to_world("RefreshParts returned scan rating of [scan_rating] during this step.") // Debug lines, uncomment if you need to test. else if(istype(P, /obj/item/weapon/stock_parts/capacitor)) - cap_rating += P.rating + cap_rating += P.rating - 1 // Default parts shouldn't mess with stats + // to_world("RefreshParts returned cap rating of [cap_rating] during this step.") // Debug lines, uncomment if you need to test. - active_power_usage = initial(active_power_usage) - scan_rating*10 - cooking_power = initial(cooking_power) + (scan_rating+cap_rating)/10 - -/obj/item/weapon/circuitboard/cooking - name = "kitchen appliance circuitry" - desc = "The circuitboard for many kitchen appliances. Not of much use." - origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) - req_components = list( - /obj/item/weapon/stock_parts/capacitor = 3, - /obj/item/weapon/stock_parts/scanning_module = 1, - /obj/item/weapon/stock_parts/matter_bin = 2) \ No newline at end of file + active_power_usage = initial(active_power_usage) - scan_rating * 25 + heating_power = initial(heating_power) + cap_rating * 25 + cooking_power = cooking_coeff * (1 + (scan_rating + cap_rating) / 20) // 100% eff. becomes 120%, 140%, 160% w/ better parts, thus rewarding upgrading the appliances during your shift. + // to_world("RefreshParts returned cooking power of [cooking_power] during this step.") // Debug lines, uncomment if you need to test. diff --git a/code/modules/food/kitchen/cooking_machines/_cooker.dm b/code/modules/food/kitchen/cooking_machines/_cooker.dm index d67c0819c3..1e7193f166 100644 --- a/code/modules/food/kitchen/cooking_machines/_cooker.dm +++ b/code/modules/food/kitchen/cooking_machines/_cooker.dm @@ -2,27 +2,29 @@ var/temperature = T20C var/min_temp = 80 + T0C //Minimum temperature to do any cooking var/optimal_temp = 200 + T0C //Temperature at which we have 100% efficiency. efficiency is lowered on either side of this - var/optimal_power = 0.1//cooking power at 100% + var/optimal_power = 0.6 //cooking power at 100% - This variable determines the MAXIMUM increase in do_cooking_ticks, once math goes through. If you want ticks of 0.5, set it to 0.5, etc. var/loss = 1 //Temp lost per proc when equalising - var/resistance = 32000 //Resistance to heating. combines with active power usage to determine how long heating takes. 32k by default. + var/resistance = 32000 //Resistance to heating. combines with heating power to determine how long heating takes. 32k by default. var/light_x = 0 var/light_y = 0 + cooking_coeff = 0 cooking_power = 0 mobdamagetype = BURN + can_burn_food = TRUE /obj/machinery/appliance/cooker/examine(var/mob/user) . = ..() if(.) //no need to duplicate adjacency check if(!stat) if (temperature < min_temp) - to_chat(user, span("warning", "\The [src] is still heating up and is too cold to cook anything yet.")) + to_chat(user, "\The [src] is still heating up and is too cold to cook anything yet.") else - to_chat(user, span("notice", "It is running at [round(get_efficiency(), 0.1)]% efficiency!")) + to_chat(user, "It is running at [round(get_efficiency(), 0.1)]% efficiency!") to_chat(user, "Temperature: [round(temperature - T0C, 0.1)]C / [round(optimal_temp - T0C, 0.1)]C") else - to_chat(user, span("warning", "It is switched off.")) + to_chat(user, "It is switched off.") /obj/machinery/appliance/cooker/list_contents(var/mob/user) if (cooking_objs.len) @@ -35,10 +37,10 @@ string += "- [CI.container.label(num)], [report_progress(CI)]
" to_chat(user, string) else - to_chat(user, span("notice","It is empty.")) + to_chat(user, "It's empty.") /obj/machinery/appliance/cooker/proc/get_efficiency() - //RefreshParts() + // to_world("Our cooking_power is [cooking_power] and our efficiency is [(cooking_power / optimal_power) * 100].") // Debug lines, uncomment if you need to test. return (cooking_power / optimal_power) * 100 /obj/machinery/appliance/cooker/Initialize() @@ -80,16 +82,25 @@ /obj/machinery/appliance/cooker/proc/update_cooking_power() var/temp_scale = 0 if(temperature > min_temp) + if(temperature >= optimal_temp) // If we're at or above optimal temp, then we're going to be at 1 for temp scale. No use penalizing you for the cookers increasing heat constantly (until we implement setting a temp on the oven via a menu.) + temp_scale = 1 + else + temp_scale = (temperature - min_temp) / (optimal_temp - min_temp) // If we're between min and optimal this will yield a value in the range 0-1 + + /* // old code for reference, will be useful if/when we implement ovens with configurable temperatures - TODO recipes with optimal temps for cooking per-recipe?? temp_scale = (temperature - min_temp) / (optimal_temp - min_temp) // If we're between min and optimal this will yield a value in the range 0-1 - + if(temp_scale > 1) // We're above optimal, efficiency goes down as we pass too much over it if(temp_scale >= 2) temp_scale = 0 else temp_scale = 1 - (temp_scale - 1) + */ - cooking_power = optimal_power * temp_scale - // RefreshParts() + cooking_coeff = optimal_power * temp_scale + // to_world("Our cooking_power is [cooking_power] and our tempscale is [temp_scale], and our cooking_coeff is [cooking_coeff] before RefreshParts.") // Debug lines, uncomment if you need to test. + RefreshParts() + // to_world("Our cooking_power is [cooking_power] after RefreshParts.") // Debug lines, uncomment if you need to test. /obj/machinery/appliance/cooker/proc/heat_up() if(temperature < optimal_temp) @@ -97,7 +108,7 @@ playsound(src, 'sound/machines/click.ogg', 20, 1) use_power = 2.//If we're heating we use the active power update_icon() - temperature += active_power_usage / resistance + temperature += heating_power / resistance update_cooking_power() return 1 else diff --git a/code/modules/food/kitchen/cooking_machines/_mixer.dm b/code/modules/food/kitchen/cooking_machines/_mixer.dm index aee823befd..18b75998d9 100644 --- a/code/modules/food/kitchen/cooking_machines/_mixer.dm +++ b/code/modules/food/kitchen/cooking_machines/_mixer.dm @@ -10,7 +10,7 @@ fundamental differences /obj/machinery/appliance/mixer max_contents = 1 stat = POWEROFF - cooking_power = 0.4 + cooking_coeff = 0.75 // Original value 0.4 active_power_usage = 3000 idle_power_usage = 50 diff --git a/code/modules/food/kitchen/cooking_machines/candy.dm b/code/modules/food/kitchen/cooking_machines/candy.dm index bbf1808ba1..21f8fdf715 100644 --- a/code/modules/food/kitchen/cooking_machines/candy.dm +++ b/code/modules/food/kitchen/cooking_machines/candy.dm @@ -6,7 +6,8 @@ on_icon = "mixer_on" cook_type = "candied" appliancetype = CANDYMAKER - cooking_power = 0.6 + circuit = /obj/item/weapon/circuitboard/candymachine + cooking_coeff = 1.0 // Original Value 0.6 output_options = list( "Jawbreaker" = /obj/item/weapon/reagent_containers/food/snacks/variable/jawbreaker, diff --git a/code/modules/food/kitchen/cooking_machines/cereal.dm b/code/modules/food/kitchen/cooking_machines/cereal.dm index 112f988de2..4e272e4773 100644 --- a/code/modules/food/kitchen/cooking_machines/cereal.dm +++ b/code/modules/food/kitchen/cooking_machines/cereal.dm @@ -7,11 +7,12 @@ on_icon = "cereal_on" off_icon = "cereal_off" appliancetype = CEREALMAKER + circuit = /obj/item/weapon/circuitboard/cerealmaker output_options = list( "Cereal" = /obj/item/weapon/reagent_containers/food/snacks/variable/cereal ) - + /* /obj/machinery/appliance/mixer/cereal/change_product_strings(var/obj/item/weapon/reagent_containers/food/snacks/product, var/datum/cooking_item/CI) . = ..() diff --git a/code/modules/food/kitchen/cooking_machines/container.dm b/code/modules/food/kitchen/cooking_machines/container.dm index 4fc015668f..2ebb2ed7f0 100644 --- a/code/modules/food/kitchen/cooking_machines/container.dm +++ b/code/modules/food/kitchen/cooking_machines/container.dm @@ -150,6 +150,15 @@ max_space = 30 max_reagents = 120 +/obj/item/weapon/reagent_containers/cooking_container/oven/Initialize() + . = ..() + + // We add to the insertable list specifically for the oven trays, to allow specialty cakes. + insertable += list( + /obj/item/clothing/head/cakehat, // This is because we want to allow birthday cakes to be makeable. + /obj/item/organ/internal/brain // As before, needed for braincake + ) + /obj/item/weapon/reagent_containers/cooking_container/fryer name = "fryer basket" shortname = "basket" diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm index 14606e14bc..f3ab3df0bb 100644 --- a/code/modules/food/kitchen/cooking_machines/fryer.dm +++ b/code/modules/food/kitchen/cooking_machines/fryer.dm @@ -9,18 +9,20 @@ food_color = "#FFAD33" cooked_sound = 'sound/machines/ding.ogg' var/datum/looping_sound/deep_fryer/fry_loop + circuit = /obj/item/weapon/circuitboard/fryer appliancetype = FRYER active_power_usage = 12 KILOWATTS + heating_power = 12000 min_temp = 140 + T0C // Same as above, increasing this to just under 2x to make the % increase on efficiency not quite so painful as it would be at 80. optimal_temp = 400 + T0C // Increasing this to be 2x Oven to allow for a much higher/realistic frying temperatures. Doesn't really do anything but make heating the fryer take a bit longer. - optimal_power = 0.35 + optimal_power = 0.95 // .35 higher than the default to give fryers faster cooking speed. idle_power_usage = 3.6 KILOWATTS // Power used to maintain temperature once it's heated. // Going with 25% of the active power. This is a somewhat arbitrary value. - resistance = 20000 // Approx. 8-9 minutes to heat up. + resistance = 60000 // Approx. 10 minutes to heat up. max_contents = 2 container_type = /obj/item/weapon/reagent_containers/cooking_container/fryer @@ -29,7 +31,7 @@ var/datum/reagents/oil var/optimal_oil = 9000 //90 litres of cooking oil - + /obj/machinery/appliance/cooker/fryer/Initialize() . = ..() fry_loop = new(list(src), FALSE) diff --git a/code/modules/food/kitchen/cooking_machines/grill.dm b/code/modules/food/kitchen/cooking_machines/grill.dm index 19bccda35b..6db3c89331 100644 --- a/code/modules/food/kitchen/cooking_machines/grill.dm +++ b/code/modules/food/kitchen/cooking_machines/grill.dm @@ -3,24 +3,29 @@ desc = "Backyard grilling, IN SPACE." icon_state = "grill_off" cook_type = "grilled" + appliancetype = GRILL food_color = "#A34719" on_icon = "grill_on" off_icon = "grill_off" - can_burn_food = 1 - stat = POWEROFF - - appliancetype = GRILL - + can_burn_food = TRUE + circuit = /obj/item/weapon/circuitboard/grill active_power_usage = 4 KILOWATTS + heating_power = 4000 idle_power_usage = 2 KILOWATTS + + optimal_power = 1.2 // Things on the grill cook .6 faster - this is now the fastest appliance to heat and to cook on. BURGERS GO SIZZLE. + + stat = POWEROFF // Starts turned off. // Grill is faster to heat and setup than the rest. optimal_temp = 120 + T0C min_temp = 60 + T0C resistance = 8 KILOWATTS // Very fast to heat up. + max_contents = 3 // Arbitrary number, 3 grill 'racks' container_type = /obj/item/weapon/reagent_containers/cooking_container/grill +/* // Test Comment this out too, /cooker does this for us, and this path '/obj/machinery/appliance/grill' is invalid anyways, meaning it does jack shit. - Updated the paths, but I'm basically commenting all this shit out and if the grill works as-normal, none of this stuff is needed. /obj/machinery/appliance/grill/toggle_power() set src in view() set name = "Toggle Power" @@ -42,12 +47,13 @@ playsound(src, 'sound/machines/click.ogg', 40, 1) update_icon() -/obj/machinery/appliance/grill/Initialize() + +/obj/machinery/appliance/cooker/grill/Initialize() . = ..() // cooking_objs += new /datum/cooking_item(new /obj/item/weapon/reagent_containers/cooking_container(src)) cooking = FALSE -/obj/machinery/appliance/grill/has_space(var/obj/item/I) +/obj/machinery/appliance/cooker/grill/has_space(var/obj/item/I) var/datum/cooking_item/CI = cooking_objs[1] if (!CI || !CI.container) return 0 @@ -56,7 +62,8 @@ return CI return 0 - +*/ +/* // Test comment this out, I don't think this is doing shit anyways. //Container is not removable /obj/machinery/appliance/grill/removal_menu(var/mob/user) if (can_remove_items(user)) @@ -79,14 +86,17 @@ update_icon() return 1 return 0 +*/ -/obj/machinery/appliance/grill/update_icon() +/obj/machinery/appliance/grill/update_icon() // TODO: Cooking icon if(!stat) icon_state = on_icon else icon_state = off_icon +/* // Test remove this too. /obj/machinery/appliance/grill/process() if (!stat) for (var/i in cooking_objs) - do_cooking_tick(i) \ No newline at end of file + do_cooking_tick(i) +*/ \ No newline at end of file diff --git a/code/modules/food/kitchen/cooking_machines/oven.dm b/code/modules/food/kitchen/cooking_machines/oven.dm index 7f793d0050..1f471d2e2a 100644 --- a/code/modules/food/kitchen/cooking_machines/oven.dm +++ b/code/modules/food/kitchen/cooking_machines/oven.dm @@ -6,14 +6,16 @@ cook_type = "baked" appliancetype = OVEN food_color = "#A34719" - can_burn_food = 1 + can_burn_food = TRUE + circuit = /obj/item/weapon/circuitboard/oven active_power_usage = 6 KILOWATTS + heating_power = 6000 //Based on a double deck electric convection oven - resistance = 16000 + resistance = 30000 // Approx. 12 minutes to heat up. idle_power_usage = 2 KILOWATTS //uses ~30% power to stay warm - optimal_power = 0.2 + optimal_power = 0.8 // Oven cooks .2 faster than the default speed. light_x = 2 max_contents = 5 @@ -74,19 +76,27 @@ if(open) open = FALSE - loss = (active_power_usage / resistance)*0.5 + loss = (heating_power / resistance) * 0.5 cooking = TRUE else open = TRUE - loss = (active_power_usage / resistance)*4 + loss = (heating_power / resistance) * 4 //When the oven door is opened, heat is lost MUCH faster and you stop cooking (because the door is open) cooking = FALSE playsound(src, 'sound/machines/hatch_open.ogg', 20, 1) update_icon() + +/obj/machinery/appliance/cooker/oven/proc/manip(var/obj/item/I) + // check if someone's trying to manipulate the machine + + if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) + return TRUE + else + return FALSE /obj/machinery/appliance/cooker/oven/can_insert(var/obj/item/I, var/mob/user) - if(!open) + if(!open && !manip(I)) to_chat(user, "You can't put anything in while the door is closed!") return 0 @@ -117,6 +127,7 @@ /obj/machinery/appliance/cooker/oven/finish_cooking(var/datum/cooking_item/CI) if(CI.combine_target) CI.result_type = 3//Combination type. We're making something out of our ingredients + visible_message("\The [src] pings!") combination_cook(CI) return else diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 5fd6fa34b7..3e40412b1b 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -35,6 +35,7 @@ /obj/machinery/microwave/Initialize() . = ..() + reagents = new/datum/reagents(100) reagents.my_atom = src @@ -156,19 +157,27 @@ var/obj/item/weapon/grab/G = O to_chat(user, "This is ridiculous. You can not fit \the [G.affecting] in this [src].") return 1 + else if(O.is_screwdriver()) + default_deconstruction_screwdriver(user, O) + return else if(O.is_crowbar()) - user.visible_message( \ - "\The [user] begins [src.anchored ? "unsecuring" : "securing"] the microwave.", \ - "You attempt to [src.anchored ? "unsecure" : "secure"] the microwave." - ) - if (do_after(user,20)) - user.visible_message( \ - "\The [user] [src.anchored ? "unsecures" : "secures"] the microwave.", \ - "You [src.anchored ? "unsecure" : "secure"] the microwave." - ) - src.anchored = !src.anchored + if(default_deconstruction_crowbar(user, O)) + return else - to_chat(user, "You decide not to do that.") + user.visible_message( \ + "\The [user] begins [src.anchored ? "unsecuring" : "securing"] the microwave.", \ + "You attempt to [src.anchored ? "unsecure" : "secure"] the microwave." + ) + if (do_after(user,20/O.toolspeed)) + user.visible_message( \ + "\The [user] [src.anchored ? "unsecures" : "secures"] the microwave.", \ + "You [src.anchored ? "unsecure" : "secure"] the microwave." + ) + src.anchored = !src.anchored + else + to_chat(user, "You decide not to do that.") + else if(default_part_replacement(user, O)) + return else to_chat(user, "You have no idea what you can cook with this [O].") ..() diff --git a/code/modules/food/recipe.dm b/code/modules/food/recipe.dm index 6141defa09..982f511d14 100644 --- a/code/modules/food/recipe.dm +++ b/code/modules/food/recipe.dm @@ -193,25 +193,25 @@ if(!result) log_runtime(EXCEPTION("Recipe [type] is defined without a result, please bug report this.")) return - -// We will subtract all the ingredients from the container, and transfer their reagents into a holder -// We will not touch things which are not required for this recipe. They will be left behind for the caller -// to decide what to do. They may be used again to make another recipe or discarded, or merged into the results, -// thats no longer the concern of this proc - var/obj/temp = new /obj(src) - temp.create_reagents(999999999) - // Find items we need - if(items && items.len) +//We will subtract all the ingredients from the container, and transfer their reagents into a holder +//We will not touch things which are not required for this recipe. They will be left behind for the caller +//to decide what to do. They may be used again to make another recipe or discarded, or merged into the results, +//thats no longer the concern of this proc + var/datum/reagents/buffer = new /datum/reagents(10000000000, null)// + + + //Find items we need + if (items && items.len) for (var/i in items) var/obj/item/I = locate(i) in container if (I && I.reagents) - I.reagents.trans_to_holder(temp.reagents,I.reagents.total_volume) + I.reagents.trans_to_holder(buffer,I.reagents.total_volume) qdel(I) - // Find fruits - if(fruit && fruit.len) + //Find fruits + if (fruit && fruit.len) var/list/checklist = list() checklist = fruit.Copy() @@ -219,18 +219,18 @@ if(!G.seed || !G.seed.kitchen_tag || isnull(checklist[G.seed.kitchen_tag])) continue - if(checklist[G.seed.kitchen_tag] > 0) + if (checklist[G.seed.kitchen_tag] > 0) //We found a thing we need checklist[G.seed.kitchen_tag]-- - if(G && G.reagents) - G.reagents.trans_to_holder(temp.reagents,G.reagents.total_volume) + if (G && G.reagents) + G.reagents.trans_to_holder(buffer,G.reagents.total_volume) qdel(G) - // And lastly deduct necessary quantities of reagents - if(reagents && reagents.len) + //And lastly deduct necessary quantities of reagents + if (reagents && reagents.len) for (var/r in reagents) - // Doesnt matter whether or not there's enough, we assume that check is done before - container.reagents.trans_id_to(temp, r, reagents[r]) + //Doesnt matter whether or not there's enough, we assume that check is done before + container.reagents.trans_type_to(buffer, r, reagents[r]) /* Now we've removed all the ingredients that were used and we have the buffer containing the total of @@ -244,64 +244,62 @@ If, as in the most common case, there is only a single result, then it will just be a reference to the single-result's reagents */ - var/obj/tempholder = new(src) - tempholder.create_reagents(999999999) + var/datum/reagents/holder = new/datum/reagents(10000000000) var/list/results = list() while (tally < result_quantity) var/obj/result_obj = new result(container) results.Add(result_obj) - if(!result_obj.reagents)//This shouldn't happen + if (!result_obj.reagents)//This shouldn't happen //If the result somehow has no reagents defined, then create a new holder - log_runtime(EXCEPTION("[result_obj] had no reagents!")) - result_obj.create_reagents(temp.reagents.total_volume*1.5) + result_obj.reagents = new /datum/reagents(buffer.total_volume*1.5, result_obj) - if(result_quantity == 1) - qdel(tempholder.reagents) - tempholder.reagents = result_obj.reagents + if (result_quantity == 1) + qdel(holder) + holder = result_obj.reagents else - log_runtime(EXCEPTION("[result_quantity] was greater than 1! Check [result_obj]!")) - result_obj.reagents.trans_to(tempholder.reagents, result_obj.reagents.total_volume) + result_obj.reagents.trans_to(holder, result_obj.reagents.total_volume) tally++ switch(reagent_mix) - if(RECIPE_REAGENT_REPLACE) + if (RECIPE_REAGENT_REPLACE) //We do no transferring - if(RECIPE_REAGENT_SUM) + if (RECIPE_REAGENT_SUM) //Sum is easy, just shove the entire buffer into the result - temp.reagents.trans_to_holder(tempholder.reagents, temp.reagents.total_volume) - if(RECIPE_REAGENT_MAX) + buffer.trans_to_holder(holder, buffer.total_volume) + if (RECIPE_REAGENT_MAX) //We want the highest of each. //Iterate through everything in buffer. If the target has less than the buffer, then top it up - for (var/datum/reagent/R in temp.reagents.reagent_list) - var/rvol = tempholder.reagents.get_reagent_amount(R.id) + for (var/datum/reagent/R in buffer.reagent_list) + var/rvol = holder.get_reagent_amount(R.type) if (rvol < R.volume) //Transfer the difference - temp.reagents.trans_id_to(tempholder, R.id, R.volume-rvol) + buffer.trans_type_to(holder, R.type, R.volume-rvol) - if(RECIPE_REAGENT_MIN) + if (RECIPE_REAGENT_MIN) //Min is slightly more complex. We want the result to have the lowest from each side //But zero will not count. Where a side has zero its ignored and the side with a nonzero value is used - for (var/datum/reagent/R in temp.reagents.reagent_list) - var/rvol = tempholder.reagents.get_reagent_amount(R.id) - if(rvol == 0) //If the target has zero of this reagent - temp.reagents.trans_id_to(tempholder, R.id, R.volume) + for (var/datum/reagent/R in buffer.reagent_list) + var/rvol = holder.get_reagent_amount(R.type) + if (rvol == 0) //If the target has zero of this reagent + buffer.trans_type_to(holder, R.type, R.volume) //Then transfer all of ours - else if(rvol > R.volume) + else if (rvol > R.volume) //if the target has more than ours //Remove the difference - tempholder.reagents.remove_reagent(R.id, rvol-R.volume) + holder.remove_reagent(R.type, rvol-R.volume) - if(results.len > 1) + if (results.len > 1) //If we're here, then holder is a buffer containing the total reagents for all the results. //So now we redistribute it among them - var/total = tempholder.reagents.total_volume + var/total = holder.total_volume for (var/i in results) var/atom/a = i //optimisation - tempholder.reagents.trans_to(a, total / results.len) + holder.trans_to(a, total / results.len) + return results // When exact is false, extraneous ingredients are ignored diff --git a/code/modules/food/recipes_fryer.dm b/code/modules/food/recipes_fryer.dm index 82a6bae362..3328663be6 100644 --- a/code/modules/food/recipes_fryer.dm +++ b/code/modules/food/recipes_fryer.dm @@ -77,28 +77,36 @@ //Sweet Recipes. //================== +// All donuts were given reagents of 5 to equal old recipes and make for faster cook times. /datum/recipe/jellydonut appliance = FRYER - reagents = list("berryjuice" = 10, "sugar" = 10) + reagents = list("berryjuice" = 5, "sugar" = 5) items = list( /obj/item/weapon/reagent_containers/food/snacks/doughslice ) result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly result_quantity = 2 + +/datum/recipe/jellydonut/poisonberry + reagents = list("poisonberryjuice" = 5, "sugar" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/dough + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donut/poisonberry /datum/recipe/jellydonut/slime appliance = FRYER - reagents = list("slimejelly" = 10, "sugar" = 10) + reagents = list("slimejelly" = 5, "sugar" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly /datum/recipe/jellydonut/cherry appliance = FRYER - reagents = list("cherryjelly" = 10, "sugar" = 10) + reagents = list("cherryjelly" = 5, "sugar" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly /datum/recipe/donut appliance = FRYER - reagents = list("sugar" = 10) + reagents = list("sugar" = 5) items = list( /obj/item/weapon/reagent_containers/food/snacks/doughslice ) diff --git a/code/modules/food/recipes_grill.dm b/code/modules/food/recipes_grill.dm new file mode 100644 index 0000000000..6f84348655 --- /dev/null +++ b/code/modules/food/recipes_grill.dm @@ -0,0 +1,231 @@ +/datum/recipe/humanburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + /obj/item/weapon/reagent_containers/food/snacks/bun + ) + result = /obj/item/weapon/reagent_containers/food/snacks/human/burger + +/datum/recipe/plainburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/meat //do not place this recipe before /datum/recipe/humanburger + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger + +/datum/recipe/syntiburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger + +/datum/recipe/brainburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/organ/internal/brain + ) + result = /obj/item/weapon/reagent_containers/food/snacks/brainburger + +/datum/recipe/roburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/robot_parts/head + ) + result = /obj/item/weapon/reagent_containers/food/snacks/roburger + +/datum/recipe/xenoburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/xenomeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/xenoburger + +/datum/recipe/fishburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/fishburger + +/datum/recipe/tofuburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/tofu + ) + result = /obj/item/weapon/reagent_containers/food/snacks/tofuburger + +/datum/recipe/ghostburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/ectoplasm //where do you even find this stuff + ) + result = /obj/item/weapon/reagent_containers/food/snacks/ghostburger + +/datum/recipe/clownburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/clothing/mask/gas/clown_hat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/clownburger + +/datum/recipe/mimeburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/clothing/head/beret + ) + result = /obj/item/weapon/reagent_containers/food/snacks/mimeburger + +/datum/recipe/mouseburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/holder/mouse + ) + result = /obj/item/weapon/reagent_containers/food/snacks/mouseburger + +/datum/recipe/bunbun + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/bun + ) + result = /obj/item/weapon/reagent_containers/food/snacks/bunbun + +/datum/recipe/hotdog + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/sausage + ) + result = /obj/item/weapon/reagent_containers/food/snacks/hotdog + +/datum/recipe/humankabob + appliance = GRILL + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + /obj/item/weapon/reagent_containers/food/snacks/meat/human, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/human/kabob + +/datum/recipe/kabob //Do not put before humankabob + appliance = GRILL + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob + +/datum/recipe/monkeykabob + appliance = GRILL + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/meat/monkey, + /obj/item/weapon/reagent_containers/food/snacks/meat/monkey + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob + +/datum/recipe/syntikabob + appliance = GRILL + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob + +/datum/recipe/tofukabob + appliance = GRILL + items = list( + /obj/item/stack/rods, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob + +/datum/recipe/spellburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, + /obj/item/clothing/head/wizard/fake, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/spellburger + +/datum/recipe/spellburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, + /obj/item/clothing/head/wizard, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/spellburger + +/datum/recipe/bigbiteburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + ) + reagents = list("egg" = 3) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger + +/datum/recipe/superbiteburger + appliance = GRILL + fruit = list("tomato" = 1) + reagents = list("sodiumchloride" = 5, "blackpepper" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger, + /obj/item/weapon/reagent_containers/food/snacks/dough, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/boiledegg, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/superbiteburger + +/datum/recipe/slimeburger + appliance = GRILL + reagents = list("slimejelly" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun + ) + result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime + +/datum/recipe/jellyburger + appliance = GRILL + reagents = list("cherryjelly" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun + ) + result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry + +/datum/recipe/bearburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/bearmeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/bearburger + +/datum/recipe/baconburger + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bun, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/bacon, + /obj/item/weapon/reagent_containers/food/snacks/bacon + ) + result = /obj/item/weapon/reagent_containers/food/snacks/burger/bacon \ No newline at end of file diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 312691e284..974a661192 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -43,47 +43,7 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/devilledegg -/datum/recipe/dionaroast - fruit = list("apple" = 1) - reagents = list("pacid" = 5) //It dissolves the carapace. Still poisonous, though. - items = list(/obj/item/weapon/holder/diona) - result = /obj/item/weapon/reagent_containers/food/snacks/dionaroast -/* // These should be fryer recipes, as should the other donuts, TODO Conversions -/datum/recipe/jellydonut - reagents = list("berryjuice" = 5, "sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/jelly - -/datum/recipe/jellydonut/poisonberry - reagents = list("poisonberryjuice" = 5, "sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/poisonberry - -/datum/recipe/jellydonut/slime - reagents = list("slimejelly" = 5, "sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly - -/datum/recipe/jellydonut/cherry - reagents = list("cherryjelly" = 5, "sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly - -/datum/recipe/donut - reagents = list("sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/normal -*/ +/* // Test remove these in favor of grillin' on the grill, bby. /datum/recipe/humanburger items = list( /obj/item/weapon/reagent_containers/food/snacks/meat/human, @@ -167,6 +127,7 @@ I said no! /obj/item/weapon/holder/mouse ) result = /obj/item/weapon/reagent_containers/food/snacks/mouseburger +*/ /datum/recipe/bunbun items = list( @@ -211,44 +172,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL -/datum/recipe/meatbread - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread - -/datum/recipe/xenomeatbread - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread - -/datum/recipe/bananabread - fruit = list("banana" = 1) - reagents = list("milk" = 5, "sugar" = 15) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread - /datum/recipe/omelette items = list( /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, @@ -289,41 +212,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen -/datum/recipe/meatpie - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/weapon/reagent_containers/food/snacks/meat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatpie - -/datum/recipe/tofupie - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/weapon/reagent_containers/food/snacks/tofu, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/tofupie - -/datum/recipe/xemeatpie - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/weapon/reagent_containers/food/snacks/xenomeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/xemeatpie - -/datum/recipe/pie - fruit = list("banana" = 1) - reagents = list("sugar" = 5) - items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) - result = /obj/item/weapon/reagent_containers/food/snacks/pie - -/datum/recipe/cherrypie - fruit = list("cherries" = 1) - reagents = list("sugar" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cherrypie - /datum/recipe/berryclafoutis fruit = list("berries" = 1) items = list( @@ -344,14 +232,8 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/xenomeat ) result = /obj/item/weapon/reagent_containers/food/snacks/wingfangchu -/* - TODO: Port this to Fryer -/datum/recipe/chaosdonut - reagents = list("frostoil" = 5, "capsaicin" = 5, "sugar" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos -*/ + +/* // Test remove these in favor of grillin' on the grill, bby. /datum/recipe/humankabob items = list( /obj/item/stack/rods, @@ -391,6 +273,7 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/tofu, ) result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob +*/ /datum/recipe/tofubread items = list( @@ -593,16 +476,7 @@ I said no! items = list(/obj/item/weapon/reagent_containers/food/snacks/meat) result = /obj/item/weapon/reagent_containers/food/snacks/coldchili -/datum/recipe/amanita_pie - reagents = list("amatoxin" = 5) - items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) - result = /obj/item/weapon/reagent_containers/food/snacks/amanita_pie - -/datum/recipe/plump_pie - fruit = list("plumphelmet" = 1) - items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) - result = /obj/item/weapon/reagent_containers/food/snacks/plump_pie - +/* // Testremove to swap to grill /datum/recipe/spellburger items = list( /obj/item/weapon/reagent_containers/food/snacks/monkeyburger, @@ -627,7 +501,7 @@ I said no! reagents = list("egg" = 3) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger - +*/ /datum/recipe/enchiladas fruit = list("chili" = 2, "corn" = 1) items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet) @@ -808,7 +682,7 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/meatball, ) result = /obj/item/weapon/reagent_containers/food/snacks/spesslaw - +/* /datum/recipe/superbiteburger fruit = list("tomato" = 1) reagents = list("sodiumchloride" = 5, "blackpepper" = 5) @@ -820,7 +694,7 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/boiledegg, ) result = /obj/item/weapon/reagent_containers/food/snacks/superbiteburger - +*/ /datum/recipe/candiedapple fruit = list("apple" = 1) reagents = list("water" = 5, "sugar" = 5) @@ -942,11 +816,6 @@ I said no! reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/mysterysoup -/datum/recipe/pumpkinpie - fruit = list("pumpkin" = 1) - reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie - /datum/recipe/plumphelmetbiscuit fruit = list("plumphelmet" = 1) reagents = list("water" = 5, "flour" = 5) @@ -972,14 +841,6 @@ I said no! reagents = list("water" = 10) result = /obj/item/weapon/reagent_containers/food/snacks/beetsoup -/datum/recipe/appletart - fruit = list("goldapple" = 1) - reagents = list("sugar" = 5, "milk" = 5, "flour" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg - ) - result = /obj/item/weapon/reagent_containers/food/snacks/appletart - /datum/recipe/tossedsalad fruit = list("cabbage" = 2, "tomato" = 1, "carrot" = 1, "apple" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/tossedsalad @@ -1012,13 +873,6 @@ I said no! for (var/obj/item/weapon/reagent_containers/food/snacks/validsalad/being_cooked in .) being_cooked.reagents.del_reagent("toxin") -/datum/recipe/cracker - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cracker - /datum/recipe/stuffing reagents = list("water" = 5, "sodiumchloride" = 1, "blackpepper" = 1) items = list( @@ -1292,64 +1146,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/piginblanket -// Cakes. -/datum/recipe/cake - reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9, "vanilla" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake - -/datum/recipe/cake/carrot - fruit = list("carrot" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake - -/datum/recipe/cake/cheese - reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake - -/datum/recipe/cake/peanut - fruit = list("peanut" = 3) - reagents = list("milk" = 5, "flour" = 10, "sugar" = 5, "egg" = 6, "peanutbutter" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake - -/datum/recipe/cake/orange - fruit = list("orange" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake - -/datum/recipe/cake/lime - fruit = list("lime" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake - -/datum/recipe/cake/lemon - fruit = list("lemon" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake - -/datum/recipe/cake/chocolate - items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake - -/datum/recipe/cake/birthday - reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) - items = list(/obj/item/clothing/head/cakehat) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake - -/datum/recipe/cake/apple - fruit = list("apple" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake - -/datum/recipe/cake/brain - reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) - items = list(/obj/item/organ/internal/brain) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake - /datum/recipe/bagelplain reagents = list("water" = 5) items = list( @@ -1439,13 +1235,14 @@ I said no! fruit = list("peanut" = 2, "potato" = 1) reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/weapon/reagent_containers/food/snacks/yellowcurry - +/* /datum/recipe/bearburger items = list( /obj/item/weapon/reagent_containers/food/snacks/bun, /obj/item/weapon/reagent_containers/food/snacks/bearmeat ) result = /obj/item/weapon/reagent_containers/food/snacks/bearburger +*/ /datum/recipe/bearchili fruit = list("chili" = 1, "tomato" = 1) @@ -1808,7 +1605,7 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/friedegg ) result = /obj/item/weapon/reagent_containers/food/snacks/bacon_and_eggs - +/* /datum/recipe/baconburger items = list( /obj/item/weapon/reagent_containers/food/snacks/bun, @@ -1817,6 +1614,7 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/bacon ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/bacon +*/ /datum/recipe/ntmuffin items = list( diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index 268c11914e..65310fb48c 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -9,23 +9,8 @@ result = /obj/item/weapon/reagent_containers/food/snacks/path_to_some_food */ // All of this shit needs to be gone through and reorganized into different recipes per machine - Rykka 7/16/2020 -/datum/recipe/jellydonut - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice) -/datum/recipe/jellydonut/slime - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice) - -/datum/recipe/jellydonut/cherry - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice) - -/datum/recipe/donut - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice) - -/datum/recipe/sushi +/datum/recipe/carpsushi fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( @@ -45,37 +30,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/lasagna -/datum/recipe/goulash - fruit = list("tomato" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/cutlet, - /obj/item/weapon/reagent_containers/food/snacks/spagetti - ) - result = /obj/item/weapon/reagent_containers/food/snacks/goulash - -/datum/recipe/donerkebab - fruit = list("tomato" = 1, "cabbage" = 1) - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab - -/datum/recipe/roastbeef - fruit = list("carrot" = 2, "potato" = 2) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/roastbeef - -/datum/recipe/reishicup - reagents = list("psilocybin" = 3, "sugar" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/chocolatebar - ) - result = /obj/item/weapon/reagent_containers/food/snacks/reishicup - /datum/recipe/chickenwings reagents = list("capsaicin" = 5, "flour" = 10) items = list( @@ -86,22 +40,6 @@ ) result = /obj/item/weapon/storage/box/wings //This is kinda like the donut box. -/datum/recipe/hotandsoursoup - fruit = list("cabbage" = 1, "mushroom" = 1) - reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tofu - ) - result = /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup - -/datum/recipe/kitsuneudon - reagents = list("egg" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, - /obj/item/weapon/reagent_containers/food/snacks/tofu - ) - result = /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon - /datum/recipe/generalschicken reagents = list("capsaicin" = 2, "sugar" = 2, "flour" = 10) items = list( @@ -131,28 +69,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz -/datum/recipe/pillbugball - reagents = list("carbon" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/bugball - -/datum/recipe/mammi - fruit = list("orange" = 1) - reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/mammi - -/datum/recipe/makaroni - reagents = list("flour" = 15, "milk" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat, - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/makaroni - /datum/recipe/lobster fruit = list("lemon" = 1, "cabbage" = 1) items = list( diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index 1489ba72ad..989c118d50 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -421,27 +421,34 @@ //============ /datum/recipe/cake appliance = OVEN - reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) + reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9, "vanilla" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake reagent_mix = RECIPE_REAGENT_REPLACE /datum/recipe/cake/carrot appliance = OVEN fruit = list("carrot" = 3) + reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake /datum/recipe/cake/cheese appliance = OVEN + reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) items = list( /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake + +/datum/recipe/cake/peanut + fruit = list("peanut" = 3) + reagents = list("milk" = 5, "flour" = 10, "sugar" = 5, "egg" = 6, "peanutbutter" = 5) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake /datum/recipe/cake/orange appliance = OVEN fruit = list("orange" = 1) - reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "orangejuice" = 3, "sugar" = 5) + reagents = list("milk" = 5, "flour" = 15, "egg" = 9, "sugar" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake /datum/recipe/cake/lime @@ -464,16 +471,19 @@ /datum/recipe/cake/birthday appliance = OVEN + reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) items = list(/obj/item/clothing/head/cakehat) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake /datum/recipe/cake/apple appliance = OVEN fruit = list("apple" = 2) + reagents = list("milk" = 5, "flour" = 15, "egg" = 9,"sugar" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake /datum/recipe/cake/brain appliance = OVEN + reagents = list("milk" = 5, "flour" = 15, "sugar" = 15, "egg" = 9) items = list(/obj/item/organ/internal/brain) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index b52028d542..a27e2a3f5f 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -153,7 +153,9 @@ /obj/item/weapon/reagent_containers/glass, /obj/item/weapon/reagent_containers/food, /obj/item/seeds, - /obj/item/weapon/grown + /obj/item/weapon/grown, + /obj/item/trash, + /obj/item/weapon/reagent_containers/cooking_container ) /obj/item/weapon/gripper/gravekeeper //Used for handling grave things, flowers, etc. diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 5953c64ba2..33f666e6f3 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -282,6 +282,34 @@ trans_to(target, amount, multiplier, copy) +/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) + if (!target) + return + + var/datum/reagent/transfering_reagent = get_reagent(rtype) + + if (istype(target, /atom)) + var/atom/A = target + if (!A.reagents || !A.simulated) + return + + amount = min(amount, transfering_reagent.volume) + + if(!amount) + return + + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(rtype) + F.add_reagent(rtype, amount, tmpdata) + remove_reagent(rtype, amount) + + + if (istype(target, /atom)) + return F.trans_to(target, amount) // Let this proc check the atom's type + else if (istype(target, /datum/reagents)) + return F.trans_to_holder(target, amount) + /datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) if (!target || !target.reagents) return diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm index 4717e14bdc..28e76ceac9 100644 --- a/code/modules/research/designs/circuits/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -583,13 +583,48 @@ CIRCUITS BELOW req_tech = list(TECH_DATA = 4, TECH_BIO = 3) build_path = /obj/item/weapon/circuitboard/aicore sort_string = "XAAAA" +// Cooking Appliances +/datum/design/circuit/microwave + name = "microwave board" + id = "microwave_board" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/microwave + sort_string = "HACAM" + +/datum/design/circuit/oven + name = "oven board" + id = "oven_board" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/oven + sort_string = "HACAN" + +/datum/design/circuit/fryer + name = "deep fryer board" + id = "fryer_board" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/fryer + sort_string = "HACAO" + +/datum/design/circuit/cerealmaker + name = "cereal maker board" + id = "cerealmaker_board" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/cerealmaker + sort_string = "HACAP" + +/datum/design/circuit/candymaker + name = "candy machine board" + id = "candymachine_board" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/candymachine + sort_string = "HACAQ" /datum/design/circuit/microwave/advanced name = "deluxe microwave" id = "deluxe microwave" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4) build_path = /obj/item/weapon/circuitboard/microwave/advanced - sort_string = "MAAAC" + sort_string = "HACAA" /datum/design/circuit/shield_generator name = "shield generator" diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 6973896c3ca0396b39d170140120b30c36a56a1b..5b19f0d43b83e475ffafdfee810a44b0657f53c6 100644 GIT binary patch delta 19171 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 diff --git a/vorestation.dme b/vorestation.dme index 39f4f76f42..2dd47773c2 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1238,6 +1238,7 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" @@ -2065,6 +2066,7 @@ #include "code\modules\food\recipe.dm" #include "code\modules\food\recipe_dump.dm" #include "code\modules\food\recipes_fryer.dm" +#include "code\modules\food\recipes_grill.dm" #include "code\modules\food\recipes_microwave.dm" #include "code\modules\food\recipes_microwave_vr.dm" #include "code\modules\food\recipes_oven.dm"