Files
Aurora.3/code/modules/mining/machine_processing.dm
Matt Atlas 99b4033ca5 Aurora 2: The 3/4thening (#17186)
* after dark

* FIXES

* breakin

* butt

* Update code/game/objects/items/devices/floor_painter.dm

Co-authored-by: Cody Brittain <cbrittain10@yahoo.com>

* Update code/game/objects/items/devices/floor_painter.dm

Co-authored-by: Cody Brittain <cbrittain10@yahoo.com>

* Update code/game/objects/structures/lattice.dm

Co-authored-by: Cody Brittain <cbrittain10@yahoo.com>

* testing 1

* a

* FUCK THIS PRESET!!!

* allah

* OTEMACHI

* tis' done

* Project Exorcism : Sneed's Snairs (Formerly Chuck's)

* Update code/game/objects/structures/stool_bed_chair_nest/chairs.dm

* Update code/game/objects/structures/stool_bed_chair_nest/chairs.dm

* Update stools.dm

* Update code/game/objects/structures/stool_bed_chair_nest/stools.dm

* Update code/game/objects/structures/stool_bed_chair_nest/stools.dm

* Update stools.dm

* Update chairs.dm

* Update code/game/objects/structures/stool_bed_chair_nest/chairs.dm

* inhand fixes

* airlocks (matt has cooked)

fuck

* my cody plays the mamba

* fuck

* fixes layering issue

* airlocks and everything else Please fucking kill me

* underlays

* unfuck blending

* finished replacing old ass shit

* your ass is geass

* conflicts die now

* public fat'wa

* progress on walls and windows

* more mapping

* baltimore accents be like

* minor progress

* monitors

* fire alarms and apc adjustments

* apcs pixel adjustments, final airlock look

* also grilles

* shuttle wall start plus shuttle windows

* starting consoles

* table outlines

* I love broke ass sprites

* fixing the stupid ass exterior walls

* light fuckery

* terminal directionals, external airlocks, table fixes, blahblahblah

* fix 1

* fix 2

* some more fixes

* fix chairs

* basic untested railings and updating colors from atteria

* bridge and some fixes

* removing some artifacts on the new walls

* breaking wood tables and adding 4 wall materials

* fix

* compile & wood fixes

* make the horizon compile again

* railings, firedoors, ATMs, intercomms and tables again

* mapping begins also some tweaks to map view of icons

* full tile steel walls

* i sure hope nothing bad happens

* airlock updates (untested)

* reverts most wall machinery

* skull

* wall coloring

* makes the tg wood chill out

* work on airlocks

* hull consistency

* cause you live forever in the lights you make

* whoops can't show that in a christian manga

* terminals should be on walls and everything's hunky dory now

also i changed the wood stuff as per atteria's suggestion

* fixing airlocks

* fixes

* window resprite, coloring adjustments

* scc hull resprite

* new grilles, frame edits, and borosilicate

* greyscale wood palette improvement

* shuttle windows

* window frame fix

* apc update

* refit and reshaded fire alarms

* mapping icon fixes

* table fixes

* map fixes, platforms and stairs

* updates cutter, new walls and terminals

* mapping fixes

* fix preview

* preview fix stone

* stairs

* initial work for the map

* railing and windowpane fuckery

* new external airlocks

* a

* fix the maps in preparation

* wall object pixel offsets

* air alarms D1

* extinguisher cabinets

* APC DESTROYED MISSION ACCOMPLISHED GOOD WORK

* deck 3: floor decals, APCs, air alarms, fire extinguisher cabinets

* deck 3: fireaxe cabinet

* /shuttle_landmark/distress/blue, move base_turf from map to obj def

* intercom presets

* formatting

* deck 1: floor decals

* deck 2: named area fix (LMAO), signs to use single quotes

* deck 2: floor decals, APCs, air alarms, fire extinguisher cabinets, fireaxe cabinets

* Platforms and stairs!

* grates and bugfixes

* Angled ship walls + grate color fix

* corrects apc anim overlay

* deck 2 and away site fixes

# Conflicts:
#	maps/sccv_horizon/sccv_horizon-2_deck_2.dmm

* deck 2 missing grate

* warning stripes

* railings and ledges

* windows and fixtures

* windoorsagain

* airlocks pt1

* windows de-seamed and transparent

* airlocks and pixel offsets

* fixes for airlocks

* more airlock fixes

* presets for ringer, request console and newscaster

* 132

* asfsaf

* kitchen tiling

* thicker freezer tile bevels

* More angled walls

* New shutters and blast doors

* directional corrections

* ops railing fixes

* updated window map things and shutters

* value changes and blast door changes

* Ledges and platforms galore (D2/D3)

* all decks: fix door dirs

* all decks: newscasters, intercoms, requests consoles, ringer consoles

* helm light blue decals to dark blue

* supermatter door dir fix

* fix directional presets (dirs/offsets): newscaster, intercom, requests console, ringer console

* firedoor changes

* deck 3: overlapping wall mountables fixes

* map changes

* airlock changes

* map tweaks

* airlock & stair icons

* various mapping modifications

* Double airlocks + fixing denied states + fixing airlocks on all levels

* Rebase

* directional terminals buttons and lights again, platform tweaks

terminal north facing sprites, atm/food terminal directionals
proper door control and lightswitch directionals (presets still need to be set up, mapping)
re-adds new light tube sprites, again
new sprites for floor lights and the other stuff that got added
adjusted platforms to be recolorable, added light and dark versions, fixed some shading

* missing ERT outfit thingy fix

* floor lights fixed

* deck 3: various small fixes

* deck 1: various small fixes

* deck 2: various small fixes

* fixes

* d2 fixes & multitile door fix

* d2 fixes, remove unused airlock files, button icon fixes, window icon fixes

* make it actually compile, oops!

* make it actually compile, pt2

* CE office camera

* pew pew pew

* pew pew pew 2

* fixes

* deck 3: buttons fixes

* deck 3: button and other fixes

* deck 3: fixes and stuff

* D1 fixes & skrell airlocks

* minor D2 tweaks

* a lot of airlock-related fixes, glass tables, paint sprayer fixes, decal fixes, changelog

* maintenance hatch sprites

* fixing double doors

* flips multi-tiles, fixes multi-tiles, adds desk windoors

* new plastic flaps

* deck 2: a few buttons

* side + middle doors

* created paths for 3-tiles doors

* apply to map the 3 tiles airlocks

* some fixes, windoor alpha

* remove this random ass potted plant

* more map fixes

* holodeck disposal pipe fix

* secure airlock sprites

no code or obj definitions yet

* vault airlock

* vault door fixes

* scc window alpha

* adjusts double door glass, firedoor open state

* adjusts construction states for doors

* remove some defunct icons and fix anims

* assembly stuff

* pharma fixes

* vault door dir

* firedoor smart generation moved to its own proc

* lift doors, d1 fixes

* firedoor smart generation: adjacent wall check

* firedoor smart generation: adjacent firedoor check

* all decks: missing firedoor and other fixes

* deck 2: weird maint stairs fix

* oops

* diona airlock fix

* the shuttle wall gigadeath

* fixes

* some fixes for leftover map item paths, and double lattices

* new diona walls

* more fixes

* and more

* deck 1: fix out of bounds keys

* deck 3: fix out of bounds keys

* runtime 3: duplicate APCs fix

* all decks: make all 3 tile wide doors glass

---------

Co-authored-by: Wezzy <wowzewow@gmail.com>
Co-authored-by: Wowzewow (Wezzy) <42310821+alsoandanswer@users.noreply.github.com>
Co-authored-by: Cody Brittain <cbrittain10@yahoo.com>
Co-authored-by: kyres1 <noodle.buster31@gmail.com>
Co-authored-by: Matt Atlas <liermattia@gmail.com>
Co-authored-by: atteria <tarkona@protonmail.com>
Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>
Co-authored-by: DreamySkrell <107256943+DreamySkrell@users.noreply.github.com>
Co-authored-by: naut <nautilussplat@gmail.com>
Co-authored-by: naut <55491249+nauticall@users.noreply.github.com>
2023-08-30 21:18:10 +00:00

522 lines
16 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 = FALSE
var/points = 0
var/datum/weakref/scanned_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
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(!scanned_id)
get_user_id(user)
else
var/obj/item/card/id/ID = scanned_id.resolve()
if(!ID)
scanned_id = null
get_user_id(user)
else
var/turf/id_turf = get_turf(ID)
if(!id_turf.Adjacent(loc))
scanned_id = null
get_user_id(user)
interact(user)
/obj/machinery/mineral/processing_unit_console/proc/get_user_id(var/mob/user)
if(isDrone(user))
var/mob/living/silicon/robot/drone/D = user
if(D.standard_drone)
return
if(!scanned_id)
var/obj/item/card/id/ID = user.GetIdCard()
if(ID)
scanned_id = WEAKREF(ID)
/obj/machinery/mineral/processing_unit_console/interact(mob/user)
if(..())
return
if(!setup_machine(user))
return
user.set_machine(src)
var/dat = "<h1>Ore processor console</h1>"
dat += "Current unclaimed points: [points]<br>"
var/obj/item/card/id/ID = scanned_id.resolve()
if(ID)
dat += "You have [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"])
var/obj/item/card/id/ID = scanned_id.resolve()
if(ID)
if(href_list["choice"] == "eject")
scanned_id = null
if(href_list["choice"] == "claim")
if(access_mining_station in ID.access)
if(points >= 0)
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 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))
scanned_id = WEAKREF(I)
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)
var/obj/item/card/id/ID = scanned_id.resolve()
if(!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(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