diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index a1e13fed964..a6f914da7ca 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -795,6 +795,8 @@
/obj/machinery/disease2/incubator,
/obj/machinery/disease2/isolator,
/obj/machinery/disease2/biodestroyer,
+ /obj/item/device/cooker,
+ /obj/item/device/grinder,
/mob/living/simple_animal/livestock/cow
)
@@ -1477,27 +1479,34 @@
/// Bunsen Burner
////////////////////////////////////////////////////////////////////////////////
-//make a subclass of this for cooking at some point, allow it to accept multiple containers etc
+//todo: make a subclass of this for cooking, allow it to accept multiple containers simultaneously etc
//todo: use mini plasma tanks for fuel
/obj/item/device/cooker
name = "bunsen burner"
- desc = "a small, gas-powered cooker."
+ desc = "A small, gas-powered cooker."
icon = 'chemical.dmi'
icon_state = "bunsen1" //spawns with an empty beaker already on it
- var/obj/item/weapon/reagent_containers/held_container
+ var/obj/item/weapon/reagent_containers/glass/held_container
var/heating_stage = 0
var/active = 0
var/icon_empty = "bunsen0"
var/icon_full = "bunsen1"
- var/icon_heating = "bunsen2"
+ var/icon_active = "bunsen2"
+
+/obj/item/device/cooker/New()
+ held_container = new /obj/item/weapon/reagent_containers/glass/large/(src)
/obj/item/device/cooker/verb/toggle()
+ set src in oview(1)
+ set category = "Object"
+ set name = "Toggle cooker"
+
if(held_container)
if(!active)
usr << "\blue You switch the [src] on."
active = 1
- icon_state = icon_heating
+ icon_state = icon_active
spawn(50)
heat()
else
@@ -1515,7 +1524,7 @@
return
if(active)
- icon_state = icon_heating
+ icon_state = icon_active
spawn(50)
heat()
else
@@ -1523,17 +1532,14 @@
icon_state = icon_full
return
- if(heating_stage++ > 5)
+ if(heating_stage++ >= 5)
visible_message("bubbles!")
held_container.reagents.handle_reactions(1)
else
visible_message("hisses and steams!")
-/obj/item/device/cooker/New()
- held_container = new /obj/item/weapon/reagent_containers/glass/large/(src)
-
/obj/item/device/cooker/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(istype(O, /obj/item/weapon/reagent_containers/))
+ if(istype(O, /obj/item/weapon/reagent_containers/glass/))
if(held_container)
//todo: empty O into held_container
user << "\red There is already a [held_container] on the [src]!"
@@ -1571,6 +1577,147 @@
else
..()
+////////////////////////////////////////////////////////////////////////////////
+/// Grinder
+////////////////////////////////////////////////////////////////////////////////
+
+//todo: make a thing like this for cooking, or just redo the kitchen machinery so that they make more sense
+//this is a (mostly) non-retarded version of obj/machiner/reagentgrinder
+
+var/list/grind_products = list()
+
+/obj/item/device/grinder
+ name = "grinder"
+ desc = "A small, automated grinder for breaking things down into a powder."
+ icon = 'chemical.dmi'
+ icon_state = "grinder1" //spawns with an empty beaker already on it
+ var/obj/item/weapon/reagent_containers/glass/held_container
+ var/grinding_stage = 0
+ var/active = 0
+ var/icon_empty = "grinder0"
+ var/icon_full = "grinder1"
+ var/icon_active = "grinder2"
+
+/obj/item/device/grinder/New()
+ held_container = new /obj/item/weapon/reagent_containers/glass/large/(src)
+
+/obj/item/device/grinder/verb/toggle()
+ set src in oview(1)
+ set category = "Object"
+ set name = "Toggle grinder"
+
+ if(held_container)
+ if(!active)
+ usr << "\blue You switch the [src] on."
+ active = 1
+ icon_state = icon_active
+ spawn(50)
+ grind()
+ else
+ usr << "\blue You switch the [src] off."
+ active = 0
+ icon_state = icon_full
+ else
+ usr << "\red You can not toggle the [src] when it holds no container!"
+
+/obj/item/device/grinder/verb/eject()
+ set src in oview(1)
+ set category = "Object"
+ set name = "Eject contents from grinder"
+
+ for(var/obj/item/I in src)
+ if(I == held_container)
+ continue
+ I.loc = src.loc
+
+/obj/item/device/grinder/proc/grind()
+ if(!held_container)
+ grinding_stage = 0
+ active = 0
+ icon_state = icon_empty
+ return
+
+ if(active)
+ icon_state = icon_active
+ spawn(50)
+ grind()
+ else
+ grinding_stage = 0
+ icon_state = icon_full
+ return
+
+ var/grinding = 0
+ for(var/obj/item/I in src)
+ if(I == held_container)
+ continue
+ if( prob(max(grinding_stage * 20, 100)) )
+ var/pre_volume = held_container.reagents.total_volume
+
+ //shitty hardcode of things for now, but it's the fastest easiest solution
+ if(istype(I,/obj/item/weapon/rocksliver))
+ var/obj/item/weapon/rocksliver/R = I
+ held_container.reagents.add_reagent("ground_rock",10, R.geological_data)
+ else
+ held_container.reagents.add_reagent("chemical_waste",10)
+ del(I)
+
+ //slight hack to spill some chemical waste if it won't fit
+ if(pre_volume == held_container.reagents.total_volume)
+ var/obj/effect/decal/ash/A = new(src.loc)
+ A.name = "gritty powder"
+ A.desc = "Looks like some kind of chemical waste."
+ A.loc = pick(view(get_turf(src),1))
+ visible_message("[src] leaks some kind of powder.")
+ else
+ grinding = 1
+
+ if(grinding)
+ visible_message("[src] makes a clanking, clattering noise!")
+ else
+ visible_message("[src] makes a whirring noise!")
+
+/obj/item/device/grinder/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item/weapon/reagent_containers/glass/))
+ if(held_container)
+ //todo: empty O into held_container
+ user << "\red There is already a [held_container] on the [src]!"
+ else
+ user.drop_item()
+ user << "\blue You place the [O] on the [src]."
+ held_container = O
+ O.loc = src
+ icon_state = icon_full
+ return 1
+ else if(!held_container)
+ user << "\red There is nothing to put [O] in to!"
+ return 1
+ else if (istype(O,/obj/item))
+ var/obj/item/I = O
+ if(I.w_class > 2)
+ user << "\red That won't fit in the [held_container]!"
+ else
+ //add random things to the container. when the burner is activated, they will melt
+ O.loc = held_container
+ return 1
+ else
+ user << "\blue You add the [O] to the [src]."
+ user.drop_item()
+ O.loc = src
+ return 1
+
+ return ..()
+
+/obj/item/device/grinder/attack_hand(var/mob/user as mob)
+ if(held_container)
+ held_container.attack_hand(user)
+ if(held_container.loc != src)
+ held_container = null
+ icon_state = icon_empty
+ user << "\blue You remove the [held_container] from the [src]."
+ return 1
+ else
+ ..()
+
////////////////////////////////////////////////////////////////////////////////