From 373e1c766a5435ef9d931174c32b4567364d5974 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sat, 12 Jan 2019 04:21:47 -0500 Subject: [PATCH] Fixes infinite microwave sound when recipe fails --- code/modules/food/kitchen/microwave.dm | 1208 +++++++++++++++++++++++- 1 file changed, 1200 insertions(+), 8 deletions(-) diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 0cbe0062f8..714bde8e93 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -1,3 +1,115 @@ +<<<<<<< HEAD +/obj/machinery/microwave + + + name = "microwave" + + + icon = 'icons/obj/kitchen.dmi' + + + icon_state = "mw" + + + density = 1 + + + anchored = 1 + + + use_power = 1 + + + idle_power_usage = 5 + + + active_power_usage = 100 + + + flags = OPENCONTAINER | NOREACT + + + circuit = /obj/item/weapon/circuitboard/microwave + + + 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/datum/looping_sound/microwave/soundloop + + + + + + + + +// see code/modules/food/recipes_microwave.dm for recipes + + + + + +/******************* + + +* Initialising + + +********************/ + + + + + +/obj/machinery/microwave/Initialize() + + + reagents = new/datum/reagents(100) + + + reagents.my_atom = src + + + + + + component_parts = list() + + + component_parts += new /obj/item/weapon/stock_parts/console_screen(src) + + + component_parts += new /obj/item/weapon/stock_parts/motor(src) + + + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + + + + + if ("dispose") + dispose() + return +======= /obj/machinery/microwave name = "microwave" icon = 'icons/obj/kitchen.dmi' @@ -249,7 +361,7 @@ if (!wzhzhzh(10)) abort() return - stop() + abort() return var/datum/recipe/recipe = select_recipe(available_recipes,src) @@ -278,7 +390,7 @@ if (!wzhzhzh(10)) abort() return - stop() + abort() cooked = fail() cooked.loc = src.loc return @@ -293,7 +405,7 @@ cooked.loc = src.loc return cooked = recipe.make_food(src) - stop() + abort() if(cooked) cooked.loc = src.loc return @@ -328,9 +440,6 @@ updateUsrDialog() soundloop.stop() -/obj/machinery/microwave/proc/stop() - abort() - /obj/machinery/microwave/proc/dispose() for (var/obj/O in ((contents-component_parts)-circuit)) O.loc = src.loc @@ -345,13 +454,14 @@ src.icon_state = "mwbloody1" // Make it look dirty!! /obj/machinery/microwave/proc/muck_finish() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) src.visible_message("The microwave gets covered in muck!") src.dirty = 100 // Make it dirty so it can't be used util cleaned src.flags = null //So you can't add condiments src.icon_state = "mwbloody" // Make it look dirty too src.operating = 0 // Turn it off again aferwards src.updateUsrDialog() + soundloop.stop() + /obj/machinery/microwave/proc/broke() var/datum/effect/effect/system/spark_spread/s = new @@ -363,6 +473,7 @@ src.flags = null //So you can't add condiments src.operating = 0 // Turn it off again aferwards src.updateUsrDialog() + soundloop.stop() /obj/machinery/microwave/proc/fail() var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src) @@ -394,4 +505,1085 @@ if ("dispose") dispose() - return \ No newline at end of file + return +>>>>>>> 161dc0a... Merge pull request #5827 from Cerebulon/microwaveSound + + + available_recipes = new + + + for (var/type in (typesof(/datum/recipe)-/datum/recipe)) + + + available_recipes+= new type + + + acceptable_items = new + + + acceptable_reagents = new + + + for (var/datum/recipe/recipe in available_recipes) + + + for (var/item in recipe.items) + + + acceptable_items |= item + + + for (var/reagent in recipe.reagents) + + + acceptable_reagents |= reagent + + + if (recipe.items) + + + max_n_of_items = max(max_n_of_items,recipe.items.len) + + + // This will do until I can think of a fun recipe to use dionaea in - + + + // will also allow anything using the holder item to be microwaved into + + + // impure carbon. ~Z + + + acceptable_items |= /obj/item/weapon/holder + + + acceptable_items |= /obj/item/weapon/reagent_containers/food/snacks/grown + + + + + + RefreshParts() + + + soundloop = new(list(src), FALSE) + + + return ..() + + + + + +/obj/machinery/microwave/Destroy() + + + QDEL_NULL(soundloop) + + + return ..() + + + + + +/******************* + + +* Item Adding + + +********************/ + + + + + +/obj/machinery/microwave/attackby(var/obj/item/O as obj, var/mob/user as mob) + + + if(src.broken > 0) + + + if(src.broken == 2 && O.is_screwdriver()) // If it's broken and they're using a screwdriver + + + user.visible_message( \ + + + "\The [user] starts to fix part of the microwave.", \ + + + "You start to fix part of the microwave." \ + + + ) + + + playsound(src, O.usesound, 50, 1) + + + if (do_after(user,20 * O.toolspeed)) + + + user.visible_message( \ + + + "\The [user] fixes part of the microwave.", \ + + + "You have fixed part of the microwave." \ + + + ) + + + src.broken = 1 // Fix it a bit + + + else if(src.broken == 1 && O.is_wrench()) // If it's broken and they're doing the wrench + + + user.visible_message( \ + + + "\The [user] starts to fix part of the microwave.", \ + + + "You start to fix part of the microwave." \ + + + ) + + + if (do_after(user,20 * O.toolspeed)) + + + user.visible_message( \ + + + "\The [user] fixes the microwave.", \ + + + "You have fixed the microwave." \ + + + ) + + + src.icon_state = "mw" + + + src.broken = 0 // Fix it! + + + src.dirty = 0 // just to be sure + + + src.flags = OPENCONTAINER | NOREACT + + + else + + + to_chat(user, "It's broken!") + + + return 1 + + + else if(default_deconstruction_screwdriver(user, O)) + + + return + + + else if(default_deconstruction_crowbar(user, O)) + + + return + + + else if(default_unfasten_wrench(user, O, 10)) + + + return + + + + + + else if(src.dirty==100) // The microwave 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( \ + + + "\The [user] starts to clean the microwave.", \ + + + "You start to clean the microwave." \ + + + ) + + + if (do_after(user,20)) + + + user.visible_message( \ + + + "\The [user] has cleaned the microwave.", \ + + + "You have cleaned the microwave." \ + + + ) + + + src.dirty = 0 // It's clean! + + + src.broken = 0 // just to be sure + + + src.icon_state = "mw" + + + src.flags = OPENCONTAINER | NOREACT + + + else //Otherwise bad luck!! + + + to_chat(user, "It's dirty!") + + + return 1 + + + else if(is_type_in_list(O,acceptable_items)) + + + if (contents.len>=(max_n_of_items + component_parts.len + 1)) //Adds component_parts to the maximum number of items. The 1 is from the circuit + + + to_chat(user, "This [src] is full of ingredients, you cannot put more.") + + + return 1 + + + if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it + + + var/obj/item/stack/S = O + + + new O.type (src) + + + S.use(1) + + + user.visible_message( \ + + + "\The [user] has added one of [O] to \the [src].", \ + + + "You add one of [O] to \the [src].") + + + return + + + else + + + // user.remove_from_mob(O) //This just causes problems so far as I can tell. -Pete + + + user.drop_item() + + + O.loc = src + + + user.visible_message( \ + + + "\The [user] has added \the [O] to \the [src].", \ + + + "You add \the [O] to \the [src].") + + + return + + + 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)) + + + to_chat(user, "Your [O] contains components unsuitable for cookery.") + + + return 1 + + + return + + + else if(istype(O,/obj/item/weapon/grab)) + + + 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 + + + to_chat(user, "You have no idea what you can cook with this [O].") + + + ..() + + + src.updateUsrDialog() + + + + + +/obj/machinery/microwave/attack_ai(mob/user as mob) + + + if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) + + + attack_hand(user) + + + + + +/obj/machinery/microwave/attack_hand(mob/user as mob) + + + user.set_machine(src) + + + interact(user) + + + + + +/******************* + + +* Microwave Menu + + +********************/ + + + + + +/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu + + + var/dat = "" + + + if(src.broken > 0) + + + dat = {"Bzzzzttttt"} + + + else if(src.operating) + + + dat = {"Microwaving in progress!
Please wait...!
"} + + + else if(src.dirty==100) + + + dat = {"This microwave is dirty!
Please clean it before use!
"} + + + else + + + var/list/items_counts = new + + + var/list/items_measures = new + + + var/list/items_measures_p = new + + + for (var/obj/O in ((contents - component_parts) - circuit)) + + + 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 microwave is empty
"} + + + else + + + dat = {"Ingredients:
[dat]"} + + + dat += {"

\ + + +Turn on!
\ + + +
Eject ingredients!
\ + + +"} + + + + + + to_chat(user, browse("Microwave Controls[dat]", "window=microwave")) + + + onclose(user, "microwave") + + + return + + + + + + + + + + + +/*********************************** + + +* Microwave Menu Handling/Cooking + + +************************************/ + + + + + +/obj/machinery/microwave/proc/cook() + + + if(stat & (NOPOWER|BROKEN)) + + + return + + + start() + + + if (reagents.total_volume==0 && !(locate(/obj) in ((contents - component_parts) - circuit))) //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 + + + return + + + + + +/obj/machinery/microwave/proc/wzhzhzh(var/seconds as num) // Whoever named this proc is fucking literally Satan. ~ Z + + + for (var/i=1 to seconds) + + + if (stat & (NOPOWER|BROKEN)) + + + return 0 + + + use_power(500) + + + sleep(10) + + + return 1 + + + + + +/obj/machinery/microwave/proc/has_extra_item() + + + for (var/obj/O in ((contents - component_parts) - circuit)) + + + if ( \ + + + !istype(O,/obj/item/weapon/reagent_containers/food) && \ + + + !istype(O, /obj/item/weapon/grown) \ + + + ) + + + return 1 + + + return 0 + + + + + +/obj/machinery/microwave/proc/start() + + + src.visible_message("The microwave turns on.", "You hear a microwave.") + + + soundloop.start() + + + src.operating = TRUE + + + src.icon_state = "mw1" + + + src.updateUsrDialog() + + + + + +/obj/machinery/microwave/proc/abort() + + + operating = FALSE // Turn it off again aferwards + + + icon_state = "mw" + + + updateUsrDialog() + + + soundloop.stop() + + + + + +/obj/machinery/microwave/proc/stop() + + + abort() + + + + + +/obj/machinery/microwave/proc/dispose() + + + for (var/obj/O in ((contents-component_parts)-circuit)) + + + O.loc = src.loc + + + if (src.reagents.total_volume) + + + src.dirty++ + + + src.reagents.clear_reagents() + + + usr << "You dispose of the microwave contents." + + + src.updateUsrDialog() + + + + + +/obj/machinery/microwave/proc/muck_start() + + + playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound + + + src.icon_state = "mwbloody1" // Make it look dirty!! + + + + + +/obj/machinery/microwave/proc/muck_finish() + + + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + + + src.visible_message("The microwave gets covered in muck!") + + + src.dirty = 100 // Make it dirty so it can't be used util cleaned + + + src.flags = null //So you can't add condiments + + + src.icon_state = "mwbloody" // Make it look dirty too + + + src.operating = 0 // Turn it off again aferwards + + + src.updateUsrDialog() + + + + + +/obj/machinery/microwave/proc/broke() + + + var/datum/effect/effect/system/spark_spread/s = new + + + s.set_up(2, 1, src) + + + s.start() + + + src.icon_state = "mwb" // Make it look all busted up and shit + + + src.visible_message("The microwave breaks!") //Let them know they're stupid + + + src.broken = 2 // Make it broken so it can't be used util fixed + + + src.flags = null //So you can't add condiments + + + src.operating = 0 // Turn it off again aferwards + + + src.updateUsrDialog() + + + + + +/obj/machinery/microwave/proc/fail() + + + var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src) + + + var/amount = 0 + + + for (var/obj/O in (((contents - ffuu) - component_parts) - circuit)) + + + amount++ + + + if (O.reagents) + + + var/id = O.reagents.get_master_reagent_id() + + + if (id) + + + amount+=O.reagents.get_reagent_amount(id) + + + qdel(O) + + + src.reagents.clear_reagents() + + + ffuu.reagents.add_reagent("carbon", amount) + + + ffuu.reagents.add_reagent("toxin", amount/10) + + + return ffuu + + + + + +/obj/machinery/microwave/Topic(href, href_list) + + + if(..()) + + + return + + + + + + usr.set_machine(src) + + + if(src.operating) + + + src.updateUsrDialog() + + + return + + + + + + switch(href_list["action"]) + + + if ("cook") + + + cook() + + + + + + if ("dispose") + + + dispose() + + + return