diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 004ea378da..9524fc9a43 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -23,6 +23,7 @@
#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
#define BIOGENERATOR 32 //Uses biomass
#define LIMBGROWER 64 //Uses synthetic flesh
+#define SMELTER 128 //uses various minerals
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
//Modular computer/NTNet defines
diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm
index af227212a7..76de0329cd 100644
--- a/code/datums/material_container.dm
+++ b/code/datums/material_container.dm
@@ -136,7 +136,7 @@
return FALSE
//For spawning mineral sheets; internal use only
-/datum/material_container/proc/retrieve(sheet_amt, datum/material/M)
+/datum/material_container/proc/retrieve(sheet_amt, datum/material/M, target = null)
if(!M.sheet_type)
return 0
if(sheet_amt > 0)
@@ -149,26 +149,28 @@
use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id)
sheet_amt -= MAX_STACK_SIZE
if(round((sheet_amt * MINERAL_MATERIAL_AMOUNT) / MINERAL_MATERIAL_AMOUNT))
- new M.sheet_type(get_turf(owner), sheet_amt)
+ var/obj/item/stack/sheet/s = new M.sheet_type(get_turf(owner), sheet_amt)
+ if(target)
+ s.forceMove(target)
count += sheet_amt
use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id)
return count
return 0
-/datum/material_container/proc/retrieve_sheets(sheet_amt, id)
+/datum/material_container/proc/retrieve_sheets(sheet_amt, id, target = null)
if(materials[id])
- return retrieve(sheet_amt, materials[id])
+ return retrieve(sheet_amt, materials[id], target)
return 0
-/datum/material_container/proc/retrieve_amount(amt, id)
- return retrieve_sheets(amount2sheet(amt), id)
+/datum/material_container/proc/retrieve_amount(amt, id, target)
+ return retrieve_sheets(amount2sheet(amt), id, target)
-/datum/material_container/proc/retrieve_all()
+/datum/material_container/proc/retrieve_all(target = null)
var/result = 0
var/datum/material/M
for(var/MAT in materials)
M = materials[MAT]
- result += retrieve_sheets(amount2sheet(M.amount), MAT)
+ result += retrieve_sheets(amount2sheet(M.amount), MAT, target)
return result
/datum/material_container/proc/has_space(amt = 0)
diff --git a/code/modules/mining/machine_input_output_plates.dm b/code/modules/mining/machine_input_output_plates.dm
index a2e5e9ad3c..7e888217a1 100644
--- a/code/modules/mining/machine_input_output_plates.dm
+++ b/code/modules/mining/machine_input_output_plates.dm
@@ -25,7 +25,7 @@
var/output_dir = SOUTH
/obj/machinery/mineral/proc/unload_mineral(atom/movable/S)
- S.loc = loc
+ S.forceMove(loc)
var/turf/T = get_step(src,output_dir)
if(T)
- S.loc = T
\ No newline at end of file
+ S.forceMove(T)
\ No newline at end of file
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 8b4903259e..e62392a8c8 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -1,3 +1,5 @@
+#define SMELT_AMOUNT 10
+
/**********************Mineral processing unit console**************************/
/obj/machinery/mineral/processing_unit_console
@@ -10,182 +12,50 @@
var/machinedir = EAST
speed_process = 1
-/obj/machinery/mineral/processing_unit_console/New()
- ..()
- spawn(7)
- src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
- if (machine)
- machine.CONSOLE = src
- else
- qdel(src)
+/obj/machinery/mineral/processing_unit_console/Initialize()
+ . = ..()
+ machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
+ if (machine)
+ machine.CONSOLE = src
+ else
+ qdel(src)
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
- var/dat = "Smelter control console
"
- //iron
- if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine)
- if(machine.ore_iron)
- if (machine.selected_iron==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Iron: [machine.ore_iron]
"
- else
- machine.selected_iron = 0
-
- //sand - glass
- if(machine.ore_glass)
- if (machine.selected_glass==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Sand: [machine.ore_glass]
"
- else
- machine.selected_glass = 0
-
- //plasma
- if(machine.ore_plasma)
- if (machine.selected_plasma==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Plasma: [machine.ore_plasma]
"
- else
- machine.selected_plasma = 0
-
- //uranium
- if(machine.ore_uranium)
- if (machine.selected_uranium==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Uranium: [machine.ore_uranium]
"
- else
- machine.selected_uranium = 0
-
- //gold
- if(machine.ore_gold)
- if (machine.selected_gold==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Gold: [machine.ore_gold]
"
- else
- machine.selected_gold = 0
-
- //silver
- if(machine.ore_silver)
- if (machine.selected_silver==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Silver: [machine.ore_silver]
"
- else
- machine.selected_silver = 0
-
- //diamond
- if(machine.ore_diamond)
- if (machine.selected_diamond==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Diamond: [machine.ore_diamond]
"
- else
- machine.selected_diamond = 0
-
- //bananium
- if(machine.ore_clown)
- if (machine.selected_clown==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Bananium: [machine.ore_clown]
"
- else
- machine.selected_clown = 0
-
- //titanium
- if(machine.ore_titanium)
- if (machine.selected_titanium==1)
- dat += "Smelting "
- else
- dat += "Not smelting "
- dat += "Titanium: [machine.ore_titanium]
"
- else
- machine.selected_titanium = 0
-
-
- //On or off
- dat += text("Machine is currently ")
- if (machine.on==1)
- dat += text("On ")
- else
- dat += text("Off ")
- else
- dat+="---No Materials Loaded---"
-
-
- user << browse(dat, "window=console_processing_unit")
+ if(!machine)
+ return
+ var/dat = machine.get_machine_data()
+ var/datum/browser/popup = new(user, "processing", "Smelting Console", 300, 500)
+ popup.set_content(dat)
+ popup.open()
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
- src.add_fingerprint(usr)
- if(href_list["sel_iron"])
- if (href_list["sel_iron"] == "yes")
- machine.selected_iron = 1
- else
- machine.selected_iron = 0
- if(href_list["sel_glass"])
- if (href_list["sel_glass"] == "yes")
- machine.selected_glass = 1
- else
- machine.selected_glass = 0
- if(href_list["sel_plasma"])
- if (href_list["sel_plasma"] == "yes")
- machine.selected_plasma = 1
- else
- machine.selected_plasma = 0
- if(href_list["sel_uranium"])
- if (href_list["sel_uranium"] == "yes")
- machine.selected_uranium = 1
- else
- machine.selected_uranium = 0
- if(href_list["sel_gold"])
- if (href_list["sel_gold"] == "yes")
- machine.selected_gold = 1
- else
- machine.selected_gold = 0
- if(href_list["sel_silver"])
- if (href_list["sel_silver"] == "yes")
- machine.selected_silver = 1
- else
- machine.selected_silver = 0
- if(href_list["sel_diamond"])
- if (href_list["sel_diamond"] == "yes")
- machine.selected_diamond = 1
- else
- machine.selected_diamond = 0
- if(href_list["sel_clown"])
- if (href_list["sel_clown"] == "yes")
- machine.selected_clown = 1
- else
- machine.selected_clown = 0
- if(href_list["sel_titanium"])
- if (href_list["sel_titanium"] == "yes")
- machine.selected_titanium = 1
- else
- machine.selected_titanium = 0
+ add_fingerprint(usr)
+
+ if(href_list["material"])
+ machine.selected_material = href_list["material"]
+ machine.selected_alloy = null
+
+ if(href_list["alloy"])
+ machine.selected_material = null
+ machine.selected_alloy = href_list["alloy"]
+
if(href_list["set_on"])
- if (href_list["set_on"] == "on")
- machine.on = 1
- else
- machine.on = 0
- src.updateUsrDialog()
+ machine.on = (href_list["set_on"] == "on")
+
+ updateUsrDialog()
return
+/obj/machinery/mineral/processing_unit_console/Destroy()
+ machine = null
+ return ..()
+
+
/**********************Mineral processing unit**************************/
@@ -196,117 +66,84 @@
density = 1
anchored = 1
var/obj/machinery/mineral/CONSOLE = null
- var/ore_gold = 0;
- var/ore_silver = 0;
- var/ore_diamond = 0;
- var/ore_glass = 0;
- var/ore_plasma = 0;
- var/ore_uranium = 0;
- var/ore_iron = 0;
- var/ore_clown = 0;
- var/ore_adamantine = 0;
- var/ore_titanium = 0;
- var/selected_gold = 0
- var/selected_silver = 0
- var/selected_diamond = 0
- var/selected_glass = 0
- var/selected_plasma = 0
- var/selected_uranium = 0
- var/selected_iron = 0
- var/selected_clown = 0
- var/selected_titanium = 0
- var/on = 0 //0 = off, 1 =... oh you know!
+ var/datum/material_container/materials
+ var/on = FALSE
+ var/selected_material = MAT_METAL
+ var/selected_alloy = null
+ var/datum/research/files
+ var/list/categories = list("Alloys")
+/obj/machinery/mineral/processing_unit/Initialize()
+ . = ..()
+ proximity_monitor = new(src, 1)
+ materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY)
+ files = new /datum/research/smelter(src)
+
+/obj/machinery/mineral/processing_unit/Destroy()
+ CONSOLE = null
+ qdel(materials)
+ return ..()
+
+/obj/machinery/mineral/processing_unit/HasProximity(atom/movable/AM)
+ if(istype(AM, /obj/item/weapon/ore) && AM.loc == get_step(src, input_dir))
+ process_ore(AM)
+
+/obj/machinery/mineral/processing_unit/proc/process_ore(obj/item/weapon/ore/O)
+ var/material_amount = materials.get_item_material_amount(O)
+ if(!materials.has_space(material_amount))
+ unload_mineral(O)
+ else
+ materials.insert_item(O)
+ qdel(O)
+ if(CONSOLE)
+ CONSOLE.updateUsrDialog()
+
+/obj/machinery/mineral/processing_unit/proc/get_machine_data()
+ var/dat = "Smelter control console
"
+ for(var/mat_id in materials.materials)
+ var/datum/material/M = materials.materials[mat_id]
+ dat += "[M.name]: [M.amount] cm³"
+ if (selected_material == mat_id)
+ dat += " Smelting"
+ else
+ dat += " Not Smelting "
+ dat += "
"
+
+ dat += "
"
+ dat += "Smelt Alloys
"
+
+ for(var/v in files.known_designs)
+ var/datum/design/D = files.known_designs[v]
+ dat += "[D.name] "
+ if (selected_alloy == D.id)
+ dat += " Smelting"
+ else
+ dat += " Not Smelting "
+ dat += "
"
+
+ dat += "
"
+ //On or off
+ dat += "Machine is currently "
+ if (on)
+ dat += "On "
+ else
+ dat += "Off "
+
+ return dat
+
/obj/machinery/mineral/processing_unit/process()
- for(var/i in 1 to 10)
- if (on)
- if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_glass > 0)
- ore_glass--
- generate_mineral(/obj/item/stack/sheet/glass)
- else
- on = 0
- continue
- if (selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
- if (ore_glass > 0 && ore_iron > 0)
- ore_glass--
- ore_iron--
- generate_mineral(/obj/item/stack/sheet/rglass)
- else
- on = 0
- continue
- if (!selected_glass && selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_gold > 0)
- ore_gold--
- generate_mineral(/obj/item/stack/sheet/mineral/gold)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_silver > 0)
- ore_silver--
- generate_mineral(/obj/item/stack/sheet/mineral/silver)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_diamond > 0)
- ore_diamond--
- generate_mineral(/obj/item/stack/sheet/mineral/diamond)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_plasma > 0)
- ore_plasma--
- generate_mineral(/obj/item/stack/sheet/mineral/plasma)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && selected_uranium && !selected_iron && !selected_clown && !selected_titanium)
- if (ore_uranium > 0)
- ore_uranium--
- generate_mineral(/obj/item/stack/sheet/mineral/uranium)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
- if (ore_iron > 0)
- ore_iron--
- generate_mineral(/obj/item/stack/sheet/metal)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && selected_iron && !selected_clown && !selected_titanium)
- if (ore_iron > 0 && ore_plasma > 0)
- ore_iron--
- ore_plasma--
- generate_mineral(/obj/item/stack/sheet/plasteel)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && selected_clown && !selected_titanium)
- if (ore_clown > 0)
- ore_clown--
- generate_mineral(/obj/item/stack/sheet/mineral/bananium)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && !selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
- if (ore_titanium > 0)
- ore_titanium--
- generate_mineral(/obj/item/stack/sheet/mineral/titanium)
- else
- on = 0
- continue
- if (!selected_glass && !selected_gold && !selected_silver && !selected_diamond && selected_plasma && !selected_uranium && !selected_iron && !selected_clown && selected_titanium)
- if (ore_titanium > 0)
- ore_titanium--
- ore_plasma--
- generate_mineral(/obj/item/stack/sheet/mineral/plastitanium)
- else
- on = 0
- continue
+ if (on)
+ if(selected_material)
+ smelt_ore()
+
+ else if(selected_alloy)
+ smelt_alloy()
+
+
+ if(CONSOLE)
+ CONSOLE.updateUsrDialog()
+
+
//THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
//They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
//Even in the dark year of 2016, where /tg/ is dead, Urist still hasn't finished this -Bawhoppennn
@@ -327,104 +164,57 @@
on = 0
continue*/
-
- //if a non valid combination is selected
-
- var/b = 1 //this part checks if all required ores are available
-
- if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
- b = 0
-
- if (selected_gold == 1)
- if (ore_gold <= 0)
- b = 0
- if (selected_silver == 1)
- if (ore_silver <= 0)
- b = 0
- if (selected_diamond == 1)
- if (ore_diamond <= 0)
- b = 0
- if (selected_uranium == 1)
- if (ore_uranium <= 0)
- b = 0
- if (selected_plasma == 1)
- if (ore_plasma <= 0)
- b = 0
- if (selected_iron == 1)
- if (ore_iron <= 0)
- b = 0
- if (selected_glass == 1)
- if (ore_glass <= 0)
- b = 0
- if (selected_clown == 1)
- if (ore_clown <= 0)
- b = 0
-
- if (b) //if they are, deduct one from each, produce slag and shut the machine off
- if (selected_gold == 1)
- ore_gold--
- if (selected_silver == 1)
- ore_silver--
- if (selected_diamond == 1)
- ore_diamond--
- if (selected_uranium == 1)
- ore_uranium--
- if (selected_plasma == 1)
- ore_plasma--
- if (selected_iron == 1)
- ore_iron--
- if (selected_clown == 1)
- ore_clown--
- generate_mineral(/obj/item/weapon/ore/slag)
- on = 0
- else
- on = 0
- break
- break
- else
- break
- var/turf/T = get_step(src,input_dir)
- if(T)
- var/n = 0
- for(var/obj/item/O in T)
- n++
- if(n>10)
- break
- if (istype(O,/obj/item/weapon/ore/iron))
- ore_iron++;
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/glass))
- ore_glass++;
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/diamond))
- ore_diamond++;
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/plasma))
- ore_plasma++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/gold))
- ore_gold++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/silver))
- ore_silver++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/uranium))
- ore_uranium++
- O.loc = null
- continue
- if (istype(O,/obj/item/weapon/ore/bananium))
- ore_clown++
- O.loc = null
- continue
- unload_mineral(O)
-
+/obj/machinery/mineral/processing_unit/proc/smelt_ore()
+ var/datum/material/mat = materials.materials[selected_material]
+ if(mat)
+ var/sheets_to_remove = (mat.amount >= (MINERAL_MATERIAL_AMOUNT * SMELT_AMOUNT) ) ? SMELT_AMOUNT : round(mat.amount / MINERAL_MATERIAL_AMOUNT)
+ if(!sheets_to_remove)
+ on = FALSE
+ else
+ var/out = get_step(src, output_dir)
+ materials.retrieve_sheets(sheets_to_remove, selected_material, out)
+
+
+/obj/machinery/mineral/processing_unit/proc/smelt_alloy()
+ var/datum/design/alloy = files.FindDesignByID(selected_alloy) //check if it's a valid design
+ if(!alloy)
+ on = FALSE
+ return
+
+ var/amount = can_smelt(alloy)
+
+ if(!amount)
+ on = FALSE
+ return
+
+ materials.use_amount(alloy.materials, amount)
+
+ generate_mineral(alloy.build_path)
+
+/obj/machinery/mineral/processing_unit/proc/can_smelt(datum/design/D)
+ if(D.make_reagents.len)
+ return 0
+
+ var/build_amount = SMELT_AMOUNT
+
+
+ for(var/mat_id in D.materials)
+ var/M = D.materials[mat_id]
+ var/datum/material/smelter_mat = materials.materials[mat_id]
+
+ if(!M || !smelter_mat)
+ return 0
+
+ build_amount = min(build_amount, round(smelter_mat.amount / M))
+
+ return build_amount
/obj/machinery/mineral/processing_unit/proc/generate_mineral(P)
var/O = new P(src)
unload_mineral(O)
+
+/obj/machinery/mineral/processing_unit/on_deconstruction()
+ materials.retrieve_all()
+ ..()
+
+#undef SMELT_AMOUNT
\ No newline at end of file
diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm
new file mode 100644
index 0000000000..2672e0e27a
--- /dev/null
+++ b/code/modules/research/designs/smelting_designs.dm
@@ -0,0 +1,18 @@
+///////SMELTABLE ALLOYS///////
+
+/datum/design/plasteel_alloy
+ name = "Plasma + Iron alloy"
+ id = "plasteel"
+ build_type = SMELTER
+ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
+ build_path = /obj/item/stack/sheet/plasteel
+ category = list("initial","Alloys")
+
+
+/datum/design/plastitanium_alloy
+ name = "Plasma + Titanium alloy"
+ id = "plastitanium"
+ build_type = SMELTER
+ materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
+ build_path = /obj/item/stack/sheet/mineral/plastitanium
+ category = list("initial","Alloys")
\ No newline at end of file
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index deb8d34ffc..674825b9f7 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -175,6 +175,21 @@ research holder datum.
return
..()
+//Smelter files
+/datum/research/smelter/New()
+ for(var/T in (subtypesof(/datum/tech)))
+ possible_tech += new T(src)
+ for(var/path in subtypesof(/datum/design))
+ var/datum/design/D = new path(src)
+ possible_designs += D
+ if((D.build_type & SMELTER) && ("initial" in D.category))
+ AddDesign2Known(D)
+
+/datum/research/biogenerator/AddDesign2Known(datum/design/D)
+ if(!(D.build_type & SMELTER))
+ return
+ ..()
+
/***************************************************************
** Technology Datums **
diff --git a/tgstation.dme b/tgstation.dme
index 16f0eb45e7..3b53fa152d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1994,6 +1994,7 @@
#include "code\modules\research\designs\mechfabricator_designs.dm"
#include "code\modules\research\designs\medical_designs.dm"
#include "code\modules\research\designs\power_designs.dm"
+#include "code\modules\research\designs\smelting_designs.dm"
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"