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`