From d81e1fab5cecb361e2f0fd19c3f67b5ee2647235 Mon Sep 17 00:00:00 2001 From: Time-Green Date: Tue, 3 Sep 2019 08:52:29 +0200 Subject: [PATCH] Plumbing Splitter, reaction chamber, destroyer and pill press (#46149) * chemical splitters * adds the pill press also removes a debug variable from the splitter used for getting the perfect ui size * chem disposer * half a reaction chamber i forgot to fucking merge upstream so I cant do anything without making ungodly conflicts * wip * more work on the reaction chamber * fixes big brain maths * removes one / because travis is throwing a shitfit --- code/__DEFINES/plumbing.dm | 4 +- code/__DEFINES/reagents.dm | 3 + code/datums/components/plumbing/_plumbing.dm | 12 +-- .../plumbing/chemical_acclimator.dm | 18 ++++ .../components/plumbing/reaction_chamber.dm | 43 +++++++++ code/datums/components/plumbing/splitter.dm | 47 ++++++++++ code/modules/plumbing/plumbers/destroyer.dm | 26 ++++++ code/modules/plumbing/plumbers/filter.dm | 6 +- code/modules/plumbing/plumbers/pill_press.dm | 87 +++++++++++++++++++ .../plumbing/plumbers/reaction_chamber.dm | 56 ++++++++++++ code/modules/plumbing/plumbers/splitters.dm | 49 +++++++++++ code/modules/reagents/chemistry/holder.dm | 6 ++ .../chemistry/machinery/chem_master.dm | 8 +- tgstation.dme | 7 ++ tgui/src/interfaces/chem_press.ract | 11 +++ tgui/src/interfaces/chem_splitter.ract | 8 ++ tgui/src/interfaces/reaction_chamber.ract | 9 ++ 17 files changed, 382 insertions(+), 18 deletions(-) create mode 100644 code/datums/components/plumbing/chemical_acclimator.dm create mode 100644 code/datums/components/plumbing/reaction_chamber.dm create mode 100644 code/datums/components/plumbing/splitter.dm create mode 100644 code/modules/plumbing/plumbers/destroyer.dm create mode 100644 code/modules/plumbing/plumbers/pill_press.dm create mode 100644 code/modules/plumbing/plumbers/reaction_chamber.dm create mode 100644 code/modules/plumbing/plumbers/splitters.dm create mode 100644 tgui/src/interfaces/chem_press.ract create mode 100644 tgui/src/interfaces/chem_splitter.ract create mode 100644 tgui/src/interfaces/reaction_chamber.ract diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm index bfc781e02f8..ec1c678a801 100644 --- a/code/__DEFINES/plumbing.dm +++ b/code/__DEFINES/plumbing.dm @@ -4,4 +4,6 @@ #define FOURTH_DUCT_LAYER 8 #define FIFTH_DUCT_LAYER 16 -#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER \ No newline at end of file +#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER + +#define MACHINE_REAGENT_TRANSFER 10 //the default max plumbing machinery transfers \ No newline at end of file diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index ec04edfec8f..3e9f6346f55 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -29,3 +29,6 @@ #define REM_REAGENT 3 // reagent removed (may still exist) #define MIMEDRINK_SILENCE_DURATION 30 //ends up being 60 seconds given 1 tick every 2 seconds +//used by chem masters and pill presses +#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die +#define RANDOM_PILL_STYLE 22 //Dont change this one though \ No newline at end of file diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index c149f03f1d9..bca95173727 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -54,7 +54,7 @@ return TRUE ///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour /datum/component/plumbing/proc/send_request(dir) - process_request(amount = 10, reagent = null, dir = dir) + process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir) ///check who can give us what we want, and how many each of them will give us /datum/component/plumbing/proc/process_request(amount, reagent, dir) var/list/valid_suppliers = list() @@ -71,12 +71,14 @@ give.transfer_to(src, amount / valid_suppliers.len, reagent, net) ///returns TRUE when they can give the specified amount and reagent. called by process request /datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net) - if(!reagents || amount <= 0) + if(amount <= 0) return if(reagent) //only asked for one type of reagent - if(reagent in reagents.reagent_list) - return TRUE + for(var/A in reagents.reagent_list) + var/datum/reagent/R = A + if(R.type == reagent) + return TRUE else if(reagents.total_volume > 0) //take whatever return TRUE ///this is where the reagent is actually transferred and is thus the finish point of our process() @@ -192,4 +194,4 @@ ///input and output, like a holding tank /datum/component/plumbing/tank demand_connects = WEST - supply_connects = EAST + supply_connects = EAST \ No newline at end of file diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm new file mode 100644 index 00000000000..ae481ae0baa --- /dev/null +++ b/code/datums/components/plumbing/chemical_acclimator.dm @@ -0,0 +1,18 @@ +/datum/component/plumbing/acclimator + demand_connects = WEST + supply_connects = EAST + +/datum/component/plumbing/acclimator/Initialize(start=TRUE, _turn_connects=TRUE) + . = ..() + if(. && istype(parent, /obj/machinery/plumbing/acclimator)) + return TRUE + +/datum/component/plumbing/acclimator/can_give(amount, reagent) + . = ..() + if(.) + var/obj/machinery/plumbing/acclimator/AC = parent + if(AC.reagents.chem_temp >= AC.target_temperature && AC.target_temperature + AC.allowed_temperature_difference >= AC.reagents.chem_temp) //cooling here + return TRUE + if(AC.reagents.chem_temp <= AC.target_temperature && AC.target_temperature - AC.allowed_temperature_difference <= AC.reagents.chem_temp) //heating here + return TRUE + return FALSE \ No newline at end of file diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm new file mode 100644 index 00000000000..8caf8a6b091 --- /dev/null +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -0,0 +1,43 @@ +/datum/component/plumbing/reaction_chamber + demand_connects = WEST + supply_connects = EAST + +/datum/component/plumbing/reaction_chamber/Initialize(start=TRUE, _turn_connects=TRUE) + . = ..() + if(!istype(parent, /obj/machinery/plumbing/reaction_chamber)) + return COMPONENT_INCOMPATIBLE + +/datum/component/plumbing/reaction_chamber/can_give(amount, reagent) + . = ..() + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(!. || !RC.emptying) + return FALSE + +/datum/component/plumbing/reaction_chamber/send_request(dir) + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(RC.emptying || !LAZYLEN(RC.required_reagents)) + return + for(var/RT in RC.required_reagents) + var/has_reagent = FALSE + for(var/A in reagents.reagent_list) + var/datum/reagent/RD = A + if(RT == RD.type) + has_reagent = TRUE + if(RD.volume < RC.required_reagents[RT]) + process_request(min(RC.required_reagents[RT] - RD.volume, MACHINE_REAGENT_TRANSFER) , RT, dir) + return + if(!has_reagent) + process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir) + return + reagents.flags &= ~NO_REACT + RC.emptying = TRUE + +/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) + . = ..() + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(!. || !RC.emptying) + return FALSE + + + + diff --git a/code/datums/components/plumbing/splitter.dm b/code/datums/components/plumbing/splitter.dm new file mode 100644 index 00000000000..c4c322c2ab3 --- /dev/null +++ b/code/datums/components/plumbing/splitter.dm @@ -0,0 +1,47 @@ +/datum/component/plumbing/splitter + demand_connects = NORTH + supply_connects = SOUTH | EAST + +/datum/component/plumbing/splitter/Initialize() + . = ..() + if(. && !istype(parent, /obj/machinery/plumbing/splitter)) + return FALSE + +/datum/component/plumbing/splitter/can_give(amount, reagent, datum/ductnet/net) + . = ..() + if(!.) + return + . = FALSE + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + var/obj/machinery/plumbing/splitter/S = parent + switch(direction) + if(SOUTH) + if(S.turn_straight && S.transfer_straight <= amount) + S.turn_straight = FALSE + return TRUE + if(EAST) + if(!S.turn_straight && S.transfer_side <= amount) + S.turn_straight = FALSE + return TRUE + +/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + var/obj/machinery/plumbing/splitter/S = parent + switch(direction) + if(SOUTH) + if(amount >= S.transfer_straight) + amount = S.transfer_straight + if(EAST) + if(amount >= S.transfer_side) + amount = S.transfer_side + . = ..() + + diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm new file mode 100644 index 00000000000..f872e251b80 --- /dev/null +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -0,0 +1,26 @@ +/obj/machinery/plumbing/disposer + name = "chemical disposer" + desc = "Breaks down chemicals and annihilates them." + icon_state = "disposal" + ///we remove 10 reagents per second + var/disposal_rate = 10 + +/obj/machinery/plumbing/disposer/Initialize() + . = ..() + AddComponent(/datum/component/plumbing/simple_demand) + +/obj/machinery/plumbing/disposer/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/plumbing/disposer/process() + if(stat & NOPOWER) + return + if(reagents.total_volume) + if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states + icon_state = initial(icon_state) + "_working" + reagents.remove_any(disposal_rate) + else + if(icon_state != initial(icon_state)) + icon_state = initial(icon_state) + diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm index af0bb066a2b..a42227a6413 100644 --- a/code/modules/plumbing/plumbers/filter.dm +++ b/code/modules/plumbing/plumbers/filter.dm @@ -70,8 +70,4 @@ english_right -= chem_name right -= chem_id -/obj/machinery/plumbing/filter/proc/get_chem_id(chem_name) - for(var/A in GLOB.chemical_reagents_list) - var/datum/reagent/R = GLOB.chemical_reagents_list[A] - if(chem_name == ckey(R.name)) - return R.type + diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm new file mode 100644 index 00000000000..3ad62cdf648 --- /dev/null +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -0,0 +1,87 @@ +///We take a constant input of reagents, and produce a pill once a set volume is reached +/obj/machinery/plumbing/pill_press + name = "pill press" + desc = "A press that presses pills." + icon_state = "pill_press" + ///the minimum size a pill can be + var/minimum_pill = 5 + ///the maximum size a pill can be + var/maximum_pill = 50 + ///the size of the pill + var/pill_size = 10 + ///pill name + var/pill_name = "factory pill" + ///the icon_state number for the pill. + var/pill_number = RANDOM_PILL_STYLE + ///list of id's and icons for the pill selection of the ui + var/list/pill_styles + + var/xen = 500 + var/yen = 500 + +/obj/machinery/plumbing/pill_press/Initialize(mapload) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand) + + //expertly copypasted from chemmasters + var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) + pill_styles = list() + for (var/x in 1 to PILL_STYLE_COUNT) + var/list/SL = list() + SL["id"] = x + SL["htmltag"] = assets.icon_tag("pill[x]") + pill_styles += list(SL) + +/obj/machinery/plumbing/pill_press/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/plumbing/pill_press/process() + if(stat & NOPOWER) + return + if(reagents.total_volume >= pill_size) + var/obj/item/reagent_containers/pill/P = new(drop_location()) + reagents.trans_to(P, pill_size) + P.name = pill_name + if(pill_number == RANDOM_PILL_STYLE) + P.icon_state = "pill[rand(1,21)]" + else + P.icon_state = "pill[pill_number]" + if(P.icon_state == "pill4") //mirrored from chem masters + P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." + +/obj/machinery/plumbing/pill_press/ui_base_html(html) + var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) + . = replacetext(html, "", assets.css_tag()) + +/obj/machinery/plumbing/pill_press/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) + assets.send(user) + ui = new(user, src, ui_key, "chem_press", name, 410, 300, master_ui, state) + ui.open() + +/obj/machinery/plumbing/pill_press/ui_data(mob/user) + var/list/data = list() + data["pill_style"] = pill_number + data["pill_size"] = pill_size + data["pill_name"] = pill_name + data["pill_styles"] = pill_styles + return data + +/obj/machinery/plumbing/pill_press/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("change_pill_style") + pill_number = CLAMP(text2num(params["id"]), 1 , PILL_STYLE_COUNT) + if("change_pill_size") + pill_size = round(CLAMP(input("New target volume", name, pill_size) as num|null, minimum_pill, maximum_pill)) + if("change_pill_name") + var/new_name = stripped_input(usr, "Enter a pill name.", name, pill_name) + if(findtext(new_name, "pill")) //names like pillatron and Pilliam are thus valid + pill_name = new_name + else + pill_name = new_name + " pill" diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm new file mode 100644 index 00000000000..1abd31c12d3 --- /dev/null +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -0,0 +1,56 @@ +///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents seperated and only reacts under your given terms +/obj/machinery/plumbing/reaction_chamber + name = "reaction chamber" + desc = "Keeps chemicals seperated until given conditions are met." + icon_state = "reaction_chamber" + + buffer = 100 + reagent_flags = TRANSPARENT | NO_REACT + /**list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. + * example: list(/datum/reagent/water = 20, /datum/reagent/oil = 50) + */ + var/list/required_reagents = list() + ///our reagent goal has been reached, so now we lock our inputs and start emptying + var/emptying = FALSE + + +/obj/machinery/plumbing/reaction_chamber/Initialize() + . = ..() + AddComponent(/datum/component/plumbing/reaction_chamber) + +/obj/machinery/plumbing/reaction_chamber/on_reagent_change() + if(reagents.total_volume == 0 && emptying) //we were emptying, but now we aren't + emptying = FALSE + reagents.flags |= NO_REACT + +/obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "reaction_chamber", name, 500, 300, master_ui, state) + ui.open() + +/obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) + var/list/data = list() + var/list/text_reagents = list() + for(var/A in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath + var/datum/reagent/R = A + text_reagents[initial(R.name)] = required_reagents[R] + data["reagents"] = text_reagents + data["emptying"] = emptying + return data + +/obj/machinery/plumbing/reaction_chamber/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("remove") + var/reagent = get_chem_id(params["chem"]) + if(reagent) + required_reagents.Remove(reagent) + if("add") + var/input_reagent = get_chem_id(replacetext(lowertext(input("Enter the name of the reagent", "Input") as text|null), " ", "")) + if(input_reagent && !required_reagents.Find(input_reagent)) + var/input_amount = CLAMP(round(input("Enter amount", "Input") as num|null), 1, 100) + if(input_amount) + required_reagents[input_reagent] = input_amount \ No newline at end of file diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm new file mode 100644 index 00000000000..0a68d807105 --- /dev/null +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -0,0 +1,49 @@ +///it splits the reagents however you want. So you can "every 60 units, 45 goes left and 15 goes straight". The side direction is EAST, you can change this in the component +/obj/machinery/plumbing/splitter + name = "Chemical Splitter" + desc = "A chemical splitter for smart chemical factorization. Waits till a set of conditions is met and then stops all input and splits the buffer evenly or other in two ducts." + icon_state = "splitter" + buffer = 100 + ///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct. + var/turn_straight = TRUE + ///how much we must transfer straight. note input can be as high as 10 reagents per process, usually + var/transfer_straight = 5 + ///how much we must transfer to the side + var/transfer_side = 5 + //the maximum you can set the transfer to + var/max_transfer = 9 + +/obj/machinery/plumbing/splitter/Initialize() + . = ..() + AddComponent(/datum/component/plumbing/splitter) + +/obj/machinery/plumbing/splitter/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/plumbing/splitter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "chem_splitter", name, 700, 200, master_ui, state) + ui.open() + +/obj/machinery/plumbing/splitter/ui_data(mob/user) + var/list/data = list() + data["straight"] = transfer_straight + data["side"] = transfer_side + return data + +/obj/machinery/plumbing/splitter/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("set_amount") + var/direction = params["target"] + switch(direction) + if("straight") + transfer_straight = CLAMP(input("New target transfer:", name, transfer_straight) as num|null, 1 , max_transfer) + if("side") + transfer_side = CLAMP(input("New target transfer:", name, transfer_side) as num|null, 1 , max_transfer) + else + return FALSE \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index dfd2558ebb7..8afc9186017 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -885,3 +885,9 @@ random_reagents += R var/picked_reagent = pick(random_reagents) return picked_reagent + +/proc/get_chem_id(chem_name) + for(var/A in GLOB.chemical_reagents_list) + var/datum/reagent/R = GLOB.chemical_reagents_list[A] + if(chem_name == ckey(R.name)) + return R.type diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 98834b0487d..ed38735ca04 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -1,6 +1,3 @@ -#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die -#define RANDOM_PILL_STYLE 22 //Dont change this one though - /obj/machinery/chem_master name = "ChemMaster 3000" desc = "Used to separate chemicals and distribute them in a variety of forms." @@ -404,7 +401,4 @@ /obj/machinery/chem_master/condimaster name = "CondiMaster 3000" desc = "Used to create condiments and other cooking supplies." - condi = TRUE - -#undef PILL_STYLE_COUNT -#undef RANDOM_PILL_STYLE + condi = TRUE \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 5e16b98e399..08b45d8d65a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -419,7 +419,10 @@ #include "code\datums\components\fantasy\suffixes.dm" #include "code\datums\components\plumbing\_plumbing.dm" #include "code\datums\components\plumbing\acclimator.dm" +#include "code\datums\components\plumbing\chemical_acclimator.dm" #include "code\datums\components\plumbing\filter.dm" +#include "code\datums\components\plumbing\reaction_chamber.dm" +#include "code\datums\components\plumbing\splitter.dm" #include "code\datums\components\storage\storage.dm" #include "code\datums\components\storage\concrete\_concrete.dm" #include "code\datums\components\storage\concrete\bag_of_holding.dm" @@ -2405,8 +2408,12 @@ #include "code\modules\plumbing\ducts.dm" #include "code\modules\plumbing\plumbers\_plumb_machinery.dm" #include "code\modules\plumbing\plumbers\acclimator.dm" +#include "code\modules\plumbing\plumbers\destroyer.dm" #include "code\modules\plumbing\plumbers\filter.dm" +#include "code\modules\plumbing\plumbers\pill_press.dm" #include "code\modules\plumbing\plumbers\pumps.dm" +#include "code\modules\plumbing\plumbers\reaction_chamber.dm" +#include "code\modules\plumbing\plumbers\splitters.dm" #include "code\modules\plumbing\plumbers\synthesizer.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\cable.dm" diff --git a/tgui/src/interfaces/chem_press.ract b/tgui/src/interfaces/chem_press.ract new file mode 100644 index 00000000000..0054c5084c1 --- /dev/null +++ b/tgui/src/interfaces/chem_press.ract @@ -0,0 +1,11 @@ + + + Current Pill Volume: {{data.pill_size}} + + + Pill Name: {{data.pill_name}}
+ {{#each data.pill_styles}} + {{{htmltag}}} + {{/each}} +
+
\ No newline at end of file diff --git a/tgui/src/interfaces/chem_splitter.ract b/tgui/src/interfaces/chem_splitter.ract new file mode 100644 index 00000000000..cd142b4fee8 --- /dev/null +++ b/tgui/src/interfaces/chem_splitter.ract @@ -0,0 +1,8 @@ + + + The splitter constantly switches between the port and the amount it sends, and only continues when it has succeeded.
+ The splitter outputs at a forced amount. Avoid putting multiple demanding machines on one output, as it strains it's effectiveness.
+ Straight {{data.straight}} + Side {{data.side}} +
+
\ No newline at end of file diff --git a/tgui/src/interfaces/reaction_chamber.ract b/tgui/src/interfaces/reaction_chamber.ract new file mode 100644 index 00000000000..155a29d1f3a --- /dev/null +++ b/tgui/src/interfaces/reaction_chamber.ract @@ -0,0 +1,9 @@ + + + {{#each data.reagents: reagent}} + {{reagent}} : {{data.reagents[reagent]}} + Remove
+ {{/each}} + Add
+
+
\ No newline at end of file