#define SMELT_AMOUNT 10 /**********************Mineral processing unit console**************************/ /obj/machinery/mineral/processing_unit_console name = "production machine console" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" density = TRUE anchored = TRUE var/obj/machinery/mineral/processing_unit/machine = null var/machinedir = EAST speed_process = 1 /obj/machinery/mineral/processing_unit_console/Initialize() . = ..() machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) if (machine) machine.CONSOLE = src else qdel(src) /obj/machinery/mineral/processing_unit_console/attack_hand(mob/user) if(!machine) return var/dat = machine.get_machine_data() var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500) popup.set_content(dat) popup.open() /obj/machinery/mineral/processing_unit_console/Topic(href, href_list) if(..()) return usr.set_machine(src) add_fingerprint(usr) if(href_list["material"]) machine.selected_material = href_list["material"] machine.selected_alloy = null if(href_list["alloy"]) machine.selected_material = null machine.selected_alloy = href_list["alloy"] if(href_list["set_on"]) machine.on = (href_list["set_on"] == "on") updateUsrDialog() return /obj/machinery/mineral/processing_unit_console/Destroy() machine = null return ..() /**********************Mineral processing unit**************************/ /obj/machinery/mineral/processing_unit name = "furnace" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "furnace" density = TRUE anchored = TRUE var/obj/machinery/mineral/CONSOLE = null var/on = FALSE var/selected_material = MAT_METAL var/selected_alloy = null var/datum/research/files /obj/machinery/mineral/processing_unit/Initialize() . = ..() proximity_monitor = new(src, 1) AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), INFINITY) files = new /datum/research/smelter(src) /obj/machinery/mineral/processing_unit/Destroy() CONSOLE = null QDEL_NULL(files) return ..() /obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM) if(istype(AM, /obj/item/ore) && AM.loc == get_step(src, input_dir)) process_ore(AM) /obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/ore/O) GET_COMPONENT(materials, /datum/component/material_container) var/material_amount = materials.get_item_material_amount(O) if(!materials.has_space(material_amount)) unload_mineral(O) else materials.insert_item(O) qdel(O) if(CONSOLE) CONSOLE.updateUsrDialog() /obj/machinery/mineral/processing_unit/proc/get_machine_data() var/dat = "Smelter control console

" GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in materials.materials) var/datum/material/M = materials.materials[mat_id] dat += "[M.name]: [M.amount] cm³" if (selected_material == mat_id) dat += " Smelting" else dat += " Not Smelting " dat += "
" dat += "

" dat += "Smelt Alloys
" for(var/v in files.known_designs) var/datum/design/D = files.known_designs[v] dat += "[D.name] " if (selected_alloy == D.id) dat += " Smelting" else dat += " Not Smelting " dat += "
" dat += "

" //On or off dat += "Machine is currently " if (on) dat += "On " else dat += "Off " return dat /obj/machinery/mineral/processing_unit/process() if (on) if(selected_material) smelt_ore() else if(selected_alloy) smelt_alloy() if(CONSOLE) CONSOLE.updateUsrDialog() /obj/machinery/mineral/processing_unit/proc/smelt_ore() GET_COMPONENT(materials, /datum/component/material_container) var/datum/material/mat = materials.materials[selected_material] if(mat) var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT) if(!sheets_to_remove) on = FALSE else var/out = get_step(src, output_dir) materials.retrieve_sheets(sheets_to_remove, selected_material, out) /obj/machinery/mineral/processing_unit/proc/smelt_alloy() var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design if(!alloy) on = FALSE return var/amount = can_smelt(alloy) if(!amount) on = FALSE return GET_COMPONENT(materials, /datum/component/material_container) materials.use_amount(alloy.materials, amount) generate_mineral(alloy.build_path) /obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D) if(D.make_reagents.len) return 0 var/build_amount = SMELT_AMOUNT GET_COMPONENT(materials, /datum/component/material_container) for(var/mat_id in D.materials) var/M = D.materials[mat_id] var/datum/material/smelter_mat = materials.materials[mat_id] if(!M || !smelter_mat) return 0 build_amount = min(build_amount, round(smelter_mat.amount / M)) return build_amount /obj/machinery/mineral/processing_unit/proc/generate_mineral(P) var/O = new P(src) unload_mineral(O) /obj/machinery/mineral/processing_unit/on_deconstruction() GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() ..() #undef SMELT_AMOUNT