diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 4f2750c0c06..0f7dcd15b4a 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -38,6 +38,7 @@ var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal var/time = 100 // 1/10 part of second + var/byproduct //example: = /obj/item/weapon/kitchen/mould // byproduct to return, such as a mould or trash /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous @@ -118,3 +119,9 @@ i_count = N_i . = recipe return . + +/datum/recipe/proc/get_byproduct() + if(byproduct) + return byproduct + else + return null diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 546b5956f0b..f1aae4943e3 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -344,12 +344,45 @@ to destroy them and players will be able to make replacements. build_path = /obj/machinery/microwave board_type = "machine" origin_tech = "programming=1" - frame_desc = "Requires 1 Micro Laser, 1 piece of cable and 1 Console Screen." + frame_desc = "Requires 1 Micro Laser, 2 pieces of cable and 1 Console Screen." req_components = list( /obj/item/weapon/stock_parts/micro_laser = 1, /obj/item/stack/cable_coil = 2, /obj/item/weapon/stock_parts/console_screen = 1) +/obj/item/weapon/circuitboard/oven + name = "circuit board (Oven)" + build_path = /obj/machinery/oven + board_type = "machine" + origin_tech = "programming=1;plasmatech=1" + frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen." + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/grill + name = "circuit board (Grill)" + build_path = /obj/machinery/grill + board_type = "machine" + origin_tech = "programming=1;plasmatech=1" + frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen." + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 2, + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/candy_maker + name = "circuit board (Candy Maker)" + build_path = /obj/machinery/candy_maker + board_type = "machine" + origin_tech = "programming=2" + frame_desc = "Requires 1 Manipulator, 5 pieces of cable and 1 Console Screen." + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/console_screen = 1) + /obj/item/weapon/circuitboard/chem_dispenser name = "circuit board (Portable Chem Dispenser)" build_path = /obj/machinery/chem_dispenser/constructable diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index cd8e806fbb0..064bb7ff475 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -32,11 +32,11 @@ reagents.my_atom = src if (!available_recipes) available_recipes = new - for (var/type in (typesof(/datum/recipe)-/datum/recipe)) + for (var/type in (typesof(/datum/recipe/microwave)-/datum/recipe/microwave)) available_recipes+= new type acceptable_items = new acceptable_reagents = new - for (var/datum/recipe/recipe in available_recipes) + for (var/datum/recipe/microwave/recipe in available_recipes) for (var/item in recipe.items) acceptable_items |= item for (var/reagent in recipe.reagents) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c8987cccad0..5ce8365adf4 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -786,11 +786,11 @@ product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" icon_state = "snack" - products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6, + products = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candybar = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6, /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6, /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6) contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6) - prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25, + prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candybar = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25, /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 20,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 30, /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25) refill_canister = /obj/item/weapon/vending_refill/snack @@ -1057,7 +1057,15 @@ desc = "A kitchen and restaurant equipment vendor" product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" - products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5) + products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6, + /obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8, + /obj/item/clothing/suit/chef/classic = 2, + /obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5, + /obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5, + /obj/item/weapon/kitchen/mould/bear = 1, /obj/item/weapon/kitchen/mould/worm = 1, + /obj/item/weapon/kitchen/mould/bean = 1, /obj/item/weapon/kitchen/mould/ball = 1, + /obj/item/weapon/kitchen/mould/cane = 1, /obj/item/weapon/kitchen/mould/cash = 1, + /obj/item/weapon/kitchen/mould/coin = 1, /obj/item/weapon/kitchen/mould/loli = 1) contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2) /obj/machinery/vending/sovietsoda diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 4ad71cb9c93..5a5ae43957a 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -47,6 +47,14 @@ var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \ new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/utensil/pknife, 1, on_floor = 1), \ new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \ + new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \ + new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \ + new/datum/stack_recipe("bean mould", /obj/item/weapon/kitchen/mould/bean, 1, on_floor = 1), \ + new/datum/stack_recipe("ball mould", /obj/item/weapon/kitchen/mould/ball, 1, on_floor = 1), \ + new/datum/stack_recipe("cane mould", /obj/item/weapon/kitchen/mould/cane, 1, on_floor = 1), \ + new/datum/stack_recipe("cash mould", /obj/item/weapon/kitchen/mould/cash, 1, on_floor = 1), \ + new/datum/stack_recipe("coin mould", /obj/item/weapon/kitchen/mould/coin, 1, on_floor = 1), \ + new/datum/stack_recipe("sucker mould", /obj/item/weapon/kitchen/mould/loli, 1, on_floor = 1), \ ) var/global/list/datum/stack_recipe/clown_recipes = list ( \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 320f9331427..69ab0899003 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -81,7 +81,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ throwforce = 10.0 flags = CONDUCT origin_tech = "materials=1" - + /obj/item/stack/sheet/metal/full/New() ..() amount = 50 @@ -126,7 +126,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ /obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null) recipes = plasteel_recipes return ..() - + /obj/item/stack/sheet/plasteel/full/New(var/loc, var/amount=null) amount = 50 ..(loc, amount) @@ -188,6 +188,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ new/datum/stack_recipe("folder", /obj/item/weapon/folder), \ + new/datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube), \ ) /obj/item/stack/sheet/cardboard //BubbleWrap diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 67f28494dea..eb6b59b95cd 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -56,6 +56,10 @@ can name = "crushed can" icon_state = "cola" + gum + name = "chewed gum" + desc = "NOT free candy." + icon_state = "gum" /obj/item/trash/attack(mob/M as mob, mob/living/user as mob) return diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index b4288c7033c..9268883a017 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -7,6 +7,7 @@ * Kitchen knives * Butcher's cleaver * Rolling Pins + * Candy Moulds */ /obj/item/weapon/kitchen @@ -214,4 +215,59 @@ w_class = 3.0 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") -/* Trays moved to /obj/item/weapon/storage/bag */ \ No newline at end of file +/* Trays moved to /obj/item/weapon/storage/bag */ + +/* + * Candy Moulds + */ + +/obj/item/weapon/kitchen/mould + name = "generic candy mould" + desc = "You aren't sure what it's supposed to be." + icon_state = "mould" + force = 5 + throwforce = 5 + throw_speed = 3 + throw_range = 3 + w_class = 2.0 + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") + +/obj/item/weapon/kitchen/mould/bear + name = "bear-shaped candy mould" + desc = "It has the shape of a small bear imprinted into it." + icon_state = "mould_bear" + +/obj/item/weapon/kitchen/mould/worm + name = "worm-shaped candy mould" + desc = "It has the shape of a worm imprinted into it." + icon_state = "mould_worm" + +/obj/item/weapon/kitchen/mould/bean + name = "bean-shaped candy mould" + desc = "It has the shape of a bean imprinted into it." + icon_state = "mould_bean" + +/obj/item/weapon/kitchen/mould/ball + name = "ball-shaped candy mould" + desc = "It has a small sphere imprinted into it." + icon_state = "mould_ball" + +/obj/item/weapon/kitchen/mould/cane + name = "cane-shaped candy mould" + desc = "It has the shape of a cane imprinted into it." + icon_state = "mould_cane" + +/obj/item/weapon/kitchen/mould/cash + name = "cash-shaped candy mould" + desc = "It has the shape and design of fake money imprinted into it." + icon_state = "mould_cash" + +/obj/item/weapon/kitchen/mould/coin + name = "coin-shaped candy mould" + desc = "It has the shape of a coin imprinted into it." + icon_state = "mould_coin" + +/obj/item/weapon/kitchen/mould/loli + name = "sucker mould" + desc = "It has the shape of a sucker imprinted into it." + icon_state = "mould_loli" diff --git a/code/modules/food/candy_maker.dm b/code/modules/food/candy_maker.dm new file mode 100644 index 00000000000..643d89b88e6 --- /dev/null +++ b/code/modules/food/candy_maker.dm @@ -0,0 +1,427 @@ + +/obj/machinery/candy_maker + name = "candy machine" + desc = "Get yer box of deep fried deep fried deep fried deep fried cotton candy cereal sandwich cookies here!" + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "candymaker_off" + layer = 2.9 + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 5 + active_power_usage = 100 + flags = OPENCONTAINER | NOREACT + 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/efficiency + +// see code/modules/food/recipes_candy.dm for recipes + +/******************* +* Initialising +********************/ + +/obj/machinery/candy_maker/New() + //..() //do not need this + reagents = new/datum/reagents(100) + reagents.my_atom = src + if (!available_recipes) + available_recipes = new + for (var/type in (typesof(/datum/recipe/candy)-/datum/recipe/candy)) + available_recipes+= new type + acceptable_items = new + acceptable_reagents = new + for (var/datum/recipe/candy/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,recipe.items.len) + + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/candy_maker(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() + + +/obj/machinery/candy_maker/upgraded/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/candy_maker(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/stack/cable_coil(null, 5) + RefreshParts() + +/obj/machinery/candy_maker/RefreshParts() + var/E + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + E += M.rating + efficiency = E + +/******************* +* Item Adding +********************/ + +/obj/machinery/candy_maker/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(operating) + return + if(!broken && dirty < 100) + if(default_deconstruction_screwdriver(user, "candymaker_open", "candymaker_off", O)) + return + if(exchange_parts(user, O)) + return + if(istype(O, /obj/item/weapon/wrench)) + playsound(src, 'sound/items/Ratchet.ogg', 50, 1) + if(anchored) + anchored = 0 + user << "The [src] can now be moved." + return + else if(!anchored) + anchored = 1 + user << "The [src] is now secured." + return + + default_deconstruction_crowbar(O) + + if(src.broken > 0) + if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver + user.visible_message( \ + "\blue [user] starts to fix part of the candy maker.", \ + "\blue You start to fix part of the candy maker." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] fixes part of the candy maker.", \ + "\blue You have fixed part of the candy maker." \ + ) + src.broken = 1 // Fix it a bit + else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench + user.visible_message( \ + "\blue [user] starts to fix part of the candy maker.", \ + "\blue You start to fix part of the candy maker." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] fixes the candy maker.", \ + "\blue You have fixed the candy maker." \ + ) + src.icon_state = "candymaker_off" + src.broken = 0 // Fix it! + src.dirty = 0 // just to be sure + src.flags = OPENCONTAINER + else + user << "\red It's broken!" + return 1 + else if(src.dirty==100) // The candy_maker is all dirty so can't be used! + if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them + user.visible_message( \ + "\blue [user] starts to clean the candy maker.", \ + "\blue You start to clean the candy maker." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] has cleaned the candy maker.", \ + "\blue You have cleaned the candy maker." \ + ) + src.dirty = 0 // It's clean! + src.broken = 0 // just to be sure + src.icon_state = "candymaker_off" + src.flags = OPENCONTAINER + else //Otherwise bad luck!! + user << "\red It's dirty!" + return 1 + else if(is_type_in_list(O,acceptable_items)) + if (contents.len>=max_n_of_items) + user << "\red This [src] is full of ingredients, you cannot put more." + return 1 + if (istype(O,/obj/item/stack) && O:amount>1) + new O.type (src) + O:use(1) + user.visible_message( \ + "\blue [user] has added one of [O] to \the [src].", \ + "\blue You add one of [O] to \the [src].") + else + // user.unEquip(O) //This just causes problems so far as I can tell. -Pete + if(!user.drop_item()) + user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + return 0 + O.loc = src + user.visible_message( \ + "\blue [user] has added \the [O] to \the [src].", \ + "\blue You add \the [O] to \the [src].") + else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \ + istype(O,/obj/item/weapon/reagent_containers/food/condiment) \ + ) + if (!O.reagents) + return 1 + for (var/datum/reagent/R in O.reagents.reagent_list) + if (!(R.id in acceptable_reagents)) + user << "\red Your [O] contains components unsuitable for cookery." + return 1 + //G.reagents.trans_to(src,G.amount_per_transfer_from_this) + else if(istype(O,/obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = O + user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]." + return 1 + else + user << "\red You have no idea what you can cook with this [O]." + return 1 + src.updateUsrDialog() + +/obj/machinery/candy_maker/attack_paw(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/candy_maker/attack_ai(mob/user as mob) + return 0 + +/obj/machinery/candy_maker/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/******************* +* candy_maker Menu +********************/ + +/obj/machinery/candy_maker/interact(mob/user as mob) // The Candy Maker Menu + if(panel_open || !anchored) + return + var/dat = "" + if(src.broken > 0) + dat = {"Bzzzzttttt"} + else if(src.operating) + var/whimsy_word = pick("Wonderizing", "Scrumpdiddlyumptiousification", "Miracle-coating", "Flavorifaction") + dat = {"[whimsy_word] in progress!
Please wait...!
"} + else if(src.dirty==100) + dat = {"This candy maker is dirty!
Please clean it before use!
"} + else + var/list/items_counts = new + var/list/items_measures = new + var/list/items_measures_p = new + for (var/obj/O in contents) + var/display_name = O.name + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg)) + items_measures[display_name] = "egg" + items_measures_p[display_name] = "eggs" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu)) + items_measures[display_name] = "tofu chunk" + items_measures_p[display_name] = "tofu chunks" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat + items_measures[display_name] = "slab of meat" + items_measures_p[display_name] = "slabs of meat" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket)) + display_name = "Turnovers" + items_measures[display_name] = "turnover" + items_measures_p[display_name] = "turnovers" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/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.id == "capsaicin") + display_name = "Hotsauce" + if (R.id == "frostoil") + display_name = "Coldsauce" + dat += {"[display_name]: [R.volume] unit\s
"} + + if (items_counts.len==0 && reagents.reagent_list.len==0) + dat = {"The candy maker is empty
"} + else + dat = {"Ingredients:
[dat]"} + dat += {"

\ +Turn on!
\ +
Eject ingredients!
\ +"} + + user << browse("Candy Maker Controls[dat]", "window=candy_maker") + onclose(user, "candy_maker") + return + + + +/*********************************** +* candy_maker Menu Handling/Cooking +************************************/ + +/obj/machinery/candy_maker/proc/cook() + if(stat & (NOPOWER|BROKEN)) + return + start() + if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run + if (!wzhzhzh(10)) + abort() + return + stop() + return + + var/datum/recipe/recipe = select_recipe(available_recipes,src) + var/obj/cooked + var/obj/byproduct + if (!recipe) + dirty += 1 + if (prob(max(10,dirty*5))) + if (!wzhzhzh(4)) + abort() + return + muck_start() + wzhzhzh(4) + muck_finish() + cooked = fail() + cooked.loc = src.loc + return + else if (has_extra_item()) + if (!wzhzhzh(4)) + abort() + return + broke() + cooked = fail() + cooked.loc = src.loc + return + else + if (!wzhzhzh(10)) + abort() + return + stop() + cooked = fail() + cooked.loc = src.loc + return + else + var/halftime = round(recipe.time/10/2) + if (!wzhzhzh(halftime)) + abort() + return + if (!wzhzhzh(halftime)) + abort() + cooked = fail() + cooked.loc = src.loc + return + cooked = recipe.make_food(src) + byproduct = recipe.get_byproduct() + stop() + if(cooked) + cooked.loc = src.loc + for(var/i=1,iThe [src] can now be moved." + return + else if(!anchored) + anchored = 1 + user << "The [src] is now secured." + return + + default_deconstruction_crowbar(O) + + if(src.broken > 0) + if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver + user.visible_message( \ + "\blue [user] starts to fix part of the grill.", \ + "\blue You start to fix part of the grill." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] fixes part of the grill.", \ + "\blue You have fixed part of the grill." \ + ) + src.broken = 1 // Fix it a bit + else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench + user.visible_message( \ + "\blue [user] starts to fix part of the grill.", \ + "\blue You start to fix part of the grill." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] fixes the grill.", \ + "\blue You have fixed the grill." \ + ) + src.icon_state = "grill_off" + src.broken = 0 // Fix it! + src.dirty = 0 // just to be sure + src.flags = OPENCONTAINER + else + user << "\red It's broken!" + return 1 + else if(src.dirty==100) // The grill is all dirty so can't be used! + if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them + user.visible_message( \ + "\blue [user] starts to clean the grill.", \ + "\blue You start to clean the grill." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] has cleaned the grill.", \ + "\blue You have cleaned the grill." \ + ) + src.dirty = 0 // It's clean! + src.broken = 0 // just to be sure + src.icon_state = "grill_off" + src.flags = OPENCONTAINER + else //Otherwise bad luck!! + user << "\red It's dirty!" + return 1 + else if(is_type_in_list(O,acceptable_items)) + if (contents.len>=max_n_of_items) + user << "\red This [src] is full of ingredients, you cannot put more." + return 1 + if (istype(O,/obj/item/stack) && O:amount>1) + new O.type (src) + O:use(1) + user.visible_message( \ + "\blue [user] has added one of [O] to \the [src].", \ + "\blue You add one of [O] to \the [src].") + else + // user.unEquip(O) //This just causes problems so far as I can tell. -Pete + if(!user.drop_item()) + user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + return 0 + O.loc = src + user.visible_message( \ + "\blue [user] has added \the [O] to \the [src].", \ + "\blue You add \the [O] to \the [src].") + else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \ + istype(O,/obj/item/weapon/reagent_containers/food/condiment) \ + ) + if (!O.reagents) + return 1 + for (var/datum/reagent/R in O.reagents.reagent_list) + if (!(R.id in acceptable_reagents)) + user << "\red Your [O] contains components unsuitable for cookery." + return 1 + //G.reagents.trans_to(src,G.amount_per_transfer_from_this) + else if(istype(O,/obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = O + user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]." + return 1 + else + user << "\red You have no idea what you can cook with this [O]." + return 1 + src.updateUsrDialog() + +/obj/machinery/grill/attack_paw(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/grill/attack_ai(mob/user as mob) + return 0 + +/obj/machinery/grill/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/******************* +* grill Menu +********************/ + +/obj/machinery/grill/interact(mob/user as mob) // The grill Menu + if(panel_open || !anchored) + return + var/dat = "" + if(src.broken > 0) + dat = {"Bzzzzttttt"} + else if(src.operating) + dat = {"Grilling in progress!
Please wait...!
"} + else if(src.dirty==100) + dat = {"This grill is dirty!
Please clean it before use!
"} + else + var/list/items_counts = new + var/list/items_measures = new + var/list/items_measures_p = new + for (var/obj/O in contents) + var/display_name = O.name + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg)) + items_measures[display_name] = "egg" + items_measures_p[display_name] = "eggs" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu)) + items_measures[display_name] = "tofu chunk" + items_measures_p[display_name] = "tofu chunks" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat + items_measures[display_name] = "slab of meat" + items_measures_p[display_name] = "slabs of meat" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket)) + display_name = "Turnovers" + items_measures[display_name] = "turnover" + items_measures_p[display_name] = "turnovers" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/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.id == "capsaicin") + display_name = "Hotsauce" + if (R.id == "frostoil") + display_name = "Coldsauce" + dat += {"[display_name]: [R.volume] unit\s
"} + + if (items_counts.len==0 && reagents.reagent_list.len==0) + dat = {"The grill is empty
"} + else + dat = {"Ingredients:
[dat]"} + dat += {"

\ +
Turn on!
\ +
Eject ingredients!
\ +"} + + user << browse("grill Controls[dat]", "window=grill") + onclose(user, "grill") + return + + + +/*********************************** +* grill Menu Handling/Cooking +************************************/ + +/obj/machinery/grill/proc/cook() + if(stat & (NOPOWER|BROKEN)) + return + start() + if (reagents.total_volume==0 && !(locate(/obj) in contents)) //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.loc = src.loc + return + else if (has_extra_item()) + if (!wzhzhzh(4)) + abort() + return + broke() + cooked = fail() + cooked.loc = src.loc + return + else + if (!wzhzhzh(10)) + abort() + return + stop() + cooked = fail() + cooked.loc = src.loc + return + else + var/halftime = round(recipe.time/10/2) + if (!wzhzhzh(halftime)) + abort() + return + if (!wzhzhzh(halftime)) + abort() + cooked = fail() + cooked.loc = src.loc + return + cooked = recipe.make_food(src) + stop() + if(cooked) + cooked.loc = src.loc + for(var/i=1,iThe [src] can now be moved." + return + else if(!anchored) + anchored = 1 + user << "The [src] is now secured." + return + + default_deconstruction_crowbar(O) + + if(src.broken > 0) + if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver + user.visible_message( \ + "\blue [user] starts to fix part of the oven.", \ + "\blue You start to fix part of the oven." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] fixes part of the oven.", \ + "\blue You have fixed part of the oven." \ + ) + src.broken = 1 // Fix it a bit + else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench + user.visible_message( \ + "\blue [user] starts to fix part of the oven.", \ + "\blue You start to fix part of the oven." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] fixes the oven.", \ + "\blue You have fixed the oven." \ + ) + src.icon_state = "oven_off" + src.broken = 0 // Fix it! + src.dirty = 0 // just to be sure + src.flags = OPENCONTAINER + else + user << "\red It's broken!" + return 1 + else if(src.dirty==100) // The oven is all dirty so can't be used! + if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them + user.visible_message( \ + "\blue [user] starts to clean the oven.", \ + "\blue You start to clean the oven." \ + ) + if (do_after(user,20)) + user.visible_message( \ + "\blue [user] has cleaned the oven.", \ + "\blue You have cleaned the oven." \ + ) + src.dirty = 0 // It's clean! + src.broken = 0 // just to be sure + src.icon_state = "oven_off" + src.flags = OPENCONTAINER + else //Otherwise bad luck!! + user << "\red It's dirty!" + return 1 + else if(is_type_in_list(O,acceptable_items)) + if (contents.len>=max_n_of_items) + user << "\red This [src] is full of ingredients, you cannot put more." + return 1 + if (istype(O,/obj/item/stack) && O:amount>1) + new O.type (src) + O:use(1) + user.visible_message( \ + "\blue [user] has added one of [O] to \the [src].", \ + "\blue You add one of [O] to \the [src].") + else + // user.unEquip(O) //This just causes problems so far as I can tell. -Pete + if(!user.drop_item()) + user << "\the [O] is stuck to your hand, you cannot put it in \the [src]" + return 0 + O.loc = src + user.visible_message( \ + "\blue [user] has added \the [O] to \the [src].", \ + "\blue You add \the [O] to \the [src].") + else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \ + istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \ + istype(O,/obj/item/weapon/reagent_containers/food/condiment) \ + ) + if (!O.reagents) + return 1 + for (var/datum/reagent/R in O.reagents.reagent_list) + if (!(R.id in acceptable_reagents)) + user << "\red Your [O] contains components unsuitable for cookery." + return 1 + //G.reagents.trans_to(src,G.amount_per_transfer_from_this) + else if(istype(O,/obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = O + user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]." + return 1 + else + user << "\red You have no idea what you can cook with this [O]." + return 1 + src.updateUsrDialog() + +/obj/machinery/oven/attack_paw(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/oven/attack_ai(mob/user as mob) + return 0 + +/obj/machinery/oven/attack_hand(mob/user as mob) + user.set_machine(src) + interact(user) + +/******************* +* oven Menu +********************/ + +/obj/machinery/oven/interact(mob/user as mob) // The oven Menu + if(panel_open || !anchored) + return + var/dat = "" + if(src.broken > 0) + dat = {"Bzzzzttttt"} + else if(src.operating) + dat = {"Baking in progress!
Please wait...!
"} + else if(src.dirty==100) + dat = {"This oven is dirty!
Please clean it before use!
"} + else + var/list/items_counts = new + var/list/items_measures = new + var/list/items_measures_p = new + for (var/obj/O in contents) + var/display_name = O.name + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg)) + items_measures[display_name] = "egg" + items_measures_p[display_name] = "eggs" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu)) + items_measures[display_name] = "tofu chunk" + items_measures_p[display_name] = "tofu chunks" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat + items_measures[display_name] = "slab of meat" + items_measures_p[display_name] = "slabs of meat" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket)) + display_name = "Turnovers" + items_measures[display_name] = "turnover" + items_measures_p[display_name] = "turnovers" + if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/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.id == "capsaicin") + display_name = "Hotsauce" + if (R.id == "frostoil") + display_name = "Coldsauce" + dat += {"[display_name]: [R.volume] unit\s
"} + + if (items_counts.len==0 && reagents.reagent_list.len==0) + dat = {"The oven is empty
"} + else + dat = {"Ingredients:
[dat]"} + dat += {"

\ +
Turn on!
\ +
Eject ingredients!
\ +"} + + user << browse("oven Controls[dat]", "window=oven") + onclose(user, "oven") + return + + + +/*********************************** +* oven Menu Handling/Cooking +************************************/ + +/obj/machinery/oven/proc/cook() + if(stat & (NOPOWER|BROKEN)) + return + start() + if (reagents.total_volume==0 && !(locate(/obj) in contents)) //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.loc = src.loc + return + else if (has_extra_item()) + if (!wzhzhzh(4)) + abort() + return + broke() + cooked = fail() + cooked.loc = src.loc + return + else + if (!wzhzhzh(10)) + abort() + return + stop() + cooked = fail() + cooked.loc = src.loc + return + else + var/halftime = round(recipe.time/10/2) + if (!wzhzhzh(halftime)) + abort() + return + if (!wzhzhzh(halftime)) + abort() + cooked = fail() + cooked.loc = src.loc + return + cooked = recipe.make_food(src) + stop() + if(cooked) + cooked.loc = src.loc + for(var/i=1,i