From d41a9f359cba70fd0cefc607ede4399098950fe1 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 14 Feb 2023 01:23:52 +0100 Subject: [PATCH] [MIRROR] Cleans up food processor code [MDB IGNORE] (#19326) * Cleans up food processor code (#73340) ## About The Pull Request This PR does three things: - Implements the suggested solution in #63640, items exiting the processor will remove themselves from the processor list - ~~Removes an object verb for ejecting the contents of the processor, moves functionality to alt click~~ kept the verb for now - Replaces single letter vars, adds autodocs, removes a completely unused var ## Why It's Good For The Game Fixes #63640, easier to remove meat slabs you changed your mind about, and more readable code ## Changelog :cl: fix: taking an item out of the food processor and putting back in will not dupe the results when you process them /:cl: * Cleans up food processor code --------- Co-authored-by: Profakos --- .../food_and_drinks/machinery/processor.dm | 115 +++++++++--------- 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index b26e5714175..ca4c2dd550b 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -8,10 +8,13 @@ layer = BELOW_OBJ_LAYER density = TRUE circuit = /obj/item/circuitboard/machine/processor - var/broken = FALSE + ///Is the processor blending items at the moment var/processing = FALSE + ///The speed at which the processor processes items var/rating_speed = 1 + ///The amount of items the processor produces, without any food specific multipliers var/rating_amount = 1 + ///Lazylist of items to be blended var/list/processor_contents /* * Static, nested list. The first layer contains all food processor types. @@ -50,6 +53,14 @@ if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Outputting [rating_amount] item(s) at [rating_speed*100]% speed.") +/obj/machinery/processor/Exited(atom/movable/gone, direction) + ..() + LAZYREMOVE(processor_contents, gone) + +/* +* Spawns the items based on the passed processor recipes, and transfers materials and reagents +* If the input was a mob, gibs them, otherwise, deletes the item +*/ /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if(recipe.output && loc && !QDELETED(src)) var/list/cached_mats = recipe.preserve_materials && what.custom_materials @@ -72,45 +83,41 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/processor/attackby(obj/item/O, mob/living/user, params) +/obj/machinery/processor/attackby(obj/item/attacking_item, mob/living/user, params) if(processing) to_chat(user, span_warning("[src] is in the process of processing!")) return TRUE - if(default_deconstruction_screwdriver(user, "processor", "processor1", O)) + if(default_deconstruction_screwdriver(user, "processor", "processor1", attacking_item) || default_pry_open(attacking_item) || default_deconstruction_crowbar(attacking_item)) return - if(default_pry_open(O)) - return - - if(default_deconstruction_crowbar(O)) - return - - if(istype(O, /obj/item/storage/bag/tray)) - var/obj/item/storage/T = O + if(istype(attacking_item, /obj/item/storage/bag/tray)) + var/obj/item/storage/attacking_storage = attacking_item var/loaded = 0 - for(var/obj/S in T.contents) - if(!IS_EDIBLE(S)) + for(var/obj/content_item in attacking_storage.contents) + if(!IS_EDIBLE(content_item)) continue - var/datum/food_processor_process/P = PROCESSOR_SELECT_RECIPE(S) - if(P) - if(T.atom_storage.attempt_remove(S, src)) - LAZYADD(processor_contents, S) + var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(content_item) + if(recipe) + if(attacking_storage.atom_storage.attempt_remove(content_item, src)) + LAZYADD(processor_contents, content_item) loaded++ if(loaded) to_chat(user, span_notice("You insert [loaded] items into [src].")) return - var/datum/food_processor_process/P = PROCESSOR_SELECT_RECIPE(O) - if(P) - user.visible_message(span_notice("[user] put [O] into [src]."), \ - span_notice("You put [O] into [src].")) - user.transferItemToLoc(O, src, TRUE) - LAZYADD(processor_contents, O) - return 1 + var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(attacking_item) + if(recipe) + user.visible_message( + span_notice("[user] put [attacking_item] into [src]."), + span_notice("You put [attacking_item] into [src]."), + ) + user.transferItemToLoc(attacking_item, src, TRUE) + LAZYADD(processor_contents, attacking_item) + return TRUE else if(!user.combat_mode) to_chat(user, span_warning("That probably won't blend!")) - return 1 + return TRUE else return ..() @@ -147,12 +154,12 @@ var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = (total_time / rating_speed)*5) //start shaking sleep(total_time / rating_speed) - for(var/atom/movable/O in processor_contents) - var/datum/food_processor_process/P = PROCESSOR_SELECT_RECIPE(O) - if (!P) - log_admin("DEBUG: [O] in processor doesn't have a suitable recipe. How do you put it in?") + for(var/atom/movable/content_item in processor_contents) + var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(content_item) + if (!recipe) + log_admin("DEBUG: [content_item] in processor doesn't have a suitable recipe. How do you put it in?") continue - process_food(P, O) + process_food(recipe, content_item) pixel_x = base_pixel_x //return to its spot after shaking processing = FALSE visible_message(span_notice("\The [src] finishes processing.")) @@ -172,11 +179,6 @@ dump_inventory_contents() add_fingerprint(usr) -/obj/machinery/processor/dump_inventory_contents() - . = ..() - if(!LAZYLEN(processor_contents)) - processor_contents = null - /obj/machinery/processor/container_resist_act(mob/living/user) user.forceMove(drop_location()) user.visible_message(span_notice("[user] crawls free of the processor!")) @@ -186,18 +188,18 @@ desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." circuit = /obj/item/circuitboard/machine/processor/slime -/obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/AM) +/obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/atom_to_drop) var/static/list/slimecores = subtypesof(/obj/item/slime_extract) var/i = 0 - if(!(i = slimecores.Find(AM.type))) // If the item is not found + if(!(i = slimecores.Find(atom_to_drop.type))) // If the item is not found return if (i <= 16) // If in the first 12 slots - AM.pixel_x = AM.base_pixel_x - 12 + ((i%4)*8) - AM.pixel_y = AM.base_pixel_y - 12 + (round(i/4)*8) + atom_to_drop.pixel_x = atom_to_drop.base_pixel_x - 12 + ((i%4)*8) + atom_to_drop.pixel_y = atom_to_drop.base_pixel_y - 12 + (round(i/4)*8) return i var/ii = i - 16 - AM.pixel_x = AM.base_pixel_x - 8 + ((ii%3)*8) - AM.pixel_y = AM.base_pixel_y - 8 + (round(ii/3)*8) + atom_to_drop.pixel_x = atom_to_drop.base_pixel_x - 8 + ((ii%3)*8) + atom_to_drop.pixel_y = atom_to_drop.base_pixel_y - 8 + (round(ii/3)*8) return i /obj/machinery/processor/slime/process() @@ -213,8 +215,8 @@ break if(!picked_slime) return - var/datum/food_processor_process/P = PROCESSOR_SELECT_RECIPE(picked_slime) - if (!P) + var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(picked_slime) + if (!recipe) return visible_message(span_notice("[picked_slime] is sucked into [src].")) @@ -222,18 +224,19 @@ picked_slime.forceMove(src) /obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what) - var/mob/living/simple_animal/slime/S = what - if (istype(S)) - var/C = S.cores - if(S.stat != DEAD) - LAZYREMOVE(processor_contents, S) - S.forceMove(drop_location()) - S.visible_message(span_notice("[C] crawls free of the processor!")) - return - for(var/i in 1 to (C+rating_amount-1)) - var/atom/movable/item = new S.coretype(drop_location()) - adjust_item_drop_location(item) - SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour) - ..() + var/mob/living/simple_animal/slime/processed_slime = what + if (!istype(processed_slime)) + return + + if(processed_slime.stat != DEAD) + processed_slime.forceMove(drop_location()) + processed_slime.balloon_alert_to_viewers("crawls free") + return + var/core_count = processed_slime.cores + for(var/i in 1 to (core_count+rating_amount-1)) + var/atom/movable/item = new processed_slime.coretype(drop_location()) + adjust_item_drop_location(item) + SSblackbox.record_feedback("tally", "slime_core_harvested", 1, processed_slime.colour) + return ..() #undef PROCESSOR_SELECT_RECIPE