diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 58fc408d44..ccad12978b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -510,4 +510,17 @@ Class Procs: S.amount = round(materials[mat] / S.perunit) else qdel(S) //Prevents stacks smaller than 1 - return \ No newline at end of file + return + +/obj/machinery/proc/eject_material_of_type(var/incoming_material) //Used for autolathe, protolathe, mechfab, exofab. Stuff that takes materials, basically. + if(!LAZYLEN(materials[incoming_material])) + return + var/datum/material/M = get_material_by_name(incoming_material) + if(!istype(M)) + return + + while(materials[incoming_material] > M.perunit) + var/obj/item/stack/material/S = new M.stack_type(get_turf(src)) + S.amount = min(round(materials[incoming_material] / S.perunit), S.max_amount) + materials[incoming_material] -= (S.amount * S.perunit) + return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 3867b9afdb..c234b20f09 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -11,10 +11,14 @@ req_access = list(access_robotics) circuit = /obj/item/circuitboard/mechfab + var/list/href_data + var/topic_result + var/speed = 1 var/mat_efficiency = 1 materials = list(MAT_STEEL = 0, "glass" = 0, "plastic" = 0, MAT_GRAPHITE = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0) var/list/hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) + var/eject_lockout = FALSE var/res_max_amount = 200000 var/datum/research/files @@ -108,6 +112,7 @@ if(current) data["builtperc"] = round((progress / current.time) * 100) + href_data = data ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600) @@ -116,6 +121,7 @@ ui.set_auto_update(1) /obj/machinery/mecha_part_fabricator/Topic(href, href_list) + topic_result = href_list if(..()) return @@ -129,8 +135,8 @@ if(href_list["category"] in categories) category = href_list["category"] - if(href_list["eject"]) - eject_materials(href_list["eject"], text2num(href_list["amount"])) + if(href_list["eject"] && !eject_lockout) + eject_materials_partial(href_list["eject"], text2num(href_list["amount"])) if(href_list["sync"]) sync() @@ -301,3 +307,22 @@ files.RefreshResearch() sync_message = "Sync complete." update_categories() + +/obj/machinery/mecha_part_fabricator/proc/eject_materials_partial(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything + var/recursive = amount == -1 + var/matstring = lowertext(material) + var/datum/material/M = get_material_by_name(matstring) + if(recursive && materials[matstring] >= M.perunit) + eject_material_of_type(matstring) + return + + var/obj/item/stack/material/S = M.place_sheet(get_turf(src)) + if(amount <= 0) + amount = S.max_amount + var/ejected = min(round(materials[matstring] / S.perunit), amount) + S.amount = min(ejected, amount) + if(S.amount <= 0) + qdel(S) + return + materials[matstring] -= ejected * S.perunit + update_busy() diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index b6fe20b9aa..72cb78bbe2 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -15,6 +15,7 @@ var/mat_efficiency = 1 materials = list(MAT_STEEL = 0, "glass" = 0, "plastic" = 0, MAT_GRAPHITE = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0) var/list/hidden_materials = list(MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM) + var/eject_lockout = FALSE var/res_max_amount = 200000 var/datum/research/files @@ -144,8 +145,8 @@ if(href_list["manufacturer"] in all_robolimbs) manufacturer = href_list["manufacturer"] - if(href_list["eject"]) - eject_materials(href_list["eject"], text2num(href_list["amount"])) + if(href_list["eject"] && !eject_lockout) + eject_materials_partial(href_list["eject"], text2num(href_list["amount"])) if(href_list["sync"]) sync() @@ -339,3 +340,23 @@ files.RefreshResearch() sync_message = "Sync complete." update_categories() + +/obj/machinery/pros_fabricator/proc/eject_materials_partial(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything + var/recursive = amount == -1 ? 1 : 0 + var/matstring = lowertext(material) + var/datum/material/M = get_material_by_name(matstring) + + if(recursive && materials[matstring] >= M.perunit) + eject_material_of_type(matstring) + return + + var/obj/item/stack/material/S = M.place_sheet(get_turf(src)) + if(amount <= 0) + amount = S.max_amount + var/ejected = min(round(materials[matstring] / S.perunit), amount) + S.amount = min(ejected, amount) + if(S.amount <= 0) + qdel(S) + return + materials[matstring] -= ejected * S.perunit + update_busy() diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm index ba161b0cf5..31e6f52ce4 100644 --- a/code/modules/materials/materials/_materials.dm +++ b/code/modules/materials/materials/_materials.dm @@ -116,6 +116,8 @@ var/global/list/name_to_material var/radiation_resistance = 0 // Radiation resistance, which is added on top of a material's weight for blocking radiation. Needed to make lead special without superrobust weapons. var/supply_conversion_value // Supply points per sheet that this material sells for. + var/perunit = SHEET_MATERIAL_AMOUNT //How much stacks of translate from sheet to amount + // Placeholder vars for the time being, todo properly integrate windows/light tiles/rods. var/created_window var/created_fulltile_window diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index bc218c8125..8569c54165 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -88,4 +88,3 @@ {{/for}} -