/obj/machinery/biogenerator name = "Biogenerator" desc = "Converts plants into biomass, which can be used to construct useful items." icon = 'icons/obj/biogenerator.dmi' icon_state = "biogen-empty" density = 1 anchored = 1 use_power = 1 idle_power_usage = 40 var/processing = 0 var/obj/item/weapon/reagent_containers/glass/beaker = null var/points = 0 var/menustat = "menu" var/efficiency = 0 var/productivity = 0 var/max_items = 40 /obj/machinery/biogenerator/New() ..() create_reagents(1000) component_parts = list() component_parts += new /obj/item/weapon/circuitboard/biogenerator(null) component_parts += new /obj/item/weapon/stock_parts/matter_bin(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/stack/cable_coil(null, 1) RefreshParts() /obj/machinery/biogenerator/RefreshParts() var/E = 0 var/P = 0 var/max_storage = 40 for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) P += B.rating max_storage = 40 * B.rating for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) E += M.rating efficiency = E productivity = P max_items = max_storage /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. update_icon() /obj/machinery/biogenerator/update_icon() if(panel_open) icon_state = "biogen-empty-o" else if(!src.beaker) icon_state = "biogen-empty" else if(!src.processing) icon_state = "biogen-stand" else icon_state = "biogen-work" return /obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/weapon/reagent_containers/glass) && !panel_open) if(beaker) user << "A container is already loaded into the machine." else user.unEquip(O) O.loc = src beaker = O user << "You add the container to the machine." updateUsrDialog() else if(processing) user << "The biogenerator is currently processing." else if(istype(O, /obj/item/weapon/storage/bag/plants)) var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) user << "The biogenerator is already full! Activate it." else for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) if(i >= max_items) break G.loc = src i++ if(iYou empty the plant bag into the biogenerator." else if(O.contents.len == 0) user << "You empty the plant bag into the biogenerator, filling it to its capacity." else user << "You fill the biogenerator to its capacity." else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown)) user << "You cannot put this in [src.name]!" else var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ if(i >= max_items) user << "The biogenerator is full! Activate it." else user.unEquip(O) O.loc = src user << "You put [O.name] in [src.name]" if(!processing) if(default_deconstruction_screwdriver(user, "biogen-empty-o", "biogen-empty", O)) if(beaker) var/obj/item/weapon/reagent_containers/glass/B = beaker B.loc = loc beaker = null if(exchange_parts(user, O)) return default_deconstruction_crowbar(O) update_icon() return /obj/machinery/biogenerator/interact(mob/user) if(stat & BROKEN || panel_open) return user.set_machine(src) var/dat if(processing) dat += "
Biogenerator is processing! Please wait...

" else switch(menustat) if("nopoints") dat += "
You do not have biomass to create products.
Please, put growns into reactor and activate it.
" menustat = "menu" if("complete") dat += "
Operation complete.
" menustat = "menu" if("void") dat += "
Error: No growns inside.
Please, put growns into reactor.
" menustat = "menu" if("nobeakerspace") dat += "
Not enough space left in container. Unable to create product.
" menustat = "menu" if(beaker) dat += "
Biomass: [points] units.

" dat += "ActivateDetach Container" dat += "

Food:

" dat += "
" dat += "10 milk: Makex5 ([20/efficiency])
" dat += "10 cream: Makex5 ([30/efficiency])
" dat += "Milk Carton: Makex5 ([100/efficiency])
" dat += "Cream Carton: Makex5 ([300/efficiency])
" dat += "Monkey cube: Makex5 ([250/efficiency])" dat += "
" dat += "

Botany Chemicals:

" dat += "
" dat += "E-Z-Nutrient: Makex5 ([10/efficiency])
" dat += "Left 4 Zed: Makex5 ([20/efficiency])
" dat += "Robust Harvest: Makex5 ([25/efficiency])
" dat += "Weed Killer: Makex5 ([50/efficiency])
" dat += "Pest Killer: Makex5 ([50/efficiency])
" dat += "
" dat += "

Leather and Cloth:

" dat += "
" dat += "Wallet: Make ([100/efficiency])
" dat += "Book bag: Make ([200/efficiency])
" dat += "Plant bag: Make ([200/efficiency])
" dat += "Rag: Make ([200/efficiency])
" dat += "Mining satchel: Make ([200/efficiency])
" dat += "Chemistry bag: Make ([200/efficiency])
" dat += "Botanical gloves: Make ([250/efficiency])
" dat += "Utility belt: Make ([300/efficiency])
" dat += "Security belt: Make ([300/efficiency])
" dat += "Medical belt: Make ([300/efficiency])
" dat += "Janitorial belt: Make ([300/efficiency])
" dat += "Bandolier belt: Make ([300/efficiency])
" dat += "Shoulder holster: Make ([400/efficiency])
" dat += "Leather Satchel: Make ([400/efficiency])
" dat += "Leather Jacket: Make ([500/efficiency])
" dat += "Leather Overcoat: Make ([1000/efficiency])
" dat += "Rice Hat: Make ([300/efficiency])
" dat += "
" else dat += "
No container inside, please insert container.
" var/datum/browser/popup = new(user, "biogen", name, 350, 520) popup.set_content(dat) popup.open() return /obj/machinery/biogenerator/attack_hand(mob/user) interact(user) /obj/machinery/biogenerator/proc/activate() if (usr.stat != 0) return if (src.stat != 0) //NOPOWER etc return if(src.processing) usr << "The biogenerator is in the process of working." return var/S = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents) S += 5 if(I.reagents.get_reagent_amount("nutriment") < 0.1) points += 1*productivity else points += I.reagents.get_reagent_amount("nutriment")*10*productivity qdel(I) if(S) processing = 1 update_icon() updateUsrDialog() playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) use_power(S*30) sleep(S+15/productivity) processing = 0 update_icon() else menustat = "void" return /obj/machinery/biogenerator/proc/check_cost(cost) if (cost > points) menustat = "nopoints" return 1 else points -= cost processing = 1 update_icon() updateUsrDialog() return 0 /obj/machinery/biogenerator/proc/check_container_volume(reagent_amount) if(beaker.reagents.total_volume + reagent_amount > beaker.reagents.maximum_volume) menustat = "nobeakerspace" return 1 /obj/machinery/biogenerator/proc/create_product(create) switch(create) if("milk") if(check_container_volume(10)) return 0 else if (check_cost(20/efficiency)) return 0 else beaker.reagents.add_reagent("milk",10) if("cream") if(check_container_volume(10)) return 0 else if (check_cost(30/efficiency)) return 0 else beaker.reagents.add_reagent("cream",10) if("cmilk") if (check_cost(100/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/food/condiment/milk(src.loc) if("ccream") if (check_cost(300/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/food/drinks/bottle/cream(src.loc) if("meat") if (check_cost(250/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc) if("ez") if (check_cost(10/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc) if("l4z") if (check_cost(20/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc) if("rh") if (check_cost(25/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc) if("wk") if (check_cost(50/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/glass/bottle/weedkiller(src.loc) if("pk") if (check_cost(50/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/glass/bottle/pestkiller(src.loc) if("wallet") if (check_cost(100/efficiency)) return 0 else new/obj/item/weapon/storage/wallet(src.loc) if("bkbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/books(src.loc) if("ptbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/plants(src.loc) if("mnbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/ore(src.loc) if("chbag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/storage/bag/chemistry(src.loc) if("rag") if (check_cost(200/efficiency)) return 0 else new/obj/item/weapon/reagent_containers/glass/rag(src.loc) if("gloves") if (check_cost(250/efficiency)) return 0 else new/obj/item/clothing/gloves/botanic_leather(src.loc) if("tbelt") if (check_cost(300/efficiency)) return 0 else new/obj/item/weapon/storage/belt/utility(src.loc) if("sbelt") if (check_cost(300/efficiency)) return 0 else new/obj/item/weapon/storage/belt/security(src.loc) if("mbelt") if (check_cost(300/efficiency)) return 0 else new/obj/item/weapon/storage/belt/medical(src.loc) if("jbelt") if (check_cost(300/efficiency)) return 0 else new/obj/item/weapon/storage/belt/janitor(src.loc) if("bbelt") if (check_cost(300/efficiency)) return 0 else new/obj/item/weapon/storage/belt/bandolier(src.loc) if("sholster") if (check_cost(400/efficiency)) return 0 else new/obj/item/weapon/storage/belt/holster(src.loc) if("satchel") if (check_cost(400/efficiency)) return 0 else new/obj/item/weapon/storage/backpack/satchel(src.loc) if("jacket") if (check_cost(500/efficiency)) return 0 else new/obj/item/clothing/suit/jacket/leather(src.loc) if("overcoat") if (check_cost(1000/efficiency)) return 0 else new/obj/item/clothing/suit/jacket/leather/overcoat(src.loc) if("rice_hat") if (check_cost(300/efficiency)) return 0 else new/obj/item/clothing/head/rice_hat(src.loc) processing = 0 menustat = "complete" update_icon() return 1 /obj/machinery/biogenerator/proc/detach() if(beaker) beaker.loc = src.loc beaker = null update_icon() /obj/machinery/biogenerator/Topic(href, href_list) if(..() || panel_open) return usr.set_machine(src) if(href_list["activate"]) activate() updateUsrDialog() else if(href_list["detach"]) detach() updateUsrDialog() else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) var/i = amount var/C = href_list["create"] if(i <= 0) return while(i >= 1) create_product(C) i-- updateUsrDialog() else if(href_list["menu"]) menustat = "menu" updateUsrDialog()