mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 18:44:48 +01:00
[TGUI] Ore Redemption Machine (#15016)
* [TGUI] Ore Redemption Machine * small thing
This commit is contained in:
@@ -1,6 +1,13 @@
|
||||
/**********************Ore Redemption Unit**************************/
|
||||
//Turns all the various mining machines into a single unit to speed up mining and establish a point system
|
||||
#define BASE_POINT_MULT 0.65
|
||||
#define BASE_SHEET_MULT 0.65
|
||||
#define POINT_MULT_ADD_PER_RATING 0.35
|
||||
#define SHEET_MULT_ADD_PER_RATING 0.35
|
||||
|
||||
/**
|
||||
* # Ore Redemption Machine
|
||||
*
|
||||
* Turns all the various mining machines into a single unit to speed up tmining and establish a point system.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption
|
||||
name = "ore redemption machine"
|
||||
desc = "A machine that accepts ore and instantly transforms it into workable material sheets. Points for ore are generated based on type and can be redeemed at a mining equipment vendor."
|
||||
@@ -13,24 +20,49 @@
|
||||
req_access = list(ACCESS_MINERAL_STOREROOM)
|
||||
speed_process = TRUE
|
||||
layer = BELOW_OBJ_LAYER
|
||||
var/req_access_reclaim = ACCESS_MINING_STATION
|
||||
var/obj/item/card/id/inserted_id
|
||||
// Settings
|
||||
/// The access number required to claim points from the machine.
|
||||
var/req_access_claim = ACCESS_MINING_STATION
|
||||
/// If TRUE, [/obj/machinery/mineral/ore_redemption/var/req_access_claim] is ignored and any ID may be used to claim points.
|
||||
var/anyone_claim = FALSE
|
||||
/// List of supply console department names that can receive a notification about ore dumps.
|
||||
/// A list may be provided as entry value to only notify when specific ore is dumped.
|
||||
var/list/supply_consoles = list(
|
||||
"Science",
|
||||
"Robotics",
|
||||
"Research Director's Desk",
|
||||
"Mechanic",
|
||||
"Engineering" = list(MAT_METAL, MAT_GLASS, MAT_PLASMA),
|
||||
"Chief Engineer's Desk" = list(MAT_METAL, MAT_GLASS, MAT_PLASMA),
|
||||
"Atmospherics" = list(MAT_METAL, MAT_GLASS, MAT_PLASMA),
|
||||
"Bar" = list(MAT_URANIUM, MAT_PLASMA),
|
||||
"Virology" = list(MAT_PLASMA, MAT_URANIUM, MAT_GOLD)
|
||||
)
|
||||
// Variables
|
||||
/// The currently inserted ID.
|
||||
var/obj/item/card/id/inserted_id = null
|
||||
/// The number of unclaimed points.
|
||||
var/points = 0
|
||||
var/ore_pickup_rate = 15
|
||||
/// Sheet multiplier applied when smelting ore. Updated by [/obj/machinery/proc/RefreshParts].
|
||||
var/sheet_per_ore = 1
|
||||
/// Point multiplier applied when smelting ore. Updated by [/obj/machinery/proc/RefreshParts].
|
||||
var/point_upgrade = 1
|
||||
var/list/ore_values = list("sand" = 1, "iron" = 1, "plasma" = 15, "silver" = 16, "gold" = 18, "titanium" = 30, "uranium" = 30, "diamond" = 50, "bluespace crystal" = 50, "bananium" = 60, "tranquillite" = 60)
|
||||
var/message_sent = FALSE
|
||||
var/list/ore_buffer = list()
|
||||
/// Whether the message to relevant supply consoles was sent already or not for an ore dump. If FALSE, another will be sent.
|
||||
var/message_sent = TRUE
|
||||
/// List of ore yet to process.
|
||||
var/list/obj/item/stack/ore/ore_buffer = null
|
||||
/// Locally known R&D designs.
|
||||
var/datum/research/files
|
||||
/// The currently inserted design disk.
|
||||
var/obj/item/disk/design_disk/inserted_disk
|
||||
var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold"))
|
||||
var/anyuse = FALSE
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/New()
|
||||
..()
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack)
|
||||
ore_buffer = list()
|
||||
// Components
|
||||
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE), INFINITY, FALSE, /obj/item/stack, null, CALLBACK(src, .proc/on_material_insert))
|
||||
files = new /datum/research/smelter(src)
|
||||
// Stock parts
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/circuitboard/ore_redemption(null)
|
||||
component_parts += new /obj/item/stock_parts/matter_bin(null)
|
||||
@@ -51,14 +83,14 @@
|
||||
component_parts += new /obj/item/stack/sheet/glass(null)
|
||||
RefreshParts()
|
||||
|
||||
/**
|
||||
* # Ore Redemption Machine (Golem)
|
||||
*
|
||||
* Golem variant of the ORM.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/golem
|
||||
req_access = list(ACCESS_FREE_GOLEMS)
|
||||
req_access_reclaim = ACCESS_FREE_GOLEMS
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/labor
|
||||
name = "labor camp ore redemption machine"
|
||||
req_access = list()
|
||||
anyuse = TRUE
|
||||
req_access_claim = ACCESS_FREE_GOLEMS
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/golem/New()
|
||||
..()
|
||||
@@ -71,6 +103,16 @@
|
||||
component_parts += new /obj/item/stack/sheet/glass(null)
|
||||
RefreshParts()
|
||||
|
||||
/**
|
||||
* # Ore Redemption Machine (Labor Camp)
|
||||
*
|
||||
* Labor camp variant of the ORM. Points can be claimed by anyone.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/labor
|
||||
name = "labor camp ore redemption machine"
|
||||
req_access = list()
|
||||
anyone_claim = TRUE
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/labor/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
@@ -83,151 +125,94 @@
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/Destroy()
|
||||
QDEL_NULL(files)
|
||||
// Move any stuff inside us out
|
||||
var/turf/T = get_turf(src)
|
||||
inserted_id?.forceMove(T)
|
||||
inserted_disk?.forceMove(T)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
materials.retrieve_all()
|
||||
// Clean up
|
||||
QDEL_NULL(files)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/RefreshParts()
|
||||
var/ore_pickup_rate_temp = 15
|
||||
var/point_upgrade_temp = 1
|
||||
var/sheet_per_ore_temp = 1
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
sheet_per_ore_temp = 0.65 + (0.35 * B.rating)
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
ore_pickup_rate_temp = 15 * M.rating
|
||||
for(var/obj/item/stock_parts/micro_laser/L in component_parts)
|
||||
point_upgrade_temp = 0.65 + (0.35 * L.rating)
|
||||
ore_pickup_rate = ore_pickup_rate_temp
|
||||
point_upgrade = point_upgrade_temp
|
||||
sheet_per_ore = sheet_per_ore_temp
|
||||
var/P = 1
|
||||
var/S = 1
|
||||
for(var/sp in component_parts)
|
||||
var/obj/item/stock_parts/SP = sp
|
||||
if(!istype(SP))
|
||||
continue
|
||||
switch(SP.type)
|
||||
if(/obj/item/stock_parts/micro_laser)
|
||||
P = BASE_POINT_MULT + (POINT_MULT_ADD_PER_RATING * SP.rating)
|
||||
if(/obj/item/stock_parts/matter_bin)
|
||||
S = BASE_SHEET_MULT + (SHEET_MULT_ADD_PER_RATING * SP.rating)
|
||||
// Manipulators do nothing
|
||||
// Update our values
|
||||
point_upgrade = P
|
||||
sheet_per_ore = S
|
||||
SStgui.update_uis(src)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
|
||||
|
||||
ore_buffer -= O
|
||||
|
||||
if(O && O.refined_type)
|
||||
points += O.points * point_upgrade * O.amount
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/material_amount = materials.get_item_material_amount(O)
|
||||
|
||||
if(!material_amount)
|
||||
qdel(O) //no materials, incinerate it
|
||||
|
||||
else if(!materials.has_space(material_amount * sheet_per_ore * O.amount)) //if there is no space, eject it
|
||||
unload_mineral(O)
|
||||
/obj/machinery/mineral/ore_redemption/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
if(inserted_id && !powered())
|
||||
visible_message("<span class='notice'>The ID slot indicator light flickers on [src] as it spits out a card before powering down.</span>")
|
||||
inserted_id.forceMove(get_turf(src))
|
||||
inserted_id = null
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/update_icon()
|
||||
if(powered())
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
materials.insert_item(O, sheet_per_ore) //insert it
|
||||
qdel(O)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
|
||||
if(D.make_reagents.len)
|
||||
return FALSE
|
||||
|
||||
var/build_amount = 0
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
for(var/mat_id in D.materials)
|
||||
var/M = D.materials[mat_id]
|
||||
var/datum/material/redemption_mat = materials.materials[mat_id]
|
||||
|
||||
if(!M || !redemption_mat)
|
||||
return FALSE
|
||||
|
||||
var/smeltable_sheets = round(redemption_mat.amount / M)
|
||||
|
||||
if(!smeltable_sheets)
|
||||
return FALSE
|
||||
|
||||
if(!build_amount)
|
||||
build_amount = smeltable_sheets
|
||||
|
||||
build_amount = min(build_amount, smeltable_sheets)
|
||||
|
||||
return build_amount
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/process_ores(list/ores_to_process)
|
||||
var/current_amount = 0
|
||||
for(var/ore in ores_to_process)
|
||||
if(current_amount >= ore_pickup_rate)
|
||||
break
|
||||
smelt_ore(ore)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
|
||||
if(!is_station_level(z))
|
||||
return
|
||||
message_sent = TRUE
|
||||
var/area/A = get_area(src)
|
||||
var/msg = "Now available in [A]:"
|
||||
|
||||
var/has_minerals = FALSE
|
||||
var/mineral_name = null
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
for(var/mat_id in materials.materials)
|
||||
var/datum/material/M = materials.materials[mat_id]
|
||||
var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
|
||||
mineral_name = capitalize(M.name)
|
||||
if(mineral_amount)
|
||||
has_minerals = TRUE
|
||||
msg += "[mineral_name]: [mineral_amount] sheets"
|
||||
|
||||
if(!has_minerals)
|
||||
return
|
||||
|
||||
for(var/obj/machinery/requests_console/D in GLOB.allRequestConsoles)
|
||||
if(D.department in src.supply_consoles)
|
||||
if(supply_consoles[D.department] == null || (mineral_name in supply_consoles[D.department]))
|
||||
D.createMessage("Ore Redemption Machine", "New Minerals Available!", msg, 1)
|
||||
icon_state = "[initial(icon_state)]-off"
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/process()
|
||||
if(panel_open || !powered())
|
||||
return
|
||||
// Check if the input turf has a [/obj/structure/ore_box] to draw ore from. Otherwise suck ore from the turf
|
||||
var/atom/input = get_step(src, input_dir)
|
||||
var/obj/structure/ore_box/OB = locate() in input
|
||||
if(OB)
|
||||
input = OB
|
||||
|
||||
// Suck the ore in
|
||||
for(var/obj/item/stack/ore/O in input)
|
||||
if(QDELETED(O))
|
||||
continue
|
||||
ore_buffer |= O
|
||||
O.forceMove(src)
|
||||
CHECK_TICK
|
||||
|
||||
if(LAZYLEN(ore_buffer))
|
||||
// Process it
|
||||
if(length(ore_buffer))
|
||||
message_sent = FALSE
|
||||
process_ores(ore_buffer)
|
||||
else if(!message_sent)
|
||||
SStgui.update_uis(src)
|
||||
send_console_message()
|
||||
message_sent = TRUE
|
||||
|
||||
// Interactions
|
||||
/obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params)
|
||||
if(exchange_parts(user, W))
|
||||
return
|
||||
|
||||
if(!powered())
|
||||
return
|
||||
return ..()
|
||||
|
||||
if(istype(W, /obj/item/card/id))
|
||||
var/obj/item/card/id/I = user.get_active_hand()
|
||||
if(istype(I) && !istype(inserted_id))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.forceMove(src)
|
||||
inserted_id = I
|
||||
interact(user)
|
||||
try_insert_id(user)
|
||||
return
|
||||
else if(istype(W, /obj/item/disk/design_disk))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.forceMove(src)
|
||||
inserted_disk = W
|
||||
SStgui.update_uis(src)
|
||||
interact(user)
|
||||
user.visible_message("<span class='notice'>[user] inserts [W] into [src].</span>", \
|
||||
"<span class='notice'>You insert [W] into [src].</span>")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/disk/design_disk))
|
||||
if(user.drop_item())
|
||||
W.forceMove(src)
|
||||
inserted_disk = W
|
||||
interact(user)
|
||||
return TRUE
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/crowbar_act(mob/user, obj/item/I)
|
||||
if(default_deconstruction_crowbar(user, I))
|
||||
return TRUE
|
||||
@@ -246,174 +231,273 @@
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/screwdriver_act(mob/user, obj/item/I)
|
||||
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", I))
|
||||
updateUsrDialog()
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/wrench_act(mob/user, obj/item/I)
|
||||
if(default_unfasten_wrench(user, I))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/attack_ghost(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/interact(mob/user)
|
||||
var/dat = "This machine only accepts ore. Gibtonite and Slag are not accepted.<br><br>"
|
||||
dat += "Current unclaimed points: [points]<br>"
|
||||
|
||||
if(inserted_id)
|
||||
dat += "You have [inserted_id.mining_points] mining points collected. <A href='?src=[UID()];eject_id=1'>Eject ID.</A><br>"
|
||||
dat += "<A href='?src=[UID()];claim=1'>Claim points.</A><br><br>"
|
||||
else
|
||||
dat += "No ID inserted. <A href='?src=[UID()];insert_id=1'>Insert ID.</A><br><br>"
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
for(var/mat_id in materials.materials)
|
||||
var/datum/material/M = materials.materials[mat_id]
|
||||
if(M.amount)
|
||||
var/sheet_amount = M.amount / MINERAL_MATERIAL_AMOUNT
|
||||
dat += "[capitalize(M.name)]: [sheet_amount] "
|
||||
if(sheet_amount >= 1)
|
||||
dat += "<A href='?src=[UID()];release=[mat_id]'>Release</A><br>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Release</span><br>"
|
||||
|
||||
dat += "<br><b>Alloys: </b><br>"
|
||||
|
||||
for(var/v in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[v]
|
||||
if(can_smelt_alloy(D))
|
||||
dat += "[D.name]: <A href='?src=[UID()];alloy=[D.id]'>Smelt</A><br>"
|
||||
else
|
||||
dat += "[D.name]: <span class='linkOff'>Smelt</span><br>"
|
||||
|
||||
dat += "<br><div class='statusDisplay'><b>Mineral Value List:</b><br>[get_ore_values()]</div>"
|
||||
|
||||
if(inserted_disk)
|
||||
dat += "<A href='?src=[UID()];eject_disk=1'>Eject disk</A><br>"
|
||||
dat += "<div class='statusDisplay'><b>Uploadable designs: </b><br>"
|
||||
|
||||
if(inserted_disk.blueprint)
|
||||
var/datum/design/D = inserted_disk.blueprint
|
||||
if(D.build_type & SMELTER)
|
||||
dat += "Name: [D.name] <A href='?src=[UID()];upload=[inserted_disk.blueprint]'>Upload to smelter</A>"
|
||||
|
||||
dat += "</div><br>"
|
||||
else
|
||||
dat += "<A href='?src=[UID()];insert_disk=1'>Insert design disk</A><br><br>"
|
||||
|
||||
var/datum/browser/popup = new(user, "ore_redemption_machine", "Ore Redemption Machine", 400, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/proc/get_ore_values()
|
||||
var/dat = "<table border='0' width='300'>"
|
||||
for(var/ore in ore_values)
|
||||
var/value = ore_values[ore]
|
||||
dat += "<tr><td>[capitalize(ore)]</td><td>[value * point_upgrade]</td></tr>"
|
||||
dat += "</table>"
|
||||
return dat
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
if(href_list["eject_id"])
|
||||
usr.put_in_hands(inserted_id)
|
||||
inserted_id = null
|
||||
if(href_list["claim"])
|
||||
if(inserted_id)
|
||||
if(req_access_reclaim in inserted_id.access)
|
||||
inserted_id.mining_points += points
|
||||
points = 0
|
||||
if(anyuse)
|
||||
inserted_id.mining_points += points
|
||||
points = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
else if(href_list["insert_id"])
|
||||
var/obj/item/card/id/I = usr.get_active_hand()
|
||||
if(istype(I))
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
I.forceMove(src)
|
||||
inserted_id = I
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Not a valid ID!</span>")
|
||||
if(href_list["eject_disk"])
|
||||
if(inserted_disk)
|
||||
inserted_disk.forceMove(loc)
|
||||
inserted_disk = null
|
||||
if(href_list["insert_disk"])
|
||||
var/obj/item/disk/design_disk/D = usr.get_active_hand()
|
||||
if(istype(D))
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
D.forceMove(src)
|
||||
inserted_disk = D
|
||||
if(href_list["upload"])
|
||||
if(inserted_disk && inserted_disk.blueprint)
|
||||
files.AddDesign2Known(inserted_disk.blueprint)
|
||||
|
||||
if(href_list["release"])
|
||||
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
|
||||
var/mat_id = href_list["release"]
|
||||
if(!materials.materials[mat_id])
|
||||
return
|
||||
|
||||
var/datum/material/mat = materials.materials[mat_id]
|
||||
var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
|
||||
|
||||
if(!stored_amount)
|
||||
return
|
||||
|
||||
var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
|
||||
var/sheets_to_remove = round(min(desired,50,stored_amount))
|
||||
|
||||
var/out = get_step(src, output_dir)
|
||||
materials.retrieve_sheets(sheets_to_remove, mat_id, out)
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
|
||||
if(href_list["alloy"])
|
||||
var/alloy_id = href_list["alloy"]
|
||||
var/datum/design/alloy = files.FindDesignByID(alloy_id)
|
||||
if((check_access(inserted_id) || allowed(usr)) && alloy)
|
||||
var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
|
||||
if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
|
||||
return
|
||||
var/smelt_amount = can_smelt_alloy(alloy)
|
||||
var/amount = round(min(desired,50,smelt_amount))
|
||||
materials.use_amount(alloy.materials, amount)
|
||||
|
||||
var/output = new alloy.build_path(src)
|
||||
if(istype(output, /obj/item/stack/sheet))
|
||||
var/obj/item/stack/sheet/mineral/produced_alloy = output
|
||||
produced_alloy.amount = amount
|
||||
unload_mineral(produced_alloy)
|
||||
else
|
||||
unload_mineral(output)
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
updateUsrDialog()
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ex_act(severity)
|
||||
do_sparks(5, TRUE, src)
|
||||
..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
if(inserted_id && !powered())
|
||||
visible_message("<span class='notice'>The ID slot indicator light flickers on [src] as it spits out a card before powering down.</span>")
|
||||
inserted_id.forceMove(loc)
|
||||
// UI
|
||||
/obj/machinery/mineral/ore_redemption/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/update_icon()
|
||||
if(powered())
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]-off"
|
||||
// General info
|
||||
data["id"] = inserted_id ? list("name" = "[inserted_id.registered_name] ([inserted_id.assignment])", "points" = inserted_id.mining_points) : null
|
||||
data["points"] = points
|
||||
data["disk"] = inserted_disk ? list(
|
||||
"name" = inserted_disk.name,
|
||||
"design" = inserted_disk.blueprint?.name,
|
||||
"compatible" = (inserted_disk.blueprint?.build_type & SMELTER)
|
||||
) : null
|
||||
|
||||
// Sheets
|
||||
var/list/sheets = list()
|
||||
for(var/MAT in materials.materials)
|
||||
var/datum/material/M = materials.materials[MAT]
|
||||
if(!M)
|
||||
continue
|
||||
var/obj/item/stack/ore/O = M.ore_type
|
||||
sheets += list(list(
|
||||
"id" = MAT,
|
||||
"name" = M.name,
|
||||
"amount" = M.amount / MINERAL_MATERIAL_AMOUNT,
|
||||
"value" = initial(O.points) * point_upgrade
|
||||
))
|
||||
data["sheets"] = sheets
|
||||
|
||||
// Alloys
|
||||
var/list/alloys = list()
|
||||
for(var/v in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[v]
|
||||
alloys += list(list(
|
||||
"id" = D.id,
|
||||
"name" = D.name,
|
||||
"amount" = get_num_smeltable_alloy(D)
|
||||
))
|
||||
data["alloys"] = alloys
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ui_act(action, list/params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
. = TRUE
|
||||
switch(action)
|
||||
if("claim")
|
||||
if(!inserted_id || !points)
|
||||
return
|
||||
if(anyone_claim || (req_access_claim in inserted_id.access))
|
||||
inserted_id.mining_points += points
|
||||
to_chat(usr, "<span class='notice'>[points] points claimed.</span>")
|
||||
points = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
if("sheet", "alloy")
|
||||
if(!(check_access(inserted_id) || allowed(usr)))
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
return FALSE
|
||||
var/id = params["id"]
|
||||
var/amount = round(text2num(params["amount"]))
|
||||
if(!amount || amount < 1)
|
||||
return FALSE
|
||||
var/out_loc = get_step(src, output_dir)
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
if(action == "sheet")
|
||||
var/datum/material/M = materials.materials[id]
|
||||
if(!M)
|
||||
return FALSE
|
||||
var/stored = M.amount / MINERAL_MATERIAL_AMOUNT
|
||||
var/desired = min(amount, stored, MAX_STACK_SIZE)
|
||||
materials.retrieve_sheets(desired, id, out_loc)
|
||||
else
|
||||
var/datum/design/D = files.FindDesignByID(id)
|
||||
if(!D)
|
||||
return FALSE
|
||||
var/stored = get_num_smeltable_alloy(D)
|
||||
var/desired = min(amount, stored, MAX_STACK_SIZE)
|
||||
materials.use_amount(D.materials, desired)
|
||||
// Spawn the alloy
|
||||
var/result = new D.build_path(src)
|
||||
if(istype(result, /obj/item/stack/sheet))
|
||||
var/obj/item/stack/sheet/mineral/A = result
|
||||
A.amount = amount
|
||||
unload_mineral(A)
|
||||
else
|
||||
unload_mineral(result)
|
||||
if("insert_id")
|
||||
try_insert_id(usr)
|
||||
if("eject_id")
|
||||
if(!inserted_id)
|
||||
return FALSE
|
||||
if(ishuman(usr))
|
||||
usr.put_in_hands(inserted_id)
|
||||
usr.visible_message("<span class='notice'>[usr] retrieves [inserted_id] from [src].</span>", \
|
||||
"<span class='notice'>You retrieve [inserted_id] from [src].</span>")
|
||||
else
|
||||
inserted_id.forceMove(get_turf(src))
|
||||
inserted_id = null
|
||||
if("eject_disk")
|
||||
if(!inserted_disk)
|
||||
return FALSE
|
||||
if(ishuman(usr))
|
||||
usr.put_in_hands(inserted_disk)
|
||||
usr.visible_message("<span class='notice'>[usr] retrieves [inserted_disk] from [src].</span>", \
|
||||
"<span class='notice'>You retrieve [inserted_disk] from [src].</span>")
|
||||
else
|
||||
inserted_disk.forceMove(get_turf(src))
|
||||
inserted_disk = null
|
||||
if("download")
|
||||
if(inserted_disk?.blueprint?.build_type & SMELTER)
|
||||
files.AddDesign2Known(inserted_disk.blueprint)
|
||||
atom_say("Design \"[inserted_disk.blueprint.name]\" downloaded successfully.")
|
||||
else
|
||||
return FALSE
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
var/datum/asset/materials_assets = get_asset_datum(/datum/asset/simple/materials)
|
||||
materials_assets.send(user)
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "OreRedemption", name, 400, 600)
|
||||
ui.open()
|
||||
ui.set_autoupdate(FALSE)
|
||||
|
||||
/**
|
||||
* Smelts the given stack of ore.
|
||||
*
|
||||
* Arguments:
|
||||
* * O - The ore stack to smelt.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O)
|
||||
// Award points if the ore actually smelts to something
|
||||
if(O.refined_type)
|
||||
points += O.points * point_upgrade * O.amount
|
||||
// Insert materials
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
var/amount_compatible = materials.get_item_material_amount(O)
|
||||
if(amount_compatible)
|
||||
materials.insert_item(O, sheet_per_ore)
|
||||
// Delete the stack
|
||||
ore_buffer -= O
|
||||
qdel(O)
|
||||
|
||||
/**
|
||||
* Returns the amount of alloy sheets that can be produced from the given design.
|
||||
*
|
||||
* Arguments:
|
||||
* * D - The smelting design.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/proc/get_num_smeltable_alloy(datum/design/D)
|
||||
if(length(D.make_reagents))
|
||||
return 0
|
||||
|
||||
var/result = 0
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
for(var/MAT in D.materials)
|
||||
var/M = D.materials[MAT]
|
||||
var/datum/material/stored = materials.materials[MAT]
|
||||
if(!M || !stored)
|
||||
return FALSE
|
||||
var/smeltable = round(stored.amount / M)
|
||||
if(!smeltable)
|
||||
return FALSE
|
||||
if(!result)
|
||||
result = smeltable
|
||||
result = min(result, smeltable)
|
||||
return result
|
||||
|
||||
/**
|
||||
* Processes the given list of ores.
|
||||
*
|
||||
* Arguments:
|
||||
* * L - List of ores to process.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/proc/process_ores(list/obj/item/stack/ore/L)
|
||||
for(var/ore in L)
|
||||
smelt_ore(ore)
|
||||
|
||||
/**
|
||||
* Notifies all relevant supply consoles with the machine's contents.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
|
||||
if(!is_station_level(z))
|
||||
return
|
||||
|
||||
var/msg = "Now available in [get_area_name(src, TRUE) || "Unknown"]:"
|
||||
var/mats_in_stock = list()
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
for(var/MAT in materials.materials)
|
||||
var/datum/material/M = materials.materials[MAT]
|
||||
var/mineral_amount = M.amount / MINERAL_MATERIAL_AMOUNT
|
||||
if(mineral_amount)
|
||||
mats_in_stock += M.id
|
||||
msg += "[capitalize(M.name)]: [mineral_amount] sheets"
|
||||
|
||||
// No point sending a message if we're dry
|
||||
if(!length(mats_in_stock))
|
||||
return
|
||||
|
||||
// Notify
|
||||
for(var/c in GLOB.allRequestConsoles)
|
||||
var/obj/machinery/requests_console/C = c
|
||||
if(!(C.department in supply_consoles))
|
||||
continue
|
||||
if(!supply_consoles[C.department] || length(supply_consoles[C.department] - mats_in_stock))
|
||||
C.createMessage("Ore Redemption Machine", "New Minerals Available!", msg, 1) // RQ_NORMALPRIORITY
|
||||
|
||||
/**
|
||||
* Tries to insert the ID card held by the given user into the machine.
|
||||
*
|
||||
* Arguments:
|
||||
* * user - The ID whose active hand to check for an ID card to insert.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/proc/try_insert_id(mob/user)
|
||||
. = FALSE
|
||||
var/obj/item/card/id/I = user.get_active_hand()
|
||||
if(!istype(I))
|
||||
return
|
||||
if(inserted_id)
|
||||
to_chat(user, "<span class='warning'>There is already an ID inside!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.forceMove(src)
|
||||
inserted_id = I
|
||||
SStgui.update_uis(src)
|
||||
interact(user)
|
||||
user.visible_message("<span class='notice'>[user] inserts [I] into [src].</span>", \
|
||||
"<span class='notice'>You insert [I] into [src].</span>")
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
* Called when an item is inserted manually as material.
|
||||
*
|
||||
* Arguments:
|
||||
* * inserted_type - The type of the inserted item.
|
||||
* * last_inserted_id - The ID of the last material to have been inserted.
|
||||
* * inserted - The amount of material inserted.
|
||||
*/
|
||||
/obj/machinery/mineral/ore_redemption/proc/on_material_insert(inserted_type, last_inserted_id, inserted)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
#undef BASE_POINT_MULT
|
||||
#undef BASE_SHEET_MULT
|
||||
#undef POINT_MULT_ADD_PER_RATING
|
||||
#undef SHEET_MULT_ADD_PER_RATING
|
||||
|
||||
Reference in New Issue
Block a user