mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 15:42:35 +00:00
changes:
rscadd: "Ported a new chat system, Goonchat, that allows for cool things like changing font style, size, spacing, highlighting up to 5 strings in the chat, and DARK MODE."
rscadd: "Repeated chat messages can now get compacted. You can disable this in goonchat settings."
rscadd: "You can change icon style to any font on your system."
tweak: "The game window has been altered a bit to adjust for this."
rscdel: "Removed skin style prefs as they are no longer used."
472 lines
14 KiB
Plaintext
472 lines
14 KiB
Plaintext
/**********************Mineral processing unit console**************************/
|
|
|
|
/obj/machinery/mineral/processing_unit_console
|
|
name = "ore redemption console"
|
|
desc = "A handy console which can be use to retrieve mining points for use in the mining vendor, or to set processing values for various ore types."
|
|
desc_info = "Up to date settings for the refinery can be found in the Aurorastation Guide to Mining wikipage."
|
|
icon = 'icons/obj/terminals.dmi'
|
|
icon_state = "production_console"
|
|
density = FALSE
|
|
anchored = TRUE
|
|
use_power = 1
|
|
idle_power_usage = 15
|
|
active_power_usage = 50
|
|
|
|
var/obj/machinery/mineral/processing_unit/machine
|
|
var/show_all_ores = FALSE
|
|
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/Initialize(mapload, d, populate_components)
|
|
. = ..()
|
|
var/mutable_appearance/screen_overlay = mutable_appearance(icon, "production_console-screen", EFFECTS_ABOVE_LIGHTING_LAYER)
|
|
add_overlay(screen_overlay)
|
|
set_light(1.4, 1, COLOR_CYAN)
|
|
|
|
/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, SPAN_WARNING("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, SPAN_WARNING("Access denied."))
|
|
return
|
|
|
|
user.set_machine(src)
|
|
|
|
var/dat = "<h1>Ore processor console</h1>"
|
|
|
|
dat += "Current unclaimed points: [points]<br>"
|
|
|
|
if(istype(inserted_id))
|
|
dat += "You have [inserted_id.mining_points] mining points collected. <A href='?src=\ref[src];choice=eject'>Eject ID.</A><br>"
|
|
dat += "<A href='?src=\ref[src];choice=claim'>Claim points.</A><br>"
|
|
dat += "<A href='?src=\ref[src];choice=print_report'>Print yield declaration.</A><br>"
|
|
else
|
|
dat += "No ID inserted. <A href='?src=\ref[src];choice=insert'>Insert ID.</A><br>"
|
|
|
|
dat += "<hr><table>"
|
|
|
|
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 += "<tr><td width = 40><b>[capitalize(O.display_name)]</b></td><td width = 30>[machine.ores_stored[ore]]</td><td width = 100>"
|
|
if(machine.ores_processing[ore])
|
|
switch(machine.ores_processing[ore])
|
|
if(0)
|
|
dat += "<span class='warning'>not processing</span>"
|
|
if(1)
|
|
dat += "<font color='orange'>smelting</font>"
|
|
if(2)
|
|
dat += "<span class='notice'>compressing</span>"
|
|
if(3)
|
|
dat += "<font color='gray'>alloying</font>"
|
|
else
|
|
dat += "<span class='warning'>not processing</span>"
|
|
dat += ".</td><td width = 30><a href='?src=\ref[src];toggle_smelting=[ore]'>\[change\]</a></td></tr>"
|
|
|
|
dat += "</table><hr>"
|
|
dat += "Currently displaying [show_all_ores ? "all ore types" : "only available ore types"]. <A href='?src=\ref[src];toggle_ores=1'>\[[show_all_ores ? "show less" : "show more"]\]</a></br>"
|
|
dat += "The ore processor is currently <A href='?src=\ref[src];toggle_power=1'>[(machine.active ? "<font color='green'>processing</font>" : "<font color='red'>disabled</font>")]</a>."
|
|
|
|
var/datum/browser/processor_win = new(user, "processor_console", capitalize_first_letters(name))
|
|
processor_win.set_content(dat)
|
|
processor_win.open()
|
|
|
|
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
|
|
if(..())
|
|
return TRUE
|
|
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)
|
|
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, SPAN_WARNING("[station_name()]'s mining division is currently indebted to NanoTrasen. Transaction incomplete until debt is cleared."))
|
|
else
|
|
to_chat(usr, SPAN_WARNING("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, SPAN_WARNING("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, SPAN_WARNING("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 = "<small><center><b>NanoTrasen Inc.<br>"
|
|
dat += "Civilian Branch of Operation</b><br><br>"
|
|
|
|
dat += "Form 0600<br> Mining Yield Declaration</center><hr>"
|
|
dat += "Facility: NSS Aurora<br>"
|
|
dat += "Date: [date_string]<br>"
|
|
dat += "Index: [idx]<br><br>"
|
|
|
|
dat += "Miner(s): <span class=\"paper_field\"></span><br>"
|
|
dat += "Ore Yields: <br>"
|
|
|
|
dat += "<table>"
|
|
|
|
for(var/material/OM in output_mats)
|
|
if(output_mats[OM] > 1)
|
|
dat += "<tr><td><b><small>[output_mats[OM]]</b></small></td><td><small>[OM.display_name] [OM.sheet_plural_name]</small></td></tr>"
|
|
else
|
|
dat += "<tr><td><b><small>[output_mats[OM]]</b></small></td><td><small>[OM.display_name] [OM.sheet_singular_name]</small></td></tr>"
|
|
|
|
CHECK_TICK
|
|
|
|
for(var/datum/alloy/AM in alloy_mats)
|
|
if(alloy_mats[AM] > 1)
|
|
dat += "<tr><td><b><small>[alloy_mats[AM]]</b></td><td><small>[AM.metaltag] sheets</small></td></tr>"
|
|
else
|
|
dat += "<tr><td><b><small>[alloy_mats[AM]]</b></td><td><small>[AM.metaltag] sheet</small></td></tr>"
|
|
|
|
CHECK_TICK
|
|
|
|
dat += "</table><br>"
|
|
|
|
if(waste > 0)
|
|
dat += "Waste detected: "
|
|
dat += "[waste] unit(s) of material were wasted due to operator error. This includes: <br>"
|
|
dat += "<table>"
|
|
for(var/ore/IM in input_mats)
|
|
if(input_mats[IM] > 1)
|
|
dat += "<tr><td><b><small>[input_mats[IM]]</small></b></td><td><small>[IM.display_name]</small></td></tr>"
|
|
else
|
|
dat += "<tr><td><b><small>[input_mats[IM]]</small></b></td><td><small>[IM.display_name]</small></td></tr>"
|
|
|
|
CHECK_TICK
|
|
|
|
dat += "</table><br>"
|
|
|
|
dat += "Additional Notes: <span class=\"paper_field\"></span><br><br>"
|
|
|
|
dat += "Quartermaster's / Head of Personnel's / Captain's Stamp: </small>"
|
|
|
|
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 += "<HR><i>This paper has been stamped by the NT Ore Processing System.</i>"
|
|
|
|
user.visible_message("\The [src] rattles and prints out a sheet of paper.")
|
|
playsound(get_turf(src), "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 // based and redpilled
|
|
desc = "A large smelter and compression machine which heats up ore, then applies the process specified within the ore redemption console, outputting the result to the other side."
|
|
icon = 'icons/obj/machines/mining_machines.dmi'
|
|
icon_state = "furnace-off"
|
|
density = TRUE
|
|
anchored = TRUE
|
|
light_range = 3
|
|
var/obj/machinery/mineral/input
|
|
var/obj/machinery/mineral/output
|
|
var/obj/machinery/mineral/processing_unit_console/console
|
|
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 subtypesof(/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, i++)
|
|
var/obj/item/ore/O = locate() in get_turf(input)
|
|
if(!O)
|
|
break
|
|
if(!isnull(ores_stored[O.material]))
|
|
ores_stored[O.material] = ores_stored[O.material] + 1
|
|
|
|
qdel(O)
|
|
|
|
if(!active)
|
|
if(icon_state != "furnace-off")
|
|
icon_state = "furnace-off"
|
|
return
|
|
|
|
//Process our stored ores and spit out sheets.
|
|
var/sheets = 0
|
|
for(var/metal in ores_stored)
|
|
if(sheets >= 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 = TRUE
|
|
|
|
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 = FALSE
|
|
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, i < total, i++)
|
|
console.alloy_mats[A] = console.alloy_mats[A] + 1
|
|
new A.product(get_turf(output))
|
|
|
|
else if(ores_processing[metal] == 2 && O.compresses_to) //Compressing.
|
|
var/can_make = Clamp(ores_stored[metal], 0, sheets_per_tick - sheets)
|
|
if(can_make % 2 > 0)
|
|
can_make--
|
|
|
|
var/material/M = SSmaterials.get_material_by_name(O.compresses_to)
|
|
|
|
if(!istype(M) || !can_make || ores_stored[metal] < 1)
|
|
continue
|
|
|
|
for(var/i = 0, i < can_make, i += 2)
|
|
if(console)
|
|
console.points += O.worth * 2
|
|
use_power(100)
|
|
ores_stored[metal] -= 2
|
|
sheets += 2
|
|
console.output_mats[M] += 1
|
|
new M.stack_type(get_turf(output))
|
|
|
|
else if(ores_processing[metal] == 1 && O.smelts_to) //Smelting.
|
|
var/can_make = Clamp(ores_stored[metal], 0, sheets_per_tick - sheets)
|
|
|
|
var/material/M = SSmaterials.get_material_by_name(O.smelts_to)
|
|
if(!istype(M) || !can_make || ores_stored[metal] < 1)
|
|
continue
|
|
|
|
for(var/i = 0, i < can_make, i++)
|
|
if(console)
|
|
console.points += O.worth
|
|
use_power(100)
|
|
ores_stored[metal] -= 1
|
|
sheets++
|
|
console.output_mats[M] += 1
|
|
new M.stack_type(get_turf(output))
|
|
else
|
|
if(console)
|
|
console.points -= O.worth * 3 //reee wasting our materials!
|
|
use_power(500)
|
|
ores_stored[metal] -= 1
|
|
sheets++
|
|
console.input_mats[O] += 1
|
|
console.waste++
|
|
new /obj/item/ore/slag(get_turf(output))
|
|
else
|
|
continue
|
|
|
|
console.updateUsrDialog()
|
|
|
|
/obj/machinery/mineral/processing_unit/attackby(obj/item/W, mob/user)
|
|
if(default_deconstruction_screwdriver(user, W))
|
|
return
|
|
else if(default_part_replacement(user, W))
|
|
return
|
|
|
|
/obj/machinery/mineral/processing_unit/RefreshParts()
|
|
..()
|
|
var/scan_rating = 0
|
|
var/cap_rating = 0
|
|
var/laser_rating = 0
|
|
|
|
for(var/obj/item/stock_parts/P in component_parts)
|
|
if(isscanner(P))
|
|
scan_rating += P.rating
|
|
else if(iscapacitor(P))
|
|
cap_rating += P.rating
|
|
else if(ismicrolaser(P))
|
|
laser_rating += P.rating
|
|
|
|
sheets_per_tick += scan_rating + cap_rating + laser_rating
|