diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 2f175dfd973..dcd7fb1e623 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -885,9 +885,12 @@
/obj/item/reagent_containers/food/snacks/egg/afterattack(obj/O as obj, mob/user as mob, proximity)
if(istype(O,/obj/machinery/microwave))
return . = ..()
+ if((istype(O,/obj/machinery/chem_master)) || (istype(O,/obj/machinery/chemical_dispenser)))
+ to_chat(user, span_warning("You can't find a good place to crack it into this machine, maybe try a beaker?"))
+ return
if(!(proximity && O.is_open_container()))
return
- to_chat(user, "You crack \the [src] into \the [O].")
+ to_chat(user, span_notice("You crack \the [src] into \the [O]."))
reagents.trans_to(O, reagents.total_volume)
user.drop_from_inventory(src)
qdel(src)
@@ -5036,6 +5039,9 @@
/obj/item/reagent_containers/food/snacks/siffruit/afterattack(obj/O as obj, mob/user as mob, proximity)
if(istype(O,/obj/machinery/microwave))
return ..()
+ if((istype(O,/obj/machinery/chem_master)) || (istype(O, /obj/machinery/chemical_dispenser)))
+ to_chat(user, span_warning("You can't find a good place to crack it into this machine, maybe try a beaker?"))
+ return
if(!(proximity && O.is_open_container()))
return
to_chat(user, span_notice("You tear \the [src]'s sac open, pouring it into \the [O]."))
diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm
index 529cfcb46ce..6a03f34fdd3 100644
--- a/code/modules/reagents/machinery/chem_master.dm
+++ b/code/modules/reagents/machinery/chem_master.dm
@@ -11,8 +11,8 @@
idle_power_usage = 20
var/obj/item/reagent_containers/beaker = null
var/obj/item/storage/pill_bottle/loaded_pill_bottle = null
- var/mode = 0
- var/condi = 0
+ var/mode = FALSE //beaker or disposal transfer
+ var/condi = FALSE //condimaster ?
var/useramount = 15 // Last used amount
var/pillamount = 10
var/list/bottle_styles
@@ -26,7 +26,7 @@
/obj/machinery/chem_master/Initialize(mapload)
. = ..()
default_apply_parts()
- var/datum/reagents/R = new/datum/reagents(900) //Just a huge random number so the buffer should (probably) never dump your reagents.
+ var/datum/reagents/R = new/datum/reagents(300) //Exactly one bluespace beaker worth of buffer.
reagents = R //There should be a nano ui thingy to warn of this.
R.my_atom = src
@@ -44,37 +44,78 @@
icon_state = "mixer[beaker ? "1" : "0"]"
/obj/machinery/chem_master/attackby(obj/item/B as obj, mob/user as mob)
-
- if(istype(B, /obj/item/reagent_containers/glass) || istype(B, /obj/item/reagent_containers/food))
-
- if(src.beaker)
- to_chat(user, "\A [beaker] is already loaded into the machine.")
- return
- src.beaker = B
- user.drop_item()
- B.loc = src
- to_chat(user, "You add \the [B] to the machine.")
+ if(condi && istype(B, /obj/item/reagent_containers/food))
+ if(!beaker)
+ if(user && Adjacent(user))
+ user.drop_from_inventory(B, src)
+ else
+ beaker.forceMove(drop_location())
+ if(user && Adjacent(user))
+ user.drop_from_inventory(B, src)
+ user.put_in_hands(beaker)
+ to_chat(user, span_notice("You add \the [B] into the receptical [beaker ? "and swap out [beaker]" : ""]."))
+ beaker = B
update_icon()
+ return TRUE
+
+ if(istype(B, /obj/item/reagent_containers/glass))
+ if(!beaker)
+ if(user && Adjacent(user))
+ user.drop_from_inventory(B, src)
+ else
+ beaker.forceMove(drop_location())
+ if(user && Adjacent(user))
+ user.drop_from_inventory(B, src)
+ user.put_in_hands(beaker)
+ to_chat(user, span_notice("You add \the [B] into the receptical [beaker ? "and swap out [beaker]" : ""]."))
+ beaker = B
+ update_icon()
+ return TRUE
else if(istype(B, /obj/item/storage/pill_bottle))
+ if(!loaded_pill_bottle)
+ if(user && Adjacent(user))
+ user.drop_from_inventory(B, src)
+ else
+ loaded_pill_bottle.forceMove(drop_location())
+ if(user && Adjacent(user))
+ user.drop_from_inventory(B, src)
+ user.put_in_hands(loaded_pill_bottle)
+ to_chat(user, span_notice("You add \the [B] into the pill dispenser slot [loaded_pill_bottle ? "and swap out [loaded_pill_bottle]" : ""]."))
+ loaded_pill_bottle = B
+ update_icon()
+ return TRUE
- if(src.loaded_pill_bottle)
- to_chat(user, "A \the [loaded_pill_bottle] s already loaded into the machine.")
- return
-
- src.loaded_pill_bottle = B
- user.drop_item()
- B.loc = src
- to_chat(user, "You add \the [loaded_pill_bottle] into the dispenser slot.")
-
- else if(default_unfasten_wrench(user, B, 20))
+ if(default_unfasten_wrench(user, B, 20))
return
if(default_deconstruction_screwdriver(user, B))
return
if(default_deconstruction_crowbar(user, B))
return
- return
+/obj/machinery/chem_master/click_alt(mob/user)
+ if(!iscarbon(user))
+ return FALSE
+ take_container(user, user.get_active_hand())
+
+/obj/machinery/chem_master/proc/take_container(mob/living/user, obj/item/new_container)
+ if(!new_container && beaker)
+ if(user && Adjacent(user))
+ user.put_in_hands(beaker)
+ update_icon()
+ to_chat(user, span_notice("You take out \the [beaker] from the receptical."))
+ beaker = null
+ return TRUE
+ else if(!new_container && !beaker && loaded_pill_bottle)
+ if(user && Adjacent(user))
+ user.put_in_hands(loaded_pill_bottle)
+ update_icon()
+ to_chat(user, span_notice("You take out \the [loaded_pill_bottle] from the pill dispenser."))
+ loaded_pill_bottle = null
+ return TRUE
+ else
+ to_chat(user, span_notice("There's nothing to take out from the receptical."))
+ return FALSE
/obj/machinery/chem_master/attack_hand(mob/user as mob)
if(stat & BROKEN)
@@ -108,6 +149,11 @@
data["loaded_pill_bottle_contents_len"] = loaded_pill_bottle.contents.len
data["loaded_pill_bottle_storage_slots"] = loaded_pill_bottle.max_storage_space
+ var/list/buffer_reagents_list = list()
+ data["buffer_reagents"] = buffer_reagents_list
+ for(var/datum/reagent/R in reagents.reagent_list)
+ buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
+
data["beaker"] = !!beaker
if(beaker)
var/list/beaker_reagents_list = list()
@@ -115,11 +161,6 @@
for(var/datum/reagent/R in beaker.reagents.reagent_list)
beaker_reagents_list[++beaker_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "description" = R.description, "id" = R.id)
- var/list/buffer_reagents_list = list()
- data["buffer_reagents"] = buffer_reagents_list
- for(var/datum/reagent/R in reagents.reagent_list)
- buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
-
data["pillsprite"] = pillsprite
data["bottlesprite"] = bottlesprite
data["mode"] = mode
@@ -449,17 +490,39 @@
var/amount = text2num(params["amount"])
if(!id || !amount)
return
- R.trans_id_to(src, id, amount)
+ if(reagents && !reagents.get_free_space())
+ to_chat(ui.user, span_warning("The reagent buffer is too full!"))
+ return
+ var/remaining = amount - reagents.get_free_space()
+ if(remaining <= 0)
+ R.trans_id_to(src, id, amount)
+ else
+ R.trans_id_to(src, id, reagents.get_free_space())
if("remove")
var/id = params["id"]
var/amount = text2num(params["amount"])
if(!id || !amount)
return
if(mode)
- reagents.trans_id_to(beaker, id, amount)
+ if(R && !R.get_free_space())
+ to_chat(ui.user, span_warning("\the [beaker.name] is too full!"))
+ return
+ var/remaining = amount - R.get_free_space() //figure out if we'd have leftovers
+ if(remaining <= 0) //No leftovers means we can fill the whole thing
+ reagents.trans_id_to(beaker, id, amount)
+ else
+ reagents.trans_id_to(beaker, id, R.get_free_space())
else
reagents.remove_reagent(id, amount)
if("eject")
+ if(!beaker)
+ return
+ beaker.forceMove(get_turf(src))
+ if(Adjacent(ui.user) && !issilicon(ui.user))
+ ui.user.put_in_hands(beaker)
+ beaker = null
+ update_icon()
+ if("ejectandclear")
if(!beaker)
return
beaker.forceMove(get_turf(src))
diff --git a/tgui/packages/tgui/interfaces/BorgHypo/BorgHypoRecipeDisplay.tsx b/tgui/packages/tgui/interfaces/BorgHypo/BorgHypoRecipeDisplay.tsx
index 7145b6fc2ab..c5f54967fb6 100644
--- a/tgui/packages/tgui/interfaces/BorgHypo/BorgHypoRecipeDisplay.tsx
+++ b/tgui/packages/tgui/interfaces/BorgHypo/BorgHypoRecipeDisplay.tsx
@@ -1,6 +1,6 @@
import { useBackend } from 'tgui/backend';
import { Box, Section, Stack } from 'tgui-core/components';
-import { formatUnits } from '../common/BeakerContents';
+import { formatUnits } from '../common/ChemicalContents';
import type { Data } from './types';
export const BorgHypoRecipeDisplay = (props) => {
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx
index 5dedb3acb0b..6892a7c7f89 100644
--- a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx
@@ -1,7 +1,7 @@
import { useBackend } from 'tgui/backend';
import { Box, Button, Section, Stack } from 'tgui-core/components';
-import { BeakerContents } from '../common/BeakerContents';
+import { BeakerContents } from '../common/ChemicalContents';
import { removeAmounts } from './constants';
import type { Data } from './types';
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx
index deb3b80a9ec..52a772eb715 100644
--- a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx
@@ -2,7 +2,7 @@ import { useBackend } from 'tgui/backend';
import { Box, Button, Section, Stack } from 'tgui-core/components';
import type { BooleanLike } from 'tgui-core/react';
-import { BeakerContents } from '../common/BeakerContents';
+import { BeakerContents } from '../common/ChemicalContents';
import { modalOpen } from '../common/ComplexModal';
import { transferAmounts } from './constants';
import type { reagent } from './types';
@@ -15,18 +15,33 @@ export const ChemMasterBeaker = (props: {
const { act } = useBackend();
const { beaker, beakerReagents, bufferNonEmpty } = props;
- const headerButton = bufferNonEmpty ? (
+ const headerButton = (<> {bufferNonEmpty ? (
act('eject')}
>
- Eject and Clear Buffer
+ Eject and Keep Buffer
) : (
+ )}
+ {bufferNonEmpty ? (
+ act('ejectandclear')}
+ >
+ Eject and Clear Buffer
+
+ ) : (
+
+ )}
+ >
);
return (
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx
index 17fecfba612..497977855d8 100644
--- a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx
@@ -2,7 +2,7 @@ import { useBackend } from 'tgui/backend';
import { Box, Button, Section, Stack } from 'tgui-core/components';
import type { BooleanLike } from 'tgui-core/react';
-import { BeakerContents } from '../common/BeakerContents';
+import { BufferContents } from '../common/ChemicalContents';
import { modalOpen } from '../common/ComplexModal';
import { transferAmounts } from './constants';
import type { reagent } from './types';
@@ -30,9 +30,8 @@ export const ChemMasterBuffer = (props: {
}
>
{bufferReagents.length > 0 ? (
- (
@@ -41,7 +40,6 @@ export const ChemMasterBuffer = (props: {
onClick={() =>
modalOpen('analyze', {
idx: i + 1,
- beaker: 0,
})
}
>
@@ -92,7 +90,7 @@ export const ChemMasterBuffer = (props: {
)}
/>
) : (
- Buffer is empty.
+ The buffer is empty.
)}
);
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/index.tsx b/tgui/packages/tgui/interfaces/ChemMaster/index.tsx
index 1796dcd974e..51053cdecec 100644
--- a/tgui/packages/tgui/interfaces/ChemMaster/index.tsx
+++ b/tgui/packages/tgui/interfaces/ChemMaster/index.tsx
@@ -35,7 +35,10 @@ export const ChemMaster = (props) => {
beakerReagents={beaker_reagents}
bufferNonEmpty={buffer_reagents.length > 0}
/>
-
+
0}
diff --git a/tgui/packages/tgui/interfaces/common/BeakerContents.tsx b/tgui/packages/tgui/interfaces/common/ChemicalContents.tsx
similarity index 53%
rename from tgui/packages/tgui/interfaces/common/BeakerContents.tsx
rename to tgui/packages/tgui/interfaces/common/ChemicalContents.tsx
index 943920f8fb9..d9d9d4fd618 100644
--- a/tgui/packages/tgui/interfaces/common/BeakerContents.tsx
+++ b/tgui/packages/tgui/interfaces/common/ChemicalContents.tsx
@@ -12,7 +12,7 @@ export const BeakerContents = (props) => {
{(!beakerLoaded && No beaker loaded.) ||
(beakerContents.length === 0 && (
- Beaker is empty.
+ The beaker is empty.
))}
{beakerContents.map((chemical, i) => (
@@ -27,3 +27,24 @@ export const BeakerContents = (props) => {
);
};
+/** Like above, but for buffer contents */
+export const BufferContents = (props) => {
+ const { bufferContents = [], buttons } = props;
+ return (
+
+ {(bufferContents.length === 0 && (
+ The buffer is empty.
+ ))}
+ {bufferContents.map((chemical, i) => (
+
+
+
+ {formatUnits(chemical.volume)} of {chemical.name}
+
+ {!!buttons && {buttons(chemical, i)}}
+
+
+ ))}
+
+ );
+};