From 5ab6ee2f4acdd0d4bed352952a930e41ce45b240 Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Tue, 24 Sep 2024 02:20:47 +0200 Subject: [PATCH] Food Replicator (#8873) --- .../reagents/reagent_containers/glass.dm | 3 +- .../code/game/machinery/food_replicator.dm | 234 ++++++++++++++++++ .../research/designs/circuits/circuits.dm | 7 + .../icons/obj/machines/food_replicator.dmi | Bin 0 -> 1129 bytes vorestation.dme | 2 + 5 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 modular_chomp/code/game/machinery/food_replicator.dm create mode 100644 modular_chomp/code/modules/research/designs/circuits/circuits.dm create mode 100644 modular_chomp/icons/obj/machines/food_replicator.dmi diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index c618d91754..9306e4b679 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -51,7 +51,8 @@ /obj/machinery/radiocarbon_spectrometer, /obj/machinery/portable_atmospherics/powered/reagent_distillery, /obj/machinery/feeder, - /obj/machinery/chemical_synthesizer //CHOMPedit, + /obj/machinery/chemical_synthesizer, //CHOMPedit, + /obj/machinery/food_replicator // CHOMPAdd ) //CHOMP Addition for feeder in the above list. I am paranoid about comments within lists so this is outside. diff --git a/modular_chomp/code/game/machinery/food_replicator.dm b/modular_chomp/code/game/machinery/food_replicator.dm new file mode 100644 index 0000000000..97db4d788c --- /dev/null +++ b/modular_chomp/code/game/machinery/food_replicator.dm @@ -0,0 +1,234 @@ +/obj/machinery/food_replicator + name = "Food Replicator" + icon = 'modular_chomp/icons/obj/machines/food_replicator.dmi' + icon_state = "food_replicator" + + anchored = TRUE + density = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 20 + active_power_usage = 200 + + var/print_delay = 150 + var/print_cost + + var/efficiency = 1.35 + var/speed = 1 + + var/obj/item/weapon/reagent_containers/container = null + var/printing = FALSE + var/list/products = list() + +/obj/item/weapon/circuitboard/food_replicator + name = T_BOARD("food replicator") + build_path = /obj/machinery/food_replicator + board_type = new /datum/frame/frame_types/machine + origin_tech = list(TECH_ENGINEERING = 2, TECH_BIO = 2) + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 3, + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/motor = 1, + /obj/item/stack/cable_coil = 5, + ) + +/obj/machinery/food_replicator/Initialize() + . = ..() + + default_apply_parts() + RefreshParts() + +/obj/machinery/food_replicator/dismantle() + var/turf/T = get_turf(src) + if(T) + if(container) + container.forceMove(T) + container = null + QDEL_NULL_LIST(products) + return ..() + +/obj/machinery/food_replicator/attack_hand(mob/user as mob) + add_fingerprint(user) + if(stat & (BROKEN|NOPOWER)) + return + + if(panel_open) + to_chat(user, SPAN_WARNING("Close the panel first!")) + return + + if(printing) + to_chat(user, SPAN_WARNING("\The [src] is busy!")) + return + + interact(user) + +/obj/machinery/food_replicator/interact(mob/user) + if(!isemptylist(products)) + var/choice = tgui_input_list(user, "What would you like to print?", "Print a dish", products) + + if(!choice || printing || (stat & (BROKEN|NOPOWER))) + return + + var/product_path = products[choice] + var/obj/item/weapon/reagent_containers/foodItem = new product_path + + var/total = clamp(foodItem.reagents.get_free_space()-foodItem.reagents.total_volume, 1, 300) + + if(!container) + to_chat(user, SPAN_WARNING("There is no container!")) + return + + if(container && container.reagents) + if(!container.reagents.has_reagent("nutriment", (total*efficiency))) + playsound(src, "sound/machines/buzz-sigh.ogg", 25, 0) + to_chat(user, SPAN_WARNING("Not enough nutriment available!")) + return + + container.reagents.remove_reagent("nutriment", (total*efficiency)) + + update_use_power(USE_POWER_ACTIVE) + printing = TRUE + update_icon() + + if(product_path) + foodItem = new product_path(src) + + if(istype(foodItem, /obj/item/weapon/reagent_containers/food/snacks/donkpocket)) + var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/donkp = foodItem + donkp.heat() + + if(foodItem.reagents.has_reagent("supermatter")) + self_destruct() + + visible_message(SPAN_NOTICE("\The [src] begins to shape a nutriment slurry.")) + + sleep(print_delay/speed) + + ping() + update_use_power(USE_POWER_IDLE) + printing = FALSE + update_icon() + + if(!src || (stat & (BROKEN|NOPOWER))) + return + + if(foodItem) + foodItem.forceMove(get_turf(src)) + + else + to_chat(user, SPAN_WARNING("There is no food to replicate!")) + + +/obj/machinery/food_replicator/attackby(obj/item/O, mob/user) + if(default_deconstruction_screwdriver(user, O)) + return + if(default_deconstruction_crowbar(user, O)) + return + if(default_unfasten_wrench(user, O)) + return + if(default_part_replacement(user, O)) + return + if(istype(O, /obj/item/weapon/reagent_containers/food)) + balloon_alert(user, "Scanning...") + if(!do_after(user, 10)) + return + foodcheck(O) + return + if(istype(O, /obj/item/weapon/reagent_containers/glass)) + if(!isnull(container)) + to_chat(user, SPAN_WARNING("There is already a reagent container inserted!")) + return + + user.drop_item() + O.loc = src + container = O + balloon_alert(user, "Placed \the [O] in \the [src]") + return + + return ..() + +/obj/machinery/food_replicator/proc/foodcheck(var/obj/item/weapon/reagent_containers/food) + var/mob/living/mob = locate(/mob/living) in food + if(mob) + playsound(src, "sound/machines/buzz-two.ogg", 25, 0) + return + + var/food_name = food.name + var/path = food.type + + if(!products[food_name]) + products[food_name] = path + playsound(src, "sound/machines/ping.ogg", 25, 0) + else + playsound(src, "sound/machines/buzz-sigh.ogg", 25, 0) + + return + +/obj/machinery/food_replicator/update_icon() + cut_overlays() + + icon_state = initial(icon_state) + + if(stat & BROKEN) + icon_state = "destroyed" + if(panel_open) + add_overlay("panel_open") + if(stat & NOPOWER|EMPED) + add_overlay("poweroff") + if(printing) + add_overlay("printing") + +/obj/machinery/food_replicator/process() + if(stat & (NOPOWER|BROKEN|EMPED)) + update_use_power(USE_POWER_OFF) + return + if(printing) + update_use_power(USE_POWER_ACTIVE) + return + else + use_power = USE_POWER_IDLE + +/obj/machinery/food_replicator/RefreshParts() + var/cap_rating = 0 + var/man_rating = 0 + + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + cap_rating += C.rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + man_rating += M.rating + + efficiency = (man_rating > 0) ? 6 / man_rating : 3 + speed = cap_rating / 2 + + +/obj/machinery/food_replicator/verb/eject_beaker() + set name = "Eject Beaker" + set category = "Object" + set src in oview(1) + + if(usr.stat != 0) + return + + add_fingerprint(usr) + remove_beaker() + return + +/obj/machinery/food_replicator/proc/remove_beaker() + if(container) + container.forceMove(get_turf(src)) + container = null + return TRUE + return FALSE + +/obj/machinery/food_replicator/proc/self_destruct() + visible_message(SPAN_WARNING("Whirrs and spouts, starting to heat up!")) + playsound(src, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 50, 1) + + message_admins("[src] attempted to create an EX donk pocket at [x], [y], [z], last touched by [fingerprintslast]") + log_game("[src] attempted to create an EX donk pocket at [x], [y], [z], last touched by [fingerprintslast]. (JMP)", 1) + + sleep(6 SECONDS) // GET OUT, GET OUT + stat = BROKEN + update_icon() + explosion(src, 0, 0, 2) + return diff --git a/modular_chomp/code/modules/research/designs/circuits/circuits.dm b/modular_chomp/code/modules/research/designs/circuits/circuits.dm new file mode 100644 index 0000000000..3ae9623baf --- /dev/null +++ b/modular_chomp/code/modules/research/designs/circuits/circuits.dm @@ -0,0 +1,7 @@ +/datum/design/circuit/food_replicator + name = "food replicator" + id = "food replicator" + req_tech = list(TECH_DATA = 1, TECH_MATERIAL = 2) + build_path = /obj/item/weapon/circuitboard/food_replicator + sort_string = "MAAAD" + department = LATHE_ALL | LATHE_ENGINEERING diff --git a/modular_chomp/icons/obj/machines/food_replicator.dmi b/modular_chomp/icons/obj/machines/food_replicator.dmi new file mode 100644 index 0000000000000000000000000000000000000000..dfa6839447132128cd34da6304d0b7790428155a GIT binary patch literal 1129 zcmV-v1eW`WP)C0001xP)t-sz`(#O zD=SV+Om%T_MMXt*b#;@IlfJ&bwzjscGBThW8=2)$gV-_0y*Mqm)L+fyI5;>(Lqln5 zY8)dWB`YZ|I5jdnIp^o++}zyI(9pWNy6^Ar!otGH$jC`TLNF~Y8X6jTHWX||GPZSbkEMgp00001bW%=J06^y0 zW&i*HwR%)obVOxyV{&P5bZKvH004NLg;2{1gD?<0o399Zl~NxRdg!Gn#Y6oC3C%_W zHY=M@@$VZeMGuxTmzmv}S=fkQ%Uf0R;$E>Akkx4Th3AJO3q~zn=S7yXpab1@ZV}cA z2cCusQ8olauOGr8g)ESotluOoP$Zr(^W0CN7n7%_IGM2)45W?Irrl4T*JK(m$iCQg z;0T0D?RRXC2?KqD1DL;73Dyx#Ab&X{Ue?9uXKyoESwk3O16}|C0>(*1K~#90?VAC6 znlKQCLt=GiTT6pAqOKe0Dy*yi|9`hjK*a!I8z#8!UWEtvj^i_^7|9WWAVAQJH=R(X z83iLnFe+B5H~kpEXl34zz?ptS1`65}IMPo6m(&xu(#hR;Jeho`GMS9Wci!~jTL1#4 zoKG41_z8s1Fx@{G38oNW(>VlG^oM&>hk(}ohi`%KF|6|#degz85F!$1)H3y`qk)?+ zFngMvd79M{IMr1^G_MlX5;)aw#(*qnP2fz|0dld33lSPQJC_Nk#`pgLwH_K8==_7hv0m}jr-R>5E<*YR^ph1ySHOEG>1cr@ zP3^n))Ab3kSV&T`*;w_|rf-t1(rp$J`kaFHwUvNbC-?z>TNEyfTruu_|^w@vDwgdIyR|O7H6fa?_*B2ZO zq-Fp8+8t=hSXtn}7(7|6zTn8V=)Z5T-2$ij0yuO`