diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index ba75e86b005..f4c6cc90c57 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -466,6 +466,16 @@ to destroy them and players will be able to make replacements.
/obj/item/weapon/stock_parts/console_screen = 1,
/obj/item/weapon/stock_parts/cell = 1)
+/obj/item/weapon/circuitboard/chem_master
+ name = "circuit board (Chem Master 2999)"
+ build_path = /obj/machinery/chem_master/constructable
+ board_type = "machine"
+ origin_tech = "materials=2;programming=2;biotech=1"
+ req_components = list(
+ /obj/item/weapon/reagent_containers/glass/beaker = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
/obj/item/weapon/circuitboard/chem_heater
name = "circuit board (Chemical Heater)"
build_path = /obj/machinery/chem_heater
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 0e7199645c9..f9c8dead1b8 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -14,7 +14,7 @@
var/energy = 100
var/max_energy = 100
var/amount = 30
- var/beaker = null
+ var/obj/item/weapon/reagent_containers/beaker = null
var/recharged = 0
var/hackedcheck = 0
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
@@ -123,15 +123,15 @@
var beakerContents[0]
var beakerCurrentVolume = 0
- if(beaker && beaker:reagents && beaker:reagents.reagent_list.len)
- for(var/datum/reagent/R in beaker:reagents.reagent_list)
+ if(beaker && beaker.reagents && beaker.reagents.reagent_list.len)
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list...
beakerCurrentVolume += R.volume
data["beakerContents"] = beakerContents
if (beaker)
data["beakerCurrentVolume"] = beakerCurrentVolume
- data["beakerMaxVolume"] = beaker:volume
+ data["beakerMaxVolume"] = beaker.volume
else
data["beakerCurrentVolume"] = null
data["beakerMaxVolume"] = null
@@ -385,7 +385,7 @@
icon_state = "mixer0"
use_power = 1
idle_power_usage = 20
- var/beaker = null
+ var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null
var/mode = 0
var/condi = 0
@@ -483,7 +483,7 @@
P.info += "Time of analysis: [worldtime2text(world.time)]
"
P.info += "Chemical name: [href_list["name"]]
"
if(href_list["name"] == "Blood")
- var/datum/reagents/R = beaker:reagents
+ var/datum/reagents/R = beaker.reagents
var/datum/reagent/blood/G
for(var/datum/reagent/F in R.reagent_list)
if(F.name == href_list["name"])
@@ -499,7 +499,7 @@
src.printing = null
if(beaker)
- var/datum/reagents/R = beaker:reagents
+ var/datum/reagents/R = beaker.reagents
if (href_list["analyze"])
var/dat = ""
if(!condi)
@@ -562,7 +562,7 @@
return
else if (href_list["eject"])
if(beaker)
- beaker:loc = src.loc
+ beaker.forceMove(get_turf(src))
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
@@ -695,7 +695,7 @@
dat += "No pill bottle inserted.
"
dat += "Close"
else
- var/datum/reagents/R = beaker:reagents
+ var/datum/reagents/R = beaker.reagents
dat += "Eject beaker and Clear Buffer
"
if(src.loaded_pill_bottle)
dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]
"
@@ -759,6 +759,44 @@
name = "\improper CondiMaster 3000"
condi = 1
+/obj/machinery/chem_master/constructable
+ name = "ChemMaster 2999"
+ desc = "Used to seperate chemicals and distribute them in a variety of forms."
+
+/obj/machinery/chem_master/constructable/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
+
+/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params)
+
+ if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B))
+ if(beaker)
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ reagents.clear_reagents()
+ if(loaded_pill_bottle)
+ loaded_pill_bottle.forceMove(get_turf(src))
+ loaded_pill_bottle = null
+ return
+
+ if(exchange_parts(user, B))
+ return
+
+ if(panel_open)
+ if(istype(B, /obj/item/weapon/crowbar))
+ default_deconstruction_crowbar(B)
+ return 1
+ else
+ user << "You can't use the [src.name] while it's panel is opened!"
+ return 1
+ else
+ ..()
+
/obj/machinery/reagentgrinder
name = "\improper All-In-One Grinder"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 8caa9af8b12..fb97c2b693c 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -152,6 +152,16 @@
build_path = /obj/item/weapon/circuitboard/chem_dispenser
category = list("Medical Machinery")
+/datum/design/chem_master
+ name = "Machine Design (Chem Master Board)"
+ desc = "The circuit board for a Chem Master 2999."
+ id = "chem_master"
+ req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/chem_master
+ category = list("Medical Machinery")
+
/datum/design/chem_heater
name = "Machine Design (Chemical Heater Board)"
desc = "The circuit board for a chemical heater."