From def8317533525f718151d4817b457de38afbd229 Mon Sep 17 00:00:00 2001 From: Will <7099514+Willburd@users.noreply.github.com> Date: Fri, 15 Aug 2025 06:50:10 -0400 Subject: [PATCH] Refinery mixing machine (#18254) * working on mixer * mixer icons * researching * fix transfer rates * update the book too --- code/game/machinery/frame.dm | 5 + .../items/weapons/circuitboards/frame.dm | 10 ++ code/game/objects/items/weapons/manuals.dm | 4 + .../core/industrial_reagent_filter.dm | 4 +- .../core/industrial_reagent_furnace.dm | 4 +- .../core/industrial_reagent_grinder.dm | 2 +- .../refinery/core/industrial_reagent_hub.dm | 6 +- .../core/industrial_reagent_machines.dm | 14 +- .../refinery/core/industrial_reagent_mixer.dm | 141 ++++++++++++++++++ .../refinery/core/industrial_reagent_pipe.dm | 4 +- .../refinery/core/industrial_reagent_pump.dm | 12 +- .../core/industrial_reagent_reactor.dm | 4 +- .../refinery/core/industrial_reagent_vat.dm | 6 +- .../refinery/core/industrial_reagent_waste.dm | 4 - .../research/tg/designs/boards/refinery.dm | 10 ++ .../research/tg/techwebs/nodes/engi_nodes.dm | 1 + icons/obj/machines/refinery_machines.dmi | Bin 16265 -> 18385 bytes icons/obj/stock_parts_refinery.dmi | Bin 13556 -> 14454 bytes vorestation.dme | 1 + 19 files changed, 207 insertions(+), 25 deletions(-) create mode 100644 code/modules/refinery/core/industrial_reagent_mixer.dm diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 89281eca65f..91743a8d237 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -237,6 +237,11 @@ GLOBAL_LIST(construction_frame_floor) icon_override = 'icons/obj/stock_parts_refinery.dmi' frame_class = FRAME_CLASS_MACHINE +/datum/frame/frame_types/industrial_reagent_mixer + name = "Industrial Chemical Mixer" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + /datum/frame/frame_types/industrial_reagent_pipe name = "Industrial Chemical Pipe" icon_override = 'icons/obj/stock_parts_refinery.dmi' diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index e721c7de0a2..fd09021baa5 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -343,6 +343,16 @@ /obj/item/stock_parts/motor = 1, /obj/item/stack/material/glass/reinforced = 1) +/obj/item/circuitboard/industrial_reagent_mixer + name = T_BOARD("industrial chemical mixer") + build_path = /obj/machinery/reagent_refinery/mixer + board_type = new /datum/frame/frame_types/industrial_reagent_mixer + req_components = list( + /obj/item/stock_parts/motor = 2, + /obj/item/stock_parts/gear = 2, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stack/material/glass/reinforced = 1) + /obj/item/circuitboard/industrial_reagent_pipe name = T_BOARD("industrial chemical pipe") build_path = /obj/machinery/reagent_refinery/pipe diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 530f73a0a16..ca17c1b11e6 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1726,6 +1726,10 @@
Pumps allow for the high volume exchange of reagents from one machine to another, but they are also useful for their multiple hose connectors. Allowing you to pump reagents from any other hose connector equipped tool. With this feature, they can serve as the input connection for long distance fracking networks.
+While not required for reagents to react together, a mixing vat will allow you to easily control the portion of reagents mixed. Mixers will take input from three directions, and output in the last direction. The mixing arm will stop at each input, and will not proceed until it has recieved the reagents.
+Using a pump, the amount of reagents transfered can be configured much more finely compared to handling reactions in vats. A mixer will refuse to take inputs if it cannot fully empty itself on a complete rotation. The rotation direction may be swapped at any time.
+While not directly a refinery machine, they serve a core function outside of the refinery. Fluid pumps will extract eroded ores from bodies of water near mineral rich deposits. Discussion of high value ores with an experienced miner is recommended. Ores must remain intact near a body of water to be collected by the pump.
Fluid pumps operate on an internal power cell, protected behind a water proof panel. A crowbar is handy for opening it. Hoses can be connected to a fluid pump, allowing it to connect to long distance tube networks.
diff --git a/code/modules/refinery/core/industrial_reagent_filter.dm b/code/modules/refinery/core/industrial_reagent_filter.dm index 93a05338d5f..27b54e18269 100644 --- a/code/modules/refinery/core/industrial_reagent_filter.dm +++ b/code/modules/refinery/core/industrial_reagent_filter.dm @@ -113,11 +113,11 @@ filter_side *= -1 update_icon() -/obj/machinery/reagent_refinery/filter/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/filter/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // pumps, furnaces and filters can only be FED in a straight line if(source_forward_dir != dir) return 0 - . = ..(origin_machine, RT, source_forward_dir, filter_id) + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) /obj/machinery/reagent_refinery/filter/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_furnace.dm b/code/modules/refinery/core/industrial_reagent_furnace.dm index fa94ae5607c..7b61adf1e9b 100644 --- a/code/modules/refinery/core/industrial_reagent_furnace.dm +++ b/code/modules/refinery/core/industrial_reagent_furnace.dm @@ -192,11 +192,11 @@ filter_side *= -1 update_icon() -/obj/machinery/reagent_refinery/furnace/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/furnace/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // pumps, furnaces and filters can only be FED in a straight line if(source_forward_dir != dir) return 0 - . = ..(origin_machine, RT, source_forward_dir, filter_id) + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) /obj/machinery/reagent_refinery/furnace/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_grinder.dm b/code/modules/refinery/core/industrial_reagent_grinder.dm index 09087c51d59..2d633907700 100644 --- a/code/modules/refinery/core/industrial_reagent_grinder.dm +++ b/code/modules/refinery/core/industrial_reagent_grinder.dm @@ -143,6 +143,6 @@ . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." tutorial(REFINERY_TUTORIAL_NOINPUT, .) -/obj/machinery/reagent_refinery/grinder/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/grinder/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // Grinder forbids input return 0 diff --git a/code/modules/refinery/core/industrial_reagent_hub.dm b/code/modules/refinery/core/industrial_reagent_hub.dm index e5539c9cc59..a7bfe3c1de5 100644 --- a/code/modules/refinery/core/industrial_reagent_hub.dm +++ b/code/modules/refinery/core/industrial_reagent_hub.dm @@ -62,7 +62,7 @@ var/image/pipe = image(icon, icon_state = "hub_cons", dir = dir) add_overlay(pipe) -/obj/machinery/reagent_refinery/hub/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/hub/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") if(istype(origin_machine,/obj/machinery/reagent_refinery/hub)) // Hubs cannot send into other hubs return 0 if(dir != GLOB.reverse_dir[source_forward_dir] ) // The hub must be facing into its source to accept input, unlike others @@ -74,10 +74,10 @@ return 0 // Don't call parent, we're transfering into the holding tank instead if(filter_id == "") - return RT.trans_to_obj(tanker, amount_per_transfer_from_this) + return RT.trans_to_obj(tanker, transfer_rate) else // Split out reagent... - return RT.trans_id_to(tanker, filter_id, amount_per_transfer_from_this) + return RT.trans_id_to(tanker, filter_id, transfer_rate) /obj/machinery/reagent_refinery/hub/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_machines.dm b/code/modules/refinery/core/industrial_reagent_machines.dm index 5da9e471bd7..fedb3df110c 100644 --- a/code/modules/refinery/core/industrial_reagent_machines.dm +++ b/code/modules/refinery/core/industrial_reagent_machines.dm @@ -100,19 +100,19 @@ return 0 if(!istype(target,/obj/machinery/reagent_refinery)) // cannot transfer into grinders anyway, so it's fine to do it this way. return 0 - var/transfered = target.handle_transfer(src,RT,source_forward_dir,filter_id) + var/transfered = target.handle_transfer(src,RT,source_forward_dir, amount_per_transfer_from_this, filter_id) if(transfered > 0 && active_power_usage > 0) use_power_oneoff(active_power_usage) return transfered /// Handles reagent recieving from transfer_tank(), returns how much reagent was transfered if successful. Overriden to prevent access from certain sides or for filtering. -/obj/machinery/reagent_refinery/proc/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") // Handle transfers in an override, instead of one monster function that typechecks like transfer_tank() used to be +/obj/machinery/reagent_refinery/proc/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // Handle transfers in an override, instead of one monster function that typechecks like transfer_tank() used to be // Transfer to target in amounts every process tick! if(filter_id == "") - var/amount = RT.trans_to_obj(src, amount_per_transfer_from_this) + var/amount = RT.trans_to_obj(src, transfer_rate) return amount // Split out reagent... - return RT.trans_id_to(src, filter_id, amount_per_transfer_from_this, TRUE) + return RT.trans_id_to(src, filter_id, transfer_rate, TRUE) /obj/machinery/reagent_refinery/proc/refinery_transfer() if(amount_per_transfer_from_this <= 0 || reagents.total_volume <= 0) @@ -122,9 +122,15 @@ var/obj/machinery/reagent_refinery/target = locate(/obj/machinery/reagent_refinery) in get_step(get_turf(src),dir) if(!target) return 0 + if(reagents.total_volume < minimum_reagents_for_transfer(target)) + return 0 return transfer_tank( reagents, target, dir) +/// Handle transfers that require a minimum amount of reagents to happen +/obj/machinery/reagent_refinery/proc/minimum_reagents_for_transfer(var/obj/machinery/reagent_refinery/target) + return 0 + /obj/machinery/reagent_refinery/verb/rotate_clockwise() set name = "Rotate Machine Clockwise" set category = "Object" diff --git a/code/modules/refinery/core/industrial_reagent_mixer.dm b/code/modules/refinery/core/industrial_reagent_mixer.dm new file mode 100644 index 00000000000..5226079d58c --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_mixer.dm @@ -0,0 +1,141 @@ +/obj/machinery/reagent_refinery/mixer + name = "Industrial Chemical Mixer" + desc = "A large mixing machine. Each input is only fed into the mixer once during each rotation." + icon_state = "mixer" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 0 + active_power_usage = 50 + circuit = /obj/item/circuitboard/industrial_reagent_mixer + default_max_vol = 240 // Two large beakers of volume + var/mixer_angle = 0 + var/mixer_rotation_rate = 45 + var/got_input = FALSE + +/obj/machinery/reagent_refinery/mixer/Initialize(mapload) + mixer_angle = dir2angle(dir) + . = ..() + default_apply_parts() + // Can't be set on these + src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT + +/obj/machinery/reagent_refinery/mixer/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + if(mixer_angle == dir2angle(dir)) + // Drain it! + refinery_transfer() + got_input = FALSE + if(reagents.total_volume <= 0) + mixer_angle += mixer_rotation_rate + update_icon() + else + // Check if we were filled... + if(mixer_angle % 90 != 0) // Not cardinal, keep going + got_input = TRUE + else if(!(locate(/obj/machinery/reagent_refinery) in get_step(src,angle2dir(mixer_angle)))) // If nothing, keep rotating + got_input = TRUE + + if(got_input) + mixer_angle += mixer_rotation_rate + got_input = FALSE + update_icon() + + // Modulus for sanity + mixer_angle = (360 + mixer_angle) % 360 + +/obj/machinery/reagent_refinery/mixer/update_icon() + cut_overlays() + // GOOBY! + if(reagents && reagents.total_volume >= 5) + var/percent = (reagents.total_volume / reagents.maximum_volume) * 100 + switch(percent) + if(5 to 20) percent = 2 + if(20 to 40) percent = 4 + if(40 to 60) percent = 6 + if(60 to 80) percent = 8 + if(80 to INFINITY) percent = 10 + var/image/filling = image(icon, loc, "mixer_r_[percent]",dir = dir) + filling.color = reagents.get_color() + add_overlay(filling) + // Get main dir pipe + var/image/pipe = image(icon, icon_state = "mixer_cons", dir = dir) + add_overlay(pipe) + if(anchored) + if(!(stat & (NOPOWER|BROKEN))) + var/image/dot = image(icon, icon_state = "mixer_dot_[ got_input ? "on" : "off" ]") + add_overlay(dot) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(get_turf(src),direction) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + if(other && other.anchored) + // Waste processors do not connect to anything as outgoing + if(istype(other,/obj/machinery/reagent_refinery/waste_processor)) + continue + // weird handling for side connections... Otherwise, anything pointing into use gets connected back! + if(istype(other,/obj/machinery/reagent_refinery/filter)) + var/obj/machinery/reagent_refinery/filter/filt = other + var/check_dir = 0 + if(filt.get_filter_side() == 1) + check_dir = turn(filt.dir, 270) + else + check_dir = turn(filt.dir, 90) + if(check_dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "mixer_intakes", dir = direction) + add_overlay(intake) + continue + if(other.dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "mixer_intakes", dir = direction) + add_overlay(intake) + // Get mixer overlay + var/image/arm = image(icon, icon_state = "mixer_arm", dir = angle2dir(mixer_angle)) + add_overlay(arm) + +/obj/machinery/reagent_refinery/mixer/attack_hand(mob/user) + set_rotation() + +/obj/machinery/reagent_refinery/mixer/verb/set_rotation() + PRIVATE_PROC(TRUE) + set name = "Set Mixer Rotation" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained()) + return + + if(mixer_rotation_rate > 0) + mixer_rotation_rate = -45 + to_chat(usr,span_notice("You set \the [src] to rotate counter clockwise.")) + else + mixer_rotation_rate = 45 + to_chat(usr,span_notice("You set \the [src] to rotate clockwise.")) + + +/obj/machinery/reagent_refinery/mixer/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_SINGLEOUTPUT, .) + +/obj/machinery/reagent_refinery/mixer/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") + // no back/forth, filters don't use just their forward, they send the side too! + if(mixer_angle % 90 != 0) // Only handle proper directions + return 0 + if(got_input) // Only ONCE per direction + return 0 + if(dir == GLOB.reverse_dir[source_forward_dir]) + return 0 + if(get_turf(origin_machine) != get_step(src,angle2dir(mixer_angle))) // Check if the mixer arm is pointing at the machine too! + return 0 + + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) + + // If we transfered anything, then inform process() of it! + if(.) + got_input = TRUE + update_icon() diff --git a/code/modules/refinery/core/industrial_reagent_pipe.dm b/code/modules/refinery/core/industrial_reagent_pipe.dm index 5af43dbe4a0..87cca1027cc 100644 --- a/code/modules/refinery/core/industrial_reagent_pipe.dm +++ b/code/modules/refinery/core/industrial_reagent_pipe.dm @@ -55,11 +55,11 @@ var/image/intake = image(icon, icon_state = "pipe_intakes", dir = direction) add_overlay(intake) -/obj/machinery/reagent_refinery/pipe/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/pipe/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // no back/forth, filters don't use just their forward, they send the side too! if(dir == GLOB.reverse_dir[source_forward_dir]) return 0 - . = ..(origin_machine, RT, source_forward_dir, filter_id) + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) /obj/machinery/reagent_refinery/pipe/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_pump.dm b/code/modules/refinery/core/industrial_reagent_pump.dm index 612ff9a4cbb..5c833b25a7a 100644 --- a/code/modules/refinery/core/industrial_reagent_pump.dm +++ b/code/modules/refinery/core/industrial_reagent_pump.dm @@ -33,6 +33,14 @@ refinery_transfer() +/obj/machinery/reagent_refinery/minimum_reagents_for_transfer(var/obj/machinery/reagent_refinery/target) + if(istype(target,/obj/machinery/reagent_refinery/mixer)) // Special handling for mixer. Don't pump unless we can pump at least our transfer amount! + var/obj/machinery/reagent_refinery/mixer/M = target + if(M.got_input) + return INFINITY // block em + return amount_per_transfer_from_this + return 0 + /obj/machinery/reagent_refinery/pump/update_icon() cut_overlays() if(reagents && reagents.total_volume >= 5) @@ -43,11 +51,11 @@ /obj/machinery/reagent_refinery/pump/attack_hand(mob/user) set_APTFT() -/obj/machinery/reagent_refinery/pump/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/pump/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // pumps, furnaces and filters can only be FED in a straight line if(source_forward_dir != dir) return 0 - . = ..(origin_machine, RT, source_forward_dir, filter_id) + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) /obj/machinery/reagent_refinery/pump/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_reactor.dm b/code/modules/refinery/core/industrial_reagent_reactor.dm index 6030093e959..72928a75c72 100644 --- a/code/modules/refinery/core/industrial_reagent_reactor.dm +++ b/code/modules/refinery/core/industrial_reagent_reactor.dm @@ -98,14 +98,14 @@ var/image/intake = image(icon, icon_state = "reactor_intakes", dir = direction) add_overlay(intake) -/obj/machinery/reagent_refinery/reactor/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/reactor/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // no back/forth, filters don't use just their forward, they send the side too! if(dir == GLOB.reverse_dir[source_forward_dir]) return 0 // locked until distilling mode if(toggle_mode == REACTOR_MODE_OUTPUT) return 0 - . = ..(origin_machine, RT, source_forward_dir, filter_id) + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) /obj/machinery/reagent_refinery/reactor/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_vat.dm b/code/modules/refinery/core/industrial_reagent_vat.dm index 814571f0b11..41effa3c393 100644 --- a/code/modules/refinery/core/industrial_reagent_vat.dm +++ b/code/modules/refinery/core/industrial_reagent_vat.dm @@ -1,6 +1,6 @@ /obj/machinery/reagent_refinery/vat name = "Industrial Chemical Vat" - desc = "A large mixing vat for huge quantities of chemicals. Don't fall in!" + desc = "A large storage vat for huge quantities of chemicals. Don't fall in!" icon_state = "vat" density = TRUE anchored = TRUE @@ -82,11 +82,11 @@ . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." tutorial(REFINERY_TUTORIAL_SINGLEOUTPUT, .) -/obj/machinery/reagent_refinery/vat/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") +/obj/machinery/reagent_refinery/vat/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/transfer_rate, var/filter_id = "") // no back/forth, filters don't use just their forward, they send the side too! if(dir == GLOB.reverse_dir[source_forward_dir]) return 0 - . = ..(origin_machine, RT, source_forward_dir, filter_id) + . = ..(origin_machine, RT, source_forward_dir, transfer_rate, filter_id) /obj/machinery/reagent_refinery/vat/MouseDrop_T(var/atom/movable/C, mob/user as mob) if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove)) diff --git a/code/modules/refinery/core/industrial_reagent_waste.dm b/code/modules/refinery/core/industrial_reagent_waste.dm index ed67d58afab..3d3b66e0e51 100644 --- a/code/modules/refinery/core/industrial_reagent_waste.dm +++ b/code/modules/refinery/core/industrial_reagent_waste.dm @@ -59,10 +59,6 @@ var/image/intake = image(icon, icon_state = "waste_intakes", dir = direction) add_overlay(intake) -/obj/machinery/reagent_refinery/waste_processor/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") - // Waste tanks accept from all sides - . = ..(origin_machine, RT, source_forward_dir, filter_id) - /obj/machinery/reagent_refinery/waste_processor/examine(mob/user, infix, suffix) . = ..() . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." diff --git a/code/modules/research/tg/designs/boards/refinery.dm b/code/modules/research/tg/designs/boards/refinery.dm index 3655598dc43..4d3d4568ebe 100644 --- a/code/modules/research/tg/designs/boards/refinery.dm +++ b/code/modules/research/tg/designs/boards/refinery.dm @@ -78,6 +78,16 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING +/datum/design_techweb/board/industrial_reagent_mixer + name = "Industrial Reagent Mixer" + id = "industrial_reagent_mixer" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_mixer + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + /datum/design_techweb/board/industrial_reagent_waste_processor name = "Industrial Reagent Waste Processor" id = "industrial_reagent_waste_processor" diff --git a/code/modules/research/tg/techwebs/nodes/engi_nodes.dm b/code/modules/research/tg/techwebs/nodes/engi_nodes.dm index 37a3f8cff45..ada2cddb663 100644 --- a/code/modules/research/tg/techwebs/nodes/engi_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/engi_nodes.dm @@ -321,6 +321,7 @@ "industrial_reagent_pump", "industrial_reagent_reactor", "industrial_reagent_vat", + "industrial_reagent_mixer", "industrial_reagent_waste_processor", "smart_centrifuge", "pump_relay", diff --git a/icons/obj/machines/refinery_machines.dmi b/icons/obj/machines/refinery_machines.dmi index 8382161a54dbb4d53bad5960c081cfe47360720b..259e412ac437f499e45589ce0aebca4e001f2ed8 100644 GIT binary patch literal 18385 zcmbrmWmuHq7B)IVhm@4kp`?U>AP57}APv%`fPkcQ4-FC$4j|niNJuxMB2vmw(lQ_n zEise>!_0Zzd!O&ecU|Y#`N0Kmt*6$y*Ym8kZeAPcX;4wHP=G)nDlJV_BM=B&^6!U? z1h}&=-C_Y;)P$Ir`>8tlI{3JH`?-2~f)0))uQ2&^FeR-&!Y_&F@YK8W1p(5k~0wS+d3Ne32*hBB8@s{gA#Zn
z>95bFqTjseb`&$-PS!4qDvP*OEyjFdJe^z8*zqvc34ek2cz!3>_>~uHJ =uU$ClMx4@!b`)gjzL6BS0vOCq`(E_>9_mdSrp
zIr$+#m{x_kL%C(R3t&HNMK)qL63mnO}OMMTUSn$}p6y|0l?r6*5Z_`1K<4R^H@%q{(NYi8aQk`;jCO1xlG=
zwz@Fy`W6tB5_C}i
!xzti^*d_v{v
zP_;fEKk**F2xi()uY2V2H#mD+_@in)b3`@G=#qE_Y6@HPjrScHPNE?>P^ZLX2VV`2
zM3={Myk3Z(W`1)H