/**********************Mineral processing unit console**************************/
/obj/machinery/mineral/processing_unit_console
name = "ore redemption console"
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "console"
density = 0
anchored = 1
use_power = 1
idle_power_usage = 15
active_power_usage = 50
var/obj/machinery/mineral/processing_unit/machine = null
var/show_all_ores = 0
var/points = 0
var/obj/item/card/id/inserted_id
var/list/ore/input_mats = list()
var/list/material/output_mats = list()
var/list/datum/alloy/alloy_mats = list()
var/waste = 0
var/idx = 0
/obj/machinery/mineral/processing_unit_console/proc/setup_machine(mob/user)
if(!machine)
var/area/A = get_area(src)
var/best_distance = INFINITY
for(var/obj/machinery/mineral/processing_unit/checked_machine in SSmachinery.all_machines)
if(A == get_area(checked_machine) && get_dist_euclidian(checked_machine,src) < best_distance)
machine = checked_machine
best_distance = get_dist_euclidian(checked_machine,src)
if (machine)
machine.console = src
else
to_chat(user, "ERROR: Linked machine not found!")
return machine
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
add_fingerprint(user)
interact(user)
/obj/machinery/mineral/processing_unit_console/attackby(obj/item/I, mob/user)
if(istype(I,/obj/item/card/id))
var/obj/item/card/id/C = user.get_active_hand()
if(istype(C) && !istype(inserted_id))
user.drop_from_inventory(C,src)
inserted_id = C
interact(user)
else
..()
/obj/machinery/mineral/processing_unit_console/interact(mob/user)
if(..())
return
if(!setup_machine(user))
return
if(!allowed(user))
to_chat(user, "Access denied.")
return
user.set_machine(src)
var/dat = "
Ore processor console
"
dat += "Current unclaimed points: [points]
"
if(istype(inserted_id))
dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
"
dat += "Claim points.
"
dat += "Print yield declaration.
"
else
dat += "No ID inserted. Insert ID.
"
dat += "
"
for(var/ore in machine.ores_processing)
if(!machine.ores_stored[ore] && !show_all_ores) continue
var/ore/O = ore_data[ore]
if(!O) continue
dat += "| [capitalize(O.display_name)] | [machine.ores_stored[ore]] | "
if(machine.ores_processing[ore])
switch(machine.ores_processing[ore])
if(0)
dat += "not processing"
if(1)
dat += "smelting"
if(2)
dat += "compressing"
if(3)
dat += "alloying"
else
dat += "not processing"
dat += ". | \[change\] |
"
dat += "
"
dat += "Currently displaying [show_all_ores ? "all ore types" : "only available ore types"]. \[[show_all_ores ? "show less" : "show more"]\]"
dat += "The ore processor is currently [(machine.active ? "processing" : "disabled")]."
user << browse(dat, "window=processor_console;size=400x500")
onclose(user, "processor_console")
return
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
if(..())
return 1
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["choice"])
if(istype(inserted_id))
if(href_list["choice"] == "eject")
inserted_id.forceMove(loc)
if(!usr.get_active_hand())
usr.put_in_hands(inserted_id)
inserted_id = null
if(href_list["choice"] == "claim")
if(access_mining_station in inserted_id.access)
if(points >= 0)
inserted_id.mining_points += points
if(points != 0)
ping( "\The [src] pings, \"Point transfer complete! Transaction total: [points] points!\"" )
points = 0
else
to_chat(usr, "[station_name()]'s mining division is currently indebted to NanoTrasen. Transaction incomplete until debt is cleared.")
else
to_chat(usr, "Required access not found.")
if(href_list["choice"] == "print_report")
if(access_mining_station in inserted_id.access)
print_report(usr)
else
to_chat(usr, "Required access not found.")
else if(href_list["choice"] == "insert")
var/obj/item/card/id/I = usr.get_active_hand()
if(istype(I))
usr.drop_from_inventory(I,src)
inserted_id = I
else to_chat(usr, "No valid ID.")
if(href_list["toggle_smelting"])
var/choice = input("What setting do you wish to use for processing [href_list["toggle_smelting"]]?") as null|anything in list("Smelting","Compressing","Alloying","Nothing")
if(!choice) return
switch(choice)
if("Nothing") choice = 0
if("Smelting") choice = 1
if("Compressing") choice = 2
if("Alloying") choice = 3
machine.ores_processing[href_list["toggle_smelting"]] = choice
if(href_list["toggle_power"])
machine.active = !machine.active
if(machine.active)
machine.icon_state = "furnace"
else
machine.icon_state = "furnace-off"
if(href_list["toggle_ores"])
show_all_ores = !show_all_ores
src.updateUsrDialog()
return
/obj/machinery/mineral/processing_unit_console/proc/print_report(var/mob/living/user)
if(!inserted_id)
to_chat(user, span("warning", "No ID inserted. Cannot digitally sign."))
return
if(!input_mats.len && !output_mats.len && !alloy_mats)
to_chat(user, span("warning", "There is no data to print."))
return
if(printing)
return
printing = TRUE
var/obj/item/paper/P = new /obj/item/paper(user.loc)
var/date_string = worlddate2text()
idx++
var/form_title = "Form 0600 - Mining Yield Declaration"
var/dat = "NanoTrasen Inc.
"
dat += "Civilian Branch of Operation
"
dat += "Form 0600
Mining Yield Declaration
"
dat += "Facility: NSS Aurora
"
dat += "Date: [date_string]
"
dat += "Index: [idx]
"
dat += "Miner(s):
"
dat += "Ore Yields:
"
dat += ""
for(var/material/OM in output_mats)
if(output_mats[OM] > 1)
dat += "| [output_mats[OM]] | [OM.display_name] [OM.sheet_plural_name] |
"
else
dat += "| [output_mats[OM]] | [OM.display_name] [OM.sheet_singular_name] |
"
CHECK_TICK
for(var/datum/alloy/AM in alloy_mats)
if(alloy_mats[AM] > 1)
dat += "| [alloy_mats[AM]] | [AM.metaltag] sheets |
"
else
dat += "| [alloy_mats[AM]] | [AM.metaltag] sheet |
"
CHECK_TICK
dat += "
"
if(waste > 0)
dat += "Waste detected: "
dat += "[waste] unit(s) of material were wasted due to operator error. This includes:
"
dat += ""
for(var/ore/IM in input_mats)
if(input_mats[IM] > 1)
dat += "| [input_mats[IM]] | [IM.display_name] |
"
else
dat += "| [input_mats[IM]] | [IM.display_name] |
"
CHECK_TICK
dat += "
"
dat += "Additional Notes:
"
dat += "Quartermaster's / Head of Personnel's / Captain's Stamp: "
P.set_content(form_title, dat)
//stamp the paper
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!P.stamped)
P.stamped = new
P.offset_x += 0
P.offset_y += 0
P.ico += "paper_stamp-cent"
P.stamped += /obj/item/stamp
P.add_overlay(stampoverlay)
P.stamps += "
This paper has been stamped by the NT Ore Processing System."
user.visible_message("\The [src] rattles and prints out a sheet of paper.")
playsound(loc, "sound/bureaucracy/print_short.ogg", 50, 1)
// reset
output_mats = list()
input_mats = list()
waste = 0
if(ishuman(user) && !(user.l_hand && user.r_hand))
user.put_in_hands(P)
printing = FALSE
return
/**********************Mineral processing unit**************************/
/obj/machinery/mineral/processing_unit
name = "industrial smelter" //This isn't actually a goddamn furnace, we're in space and it's processing platinum and flammable phoron... //lol fuk u bay it is //i'm gay
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "furnace-off"
density = 1
anchored = 1
light_range = 3
var/obj/machinery/mineral/input = null
var/obj/machinery/mineral/output = null
var/obj/machinery/mineral/processing_unit_console/console = null
var/sheets_per_tick = 20
var/list/ores_processing[0]
var/list/ores_stored[0]
var/static/list/alloy_data
var/active = 0
use_power = 1
idle_power_usage = 15
active_power_usage = 150
component_types = list(
/obj/item/circuitboard/refiner,
/obj/item/stock_parts/capacitor = 2,
/obj/item/stock_parts/scanning_module,
/obj/item/stock_parts/micro_laser = 2,
/obj/item/stock_parts/matter_bin
)
/obj/machinery/mineral/processing_unit/Initialize()
. = ..()
// initialize static alloy_data list
if(!alloy_data)
alloy_data = list()
for(var/alloytype in typesof(/datum/alloy)-/datum/alloy)
alloy_data += new alloytype()
for (var/O in ore_data)
ores_processing[O] = 0
ores_stored[O] = 0
//Locate our output and input machinery.
for (var/dir in cardinal)
src.input = locate(/obj/machinery/mineral/input, get_step(src, dir))
if(src.input) break
for (var/dir in cardinal)
src.output = locate(/obj/machinery/mineral/output, get_step(src, dir))
if(src.output) break
/obj/machinery/mineral/processing_unit/machinery_process()
..()
if (!src.output || !src.input) return
var/list/tick_alloys = list()
//Grab some more ore to process this tick.
for(var/i = 0,i= sheets_per_tick) break
if(ores_stored[metal] > 0 && ores_processing[metal] != 0)
var/ore/O = ore_data[metal]
if(!O) continue
if(ores_processing[metal] == 3 && O.alloy) //Alloying.
for(var/datum/alloy/A in alloy_data)
if(A.metaltag in tick_alloys)
continue
tick_alloys += A.metaltag
var/enough_metal
if(!isnull(A.requires[metal]) && ores_stored[metal] >= A.requires[metal]) //We have enough of our first metal, we're off to a good start.
enough_metal = 1
for(var/needs_metal in A.requires)
//Check if we're alloying the needed metal and have it stored.
if(ores_processing[needs_metal] != 3 || ores_stored[needs_metal] < A.requires[needs_metal])
enough_metal = 0
break
if(!enough_metal)
continue
else
var/total
for(var/needs_metal in A.requires)
if(console)
var/ore/Ore = ore_data[needs_metal]
console.points += Ore.worth
use_power(100)
ores_stored[needs_metal] -= A.requires[needs_metal]
total += A.requires[needs_metal]
total = max(1,round(total*A.product_mod)) //Always get at least one sheet.
sheets += total-1
for(var/i=0,i0) can_make--
var/material/M = get_material_by_name(O.compresses_to)
if(!istype(M) || !can_make || ores_stored[metal] < 1)
continue
for(var/i=0,i