diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm new file mode 100644 index 0000000000..2254500afe --- /dev/null +++ b/code/game/machinery/dish_drive.dm @@ -0,0 +1,121 @@ +/obj/machinery/dish_drive + name = "dish drive" + desc = "A culinary marvel that uses matter-to-energy conversion to store dishes and shards. Convenient! \ + Additional features include a vacuum function to suck in nearby dishes, and an automatic transfer beam that empties its contents into nearby disposal bins every now and then. \ + Or you can just drop your plates on the floor, like civilized folk." + icon = 'goon/icons/obj/kitchen.dmi' + icon_state = "synthesizer" + idle_power_usage = 8 //5 with default parts + active_power_usage = 13 //10 with default parts + anchored = TRUE + density = FALSE + circuit = /obj/item/circuitboard/machine/dish_drive + var/static/list/item_types = list(/obj/item/trash/waffles, + /obj/item/trash/plate, + /obj/item/trash/tray, + /obj/item/reagent_containers/glass/bowl, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/kitchen/fork, + /obj/item/shard, + /obj/item/broken_bottle) + var/time_since_dishes = 0 + var/suction_enabled = TRUE + var/transmit_enabled = TRUE + +/obj/machinery/dish_drive/Initialize() + . = ..() + RefreshParts() + +/obj/machinery/dish_drive/examine(mob/user) + ..() + if(user.Adjacent(src)) + to_chat(user, "Alt-click it to beam its contents to any nearby disposal bins.") + +/obj/machinery/dish_drive/attack_hand(mob/living/user) + if(!contents.len) + to_chat(user, "There's nothing in [src]!") + return + var/obj/item/I = contents[contents.len] //the most recently-added item + user.put_in_hands(I) + to_chat(user, "You take out [I] from [src].") + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + flick("synthesizer_beam", src) + +/obj/machinery/dish_drive/attackby(obj/item/I, mob/living/user, params) + if(is_type_in_list(I, item_types) && user.a_intent != INTENT_HARM) + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You put [I] in [src], and it's beamed into energy!") + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + flick("synthesizer_beam", src) + return + else if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) + return + else if(default_unfasten_wrench(user, I)) + return + else if(default_deconstruction_crowbar(I, FALSE)) + return + ..() + +/obj/machinery/dish_drive/RefreshParts() + idle_power_usage = initial(idle_power_usage) + active_power_usage = initial(active_power_usage) + use_power = initial(use_power) + var/total_rating = 0 + for(var/obj/item/stock_parts/S in component_parts) + total_rating += S.rating + if(total_rating >= 9) + active_power_usage = 0 + use_power = NO_POWER_USE + else + idle_power_usage = max(0, idle_power_usage - total_rating) + active_power_usage = max(0, active_power_usage - total_rating) + var/obj/item/circuitboard/machine/dish_drive/board = locate() in component_parts + if(board) + suction_enabled = board.suction + transmit_enabled = board.transmit + +/obj/machinery/dish_drive/process() + if(time_since_dishes <= world.time && transmit_enabled) + do_the_dishes() + if(!suction_enabled) + return + for(var/obj/item/I in view(4, src)) + if(is_type_in_list(I, item_types) && I.loc != src && (!I.reagents || !I.reagents.total_volume)) + if(I.Adjacent(src)) + visible_message("[src] beams up [I]!") + I.forceMove(src) + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + flick("synthesizer_beam", src) + else + step_towards(I, src) + +/obj/machinery/dish_drive/attack_ai(mob/living/user) + if(stat) + return + to_chat(user, "You send a disposal transmission signal to [src].") + do_the_dishes(TRUE) + +/obj/machinery/dish_drive/AltClick(mob/living/user) + if(user.canUseTopic(src, !issilicon(user))) + do_the_dishes(TRUE) + +/obj/machinery/dish_drive/proc/do_the_dishes(manual) + if(!contents.len) + return + var/obj/machinery/disposal/bin/bin = locate() in view(7, src) + if(!bin) + if(manual) + visible_message("[src] buzzes. There are no disposal bins in range!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + for(var/obj/item/I in contents) + I.forceMove(bin) + use_power(active_power_usage) + visible_message("[src] [pick("whooshes", "bwooms", "fwooms", "pshooms")] and beams its stored dishes into the nearby [bin.name].") + playsound(src, 'sound/items/pshoom.ogg', 50, TRUE) + playsound(bin, 'sound/items/pshoom.ogg', 50, TRUE) + Beam(bin, icon_state = "rped_upgrade", time = 5) + bin.update_icon() + flick("synthesizer_beam", src) + time_since_dishes = world.time + 600 diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 7831978cbe..98db95ec06 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -718,3 +718,28 @@ req_components = list( /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 3) + +/obj/item/circuitboard/machine/dish_drive + name = "Dish Drive (Machine Board)" + build_path = /obj/machinery/dish_drive + req_components = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/matter_bin = 2) + var/suction = TRUE + var/transmit = TRUE + +/obj/item/circuitboard/machine/dish_drive/examine(mob/user) + ..() + to_chat(user, "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch.") + to_chat(user, "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch.") + +/obj/item/circuitboard/machine/dish_drive/attack_self(mob/living/user) + suction = !suction + to_chat(user, "You [suction ? "enable" : "disable"] the board's suction function.") + +/obj/item/circuitboard/machine/dish_drive/AltClick(mob/living/user) + if(!user.Adjacent(src)) + return + transmit = !transmit + to_chat(user, "You [transmit ? "enable" : "disable"] the board's automatic disposal transmission.") diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index b0d8c89c59..9d10ba36ba 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -25,6 +25,7 @@ new /obj/item/reagent_containers/glass/rag(src) new /obj/item/storage/box/beanbag(src) new /obj/item/clothing/suit/armor/vest/alt(src) + new /obj/item/circuitboard/machine/dish_drive(src) new /obj/item/clothing/glasses/sunglasses/reagent(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/storage/belt/bandolier(src) @@ -48,6 +49,7 @@ new /obj/item/clothing/head/soft/mime(src) new /obj/item/storage/box/mousetraps(src) new /obj/item/storage/box/mousetraps(src) + new /obj/item/circuitboard/machine/dish_drive(src) new /obj/item/clothing/suit/toggle/chef(src) new /obj/item/clothing/under/rank/chef(src) new /obj/item/clothing/head/chefhat(src) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index b724c69e3b..fc06dcd0ab 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -426,3 +426,10 @@ id = "cell_charger" build_path = /obj/item/circuitboard/machine/cell_charger category = list ("Misc. Machinery") + +/datum/design/board/dish_drive + name = "Machine Design (Dish Drive)" + desc = "The circuit board for a dish drive." + id = "dish_drive" + build_path = /obj/item/circuitboard/machine/dish_drive + category = list ("Misc. Machinery") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 1f2b906857..afdbcb4d4d 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -35,7 +35,7 @@ display_name = "Biological Processing" description = "From slimes to kitchens." prereq_ids = list("biotech") - design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder") + design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") research_cost = 2500 export_price = 5000 diff --git a/goon/icons/obj/kitchen.dmi b/goon/icons/obj/kitchen.dmi new file mode 100644 index 0000000000..b45307a647 Binary files /dev/null and b/goon/icons/obj/kitchen.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 4052c7ee8e..e5ff8ed7b1 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -529,6 +529,7 @@ #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" #include "code\game\machinery\deployable.dm" +#include "code\game\machinery\dish_drive.dm" #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\droneDispenser.dm"