diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index 17f76a209ed..f12a8def5dd 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -11,6 +11,7 @@
input_dir = NORTH
output_dir = SOUTH
req_access = list(access_mineral_storeroom)
+ var/req_access_reclaim = access_mining_station
var/stk_types = list()
var/stk_amt = list()
var/stack_list = list() //Key: Type. Value: Instance of type.
@@ -19,12 +20,14 @@
var/ore_pickup_rate = 15
var/sheet_per_ore = 1
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))
+ 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)
speed_process = 1
+ var/message_sent = FALSE
+ var/list/ore_buffer = list()
/obj/machinery/mineral/ore_redemption/New()
..()
- var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/ore_redemption(null)
+ var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new
B.apply_default_parts(src)
/obj/item/weapon/circuitboard/machine/ore_redemption
@@ -55,51 +58,72 @@
/obj/machinery/mineral/ore_redemption/proc/process_sheet(obj/item/weapon/ore/O)
var/obj/item/stack/sheet/processed_sheet = SmeltMineral(O)
if(processed_sheet)
- if(!(processed_sheet in stack_list)) //It's the first of this sheet added
- var/obj/item/stack/sheet/s = new processed_sheet(src,0,merge=FALSE)
+ var/obj/item/stack/sheet/s
+ if(!stack_list[processed_sheet])
+ s = new processed_sheet(src, FALSE)
s.amount = 0
stack_list[processed_sheet] = s
- var/obj/item/stack/sheet/storage = stack_list[processed_sheet]
- storage.amount += sheet_per_ore //Stack the sheets
- O.loc = null //Let the old sheet...
+ s = stack_list[processed_sheet]
+ s.amount += sheet_per_ore //Stack the sheets
+ ore_buffer -= O
qdel(O) //... garbage collect
+/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
+ process_sheet(ore)
+
+/obj/machinery/mineral/ore_redemption/proc/send_console_message()
+ if(z != ZLEVEL_STATION || !LAZYLEN(stack_list))
+ return
+ message_sent = TRUE
+ var/area/A = get_area(src)
+ var/msg = "Now available in [A]:
"
+ for(var/s in stack_list)
+ var/obj/item/stack/sheet/sheet = stack_list[s]
+ msg += "[capitalize(sheet.name)]: [sheet.amount] sheets
"
+
+ for(var/obj/machinery/requests_console/D in allConsoles)
+ if(D.departmentType == 2) // temporary
+ D.createmessage("Ore Redemption Machine", "New minerals available!", msg, 1, 0)
+
/obj/machinery/mineral/ore_redemption/process()
- if(!panel_open && powered()) //If the machine is partially disassembled and/or depowered, it should not process minerals
- var/turf/T = get_step(src, input_dir)
- var/i = 0
- if(T)
- for(var/obj/item/weapon/ore/O in T)
- if (i >= ore_pickup_rate)
- break
- else if (!O || !O.refined_type)
- continue
- else
- process_sheet(O)
- i++
- else
- var/obj/structure/ore_box/B = locate() in T
- if(B)
- for(var/obj/item/weapon/ore/O in B.contents)
- if (i >= ore_pickup_rate)
- break
- else if (!O || !O.refined_type)
- continue
- else
- process_sheet(O)
- i++
- if(i > 0 && z == ZLEVEL_STATION)
- var/area/orm_area = get_area(src)
- var/msg = "Now available in [orm_area.map_name]:"
- for(var/s in stack_list) // Making an announcement for cargo
- var/obj/item/stack/sheet/mats = stack_list[s]
- msg += "\n[capitalize(mats.name)]: [mats.amount] sheets"
- for(var/obj/machinery/requests_console/D in allConsoles)
- if(D.department == "Science" || D.department == "Robotics" || D.department == "Research Director's Desk" || D.department == "Chemistry" || D.department == "Bar")
- D.createmessage("Ore Redemption Machine", "New minerals available!", msg, 1, 0)
+ if(panel_open || !powered())
+ return
+ var/atom/input = get_step(src, input_dir)
+ var/obj/structure/ore_box/OB = locate() in input
+ if(OB)
+ input = OB
+
+ for(var/obj/item/weapon/ore/O in input)
+ if(QDELETED(O))
+ continue
+ ore_buffer |= O
+ O.forceMove(src)
+ CHECK_TICK
+
+ if(LAZYLEN(ore_buffer))
+ message_sent = FALSE
+ process_ores(ore_buffer)
+ else if(!message_sent)
+ send_console_message()
/obj/machinery/mineral/ore_redemption/attackby(obj/item/weapon/W, mob/user, params)
- if (!powered())
+ if(exchange_parts(user, W))
+ return
+ if(default_pry_open(W))
+ return
+ if(default_unfasten_wrench(user, W))
+ return
+ if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
+ updateUsrDialog()
+ return
+ if(default_deconstruction_crowbar(W))
+ return
+
+ if(!powered())
return
if(istype(W,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = user.get_active_held_item()
@@ -110,33 +134,20 @@
inserted_id = I
interact(user)
return
+
if(istype(W, /obj/item/device/multitool) && panel_open)
input_dir = turn(input_dir, -90)
output_dir = turn(output_dir, -90)
to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].")
return
- if(exchange_parts(user, W))
- return
-
- if(default_pry_open(W))
- return
-
- if(default_unfasten_wrench(user, W))
- return
- if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
- updateUsrDialog()
- return
- if(default_deconstruction_crowbar(W))
- return
-
return ..()
/obj/machinery/mineral/ore_redemption/on_deconstruction()
empty_content()
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(obj/item/weapon/ore/O)
- if(O.refined_type)
+ if(O && O.refined_type)
var/obj/item/stack/sheet/M = O.refined_type
points += O.points * point_upgrade
return M
@@ -149,24 +160,19 @@
interact(user)
/obj/machinery/mineral/ore_redemption/interact(mob/user)
- var/obj/item/stack/sheet/s
- var/dat
+ var/dat = "This machine only accepts ore. Gibtonite and Slag are not accepted.
"
+ dat += "Current unclaimed points: [points]
"
- dat += text("This machine only accepts ore. Gibtonite and Slag are not accepted.
")
- dat += text("Current unclaimed points: [points]
")
-
- if(istype(inserted_id))
- dat += text("You have [inserted_id.mining_points] mining points collected. Eject ID.
")
- dat += text("Claim points.
")
+ if(inserted_id)
+ dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
"
+ dat += "Claim points.
"
else
- dat += text("No ID inserted. Insert ID.
")
+ dat += "No ID inserted. Insert ID.
"
for(var/O in stack_list)
- s = stack_list[O]
- if(s.amount > 0)
- if(O == stack_list[1])
- dat += "
" //just looks nicer
- dat += text("[capitalize(s.name)]: [s.amount] Release
")
+ var/obj/item/stack/sheet/s = stack_list[O]
+ if(s.amount)
+ dat += "[capitalize(s.name)]: [s.amount] Release
"
var/obj/item/stack/sheet/metalstack
if(/obj/item/stack/sheet/metal in stack_list)
@@ -181,10 +187,10 @@
titaniumstack = stack_list[/obj/item/stack/sheet/mineral/titanium]
if(metalstack && plasmastack && min(metalstack.amount, plasmastack.amount))
- dat += text("Plasteel Alloy (Metal + Plasma): Smelt
")
+ dat += "Plasteel Alloy (Metal + Plasma): Smelt
"
if(titaniumstack && plasmastack && min(titaniumstack.amount, plasmastack.amount))
- dat += text("Plastitanium Alloy (Titanium + Plasma): Smelt
")
- dat += text("