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 + ..() + ////////////////////////////////////////////////////////////////////////////////