Files
Aurora.3/code/modules/mining/machine_processing.dm
Andrew b4102a6dbd Removes mining access requirement from ore redemption consoles (#17714)
* Removes mining access requirement from ore redemption consoles

The claim points and print yield declarations required mining access to use despite the actual functionality of the console requiring no access. I've removed this access requirement so off-ships with these machines can actually use them.

* Update code/modules/mining/machine_processing.dm

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

* Update code/modules/mining/machine_processing.dm

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

---------

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>
2023-11-06 16:48:28 +00:00

476 lines
14 KiB
Plaintext

/obj/machinery/mineral
var/id //used for linking machines to consoles
/**********************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/machinery/wall/terminals.dmi'
icon_state = "production_console"
density = FALSE
anchored = TRUE
idle_power_usage = 15
active_power_usage = 50
var/obj/machinery/mineral/processing_unit/machine
var/show_all_ores = TRUE
var/points = 0
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
component_types = list(
/obj/item/circuitboard/redemption_console,
/obj/item/stock_parts/scanning_module,
/obj/item/stock_parts/console_screen
)
/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/Destroy()
if(machine)
machine.console = null
return ..()
/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.machinery)
if(id)
if(checked_machine.id == id)
machine = checked_machine
else if(!checked_machine.console && 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/attackby(obj/item/I, mob/user)
if(default_deconstruction_screwdriver(user, I))
return
if(default_deconstruction_crowbar(user, I))
return
if(default_part_replacement(user, I))
return
return ..()
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
add_fingerprint(user)
if(!setup_machine(user))
return
ui_interact(user)
/obj/machinery/mineral/processing_unit_console/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "MiningProcessor", "Ore Redemption Console", ui_x=500, ui_y=575)
ui.autoupdate = FALSE
ui.open()
/obj/machinery/mineral/processing_unit_console/ui_data(mob/user)
var/list/data = list()
var/obj/item/card/id/ID = user.GetIdCard()
if(ID)
data["hasId"] = TRUE
data["miningPoints"] = ID.mining_points ? ID.mining_points : 0
else
data["hasId"] = FALSE
data["enabled"] = machine.active
data["points"] = points
data["showAllOres"] = show_all_ores
var/list/ore_list = list()
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
var/processing_type = ""
switch(machine.ores_processing[ore])
if(0)
processing_type = "Idle"
if(1)
processing_type = "Smelt"
if(2)
processing_type = "Compress"
if(3)
processing_type = "Alloy"
ore_list += list(list("name" = capitalize_first_letters(O.display_name), "processing" = processing_type, "stored" = machine.ores_stored[ore], "ore" = ore))
data["oreList"] = ore_list
return data
/obj/machinery/mineral/processing_unit_console/ui_act(action, params)
if(..())
return TRUE
if(action == "choice")
var/obj/item/card/id/ID = usr.GetIdCard()
if(ID)
if(params["choice"] == "claim")
if(points >= 0)
ID.mining_points += points
if(points != 0)
ping("<b>\The [src]</b> pings, \"Point transfer complete! Transaction total: [points] points!\"")
points = 0
else
ping("<b>\The [src]</b> pings, \"Transaction failed due to a negative point value. No transaction can be done until this value has returned to a positive one.\"")
if(params["choice"] == "print_report")
print_report(usr)
return TRUE
if(action == "toggle_smelting")
var/ore_name = params["toggle_smelting"]
var/choice = tgui_input_list(usr, "What setting do you wish to use for processing [ore_name]?", "Processing", list("Smelting", "Compressing", "Alloying", "Nothing"))
if(!choice)
return TRUE
switch(choice)
if("Nothing")
choice = 0
if("Smelting")
choice = 1
if("Compressing")
choice = 2
if("Alloying")
choice = 3
machine.ores_processing[ore_name] = choice
return TRUE
if(action == "toggle_power")
machine.active = !machine.active
if(machine.active)
machine.icon_state = "furnace"
else
machine.icon_state = "furnace-off"
return TRUE
if(action == "toggle_ores")
show_all_ores = !show_all_ores
return TRUE
/obj/machinery/mineral/processing_unit_console/proc/print_report(var/mob/living/user)
var/obj/item/card/id/ID = user.GetIdCard()
if(!ID)
to_chat(user, SPAN_WARNING("No ID detected. 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(get_turf(src))
var/date_string = worlddate2text()
idx++
var/form_title = "Form 0600 - Mining Yield Declaration"
var/dat = "<small><center><b>Stellar Corporate Conglomerate<br>"
dat += "Operations Department</b><br><br>"
dat += "Form 0600<br> Mining Yield Declaration</center><hr>"
dat += "Facility: [current_map.station_name]<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 += "Operations Manager'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 SCC 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(user.Adjacent(src))
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/machinery/mining_machines.dmi'
icon_state = "furnace-off"
density = TRUE
anchored = TRUE
light_range = 3
var/turf/input
var/turf/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
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)
var/input_spot = locate(/obj/machinery/mineral/input, get_step(src, dir))
if(input_spot)
input = get_turf(input_spot) // thought of qdeling the spots here, but it's useful when rebuilding a destroyed machine
break
for(var/dir in cardinal)
var/output_spot = locate(/obj/machinery/mineral/output, get_step(src, dir))
if(output)
output = get_turf(output_spot)
break
if(!input)
input = get_step(src, reverse_dir[dir])
if(!output)
output = get_step(src, dir)
/obj/machinery/mineral/processing_unit/Destroy()
if(console)
console.machine = null
return ..()
/obj/machinery/mineral/processing_unit/attackby(obj/item/I, mob/user)
if(default_deconstruction_screwdriver(user, I))
return
if(default_deconstruction_crowbar(user, I))
return
if(default_part_replacement(user, I))
return
return ..()
/obj/machinery/mineral/processing_unit/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 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_oneoff(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++)
if(console)
console.alloy_mats[A] = console.alloy_mats[A] + 1
new A.product(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_oneoff(100)
ores_stored[metal] -= 2
sheets += 2
console.output_mats[M] += 1
new M.stack_type(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_oneoff(100)
ores_stored[metal] -= 1
sheets++
if(console)
console.output_mats[M] += 1
new M.stack_type(output)
else
if(console)
console.points -= O.worth * 3 //reee wasting our materials!
use_power_oneoff(500)
ores_stored[metal] -= 1
sheets++
if(console)
console.input_mats[O] += 1
console.waste++
new /obj/item/ore/slag(output)
else
continue
if(console)
console.updateUsrDialog()
/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