diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index d2efee687f0..8d04aad16e4 100644
--- a/code/__defines/chemistry.dm
+++ b/code/__defines/chemistry.dm
@@ -42,7 +42,10 @@
#define CE_DARKSIGHT "darksight" // Gives perfect vision in dark
#define REAGENTS_PER_SHEET 20
+#define REAGENTS_PER_ROD 10
#define REAGENTS_PER_ORE 20
+#define REAGENTS_PER_LOG 40
+#define REAGENTS_PER_HULL 40
// Attached to CE_ANTIBIOTIC
#define ANTIBIO_NORM 1
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index fc2c3e5058e..e95e4c9b543 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -1430,36 +1430,64 @@ GLOBAL_LIST_INIT(shieldgen_blockedturfs, list(
GLOBAL_LIST_INIT(sheet_reagents, list( //have a number of reagents divisible by REAGENTS_PER_SHEET (default 20) unless you like decimals.
/obj/item/stack/material/plastic = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_OXYGEN,REAGENT_ID_CHLORINE,REAGENT_ID_SULFUR),
/obj/item/stack/material/copper = list(REAGENT_ID_COPPER),
- /obj/item/stack/material/wood = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
- /obj/item/stack/material/stick = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
- /obj/item/stack/material/log = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
- /obj/item/stack/material/algae = list(REAGENT_ID_CARBON,REAGENT_ID_NITROGEN,REAGENT_ID_NITROGEN,REAGENT_ID_PHOSPHORUS,REAGENT_ID_PHOSPHORUS),
/obj/item/stack/material/graphite = list(REAGENT_ID_CARBON),
- /obj/item/stack/material/aluminium = list(REAGENT_ID_ALUMINIUM), // The material is aluminium, but the reagent is aluminum...
- /obj/item/stack/material/glass/reinforced = list(REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_IRON,REAGENT_ID_CARBON),
- /obj/item/stack/material/leather = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PROTEIN,REAGENT_ID_PROTEIN,REAGENT_ID_TRIGLYCERIDE),
- /obj/item/stack/material/cloth = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PROTEIN,REAGENT_ID_SODIUM),
- /obj/item/stack/material/fiber = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PROTEIN,REAGENT_ID_SODIUM),
- /obj/item/stack/material/fur = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_SULFUR,REAGENT_ID_SODIUM),
- /obj/item/stack/material/deuterium = list(REAGENT_ID_HYDROGEN),
- /obj/item/stack/material/glass/phoronrglass = list(REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_PHORON,REAGENT_ID_PHORON),
+ /obj/item/stack/material/aluminium = list(REAGENT_ID_ALUMINIUM),
/obj/item/stack/material/diamond = list(REAGENT_ID_CARBON),
/obj/item/stack/material/durasteel = list(REAGENT_ID_IRON,REAGENT_ID_IRON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PLATINUM),
/obj/item/stack/material/wax = list(REAGENT_ID_ETHANOL,REAGENT_ID_TRIGLYCERIDE),
/obj/item/stack/material/iron = list(REAGENT_ID_IRON),
- /obj/item/stack/material/uranium = list(REAGENT_ID_URANIUM),
/obj/item/stack/material/phoron = list(REAGENT_ID_PHORON),
/obj/item/stack/material/gold = list(REAGENT_ID_GOLD),
/obj/item/stack/material/silver = list(REAGENT_ID_SILVER),
/obj/item/stack/material/platinum = list(REAGENT_ID_PLATINUM),
- /obj/item/stack/material/mhydrogen = list(REAGENT_ID_HYDROGEN),
+ /obj/item/stack/material/osmium = list(REAGENT_ID_PLATINUM), // This should be fixed someday
/obj/item/stack/material/steel = list(REAGENT_ID_IRON, REAGENT_ID_CARBON),
/obj/item/stack/material/plasteel = list(REAGENT_ID_IRON, REAGENT_ID_IRON, REAGENT_ID_CARBON, REAGENT_ID_CARBON, REAGENT_ID_PLATINUM), //8 iron, 8 carbon, 4 platinum,
- /obj/item/stack/material/snow = list(REAGENT_ID_WATER),
/obj/item/stack/material/sandstone = list(REAGENT_ID_SILICON, REAGENT_ID_OXYGEN),
+ /obj/item/stack/material/marble = list(REAGENT_ID_CALCIUM),
+ /obj/item/stack/material/titanium = list(REAGENT_ID_ALUMINIUM),
+ // Nuclear
+ /obj/item/stack/material/mhydrogen = list(REAGENT_ID_HYDROGEN),
+ /obj/item/stack/material/deuterium = list(REAGENT_ID_HYDROGEN),
+ /obj/item/stack/material/tritium = list(REAGENT_ID_HYDROGEN),
+ /obj/item/stack/material/uranium = list(REAGENT_ID_URANIUM),
+ /obj/item/stack/material/supermatter = list(REAGENT_ID_SUPERMATTER),
+ // Misc
+ /obj/item/stack/material/snow = list(REAGENT_ID_WATER,REAGENT_ID_ICE),
+ /obj/item/stack/tile/grass = list(REAGENT_ID_CARBON,REAGENT_ID_NITROGEN,REAGENT_ID_NITROGEN,REAGENT_ID_PHOSPHORUS,REAGENT_ID_PHOSPHORUS),
+ /obj/item/stack/material/leather = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PROTEIN,REAGENT_ID_PROTEIN,REAGENT_ID_TRIGLYCERIDE),
+ /obj/item/stack/material/cloth = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PROTEIN,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/fiber = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PROTEIN,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/fur = list(REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_SULFUR,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/algae = list(REAGENT_ID_CARBON,REAGENT_ID_NITROGEN,REAGENT_ID_NITROGEN,REAGENT_ID_PHOSPHORUS,REAGENT_ID_PHOSPHORUS),
+ /obj/item/stack/material/algae/ten = list(REAGENT_ID_CARBON,REAGENT_ID_NITROGEN,REAGENT_ID_NITROGEN,REAGENT_ID_PHOSPHORUS,REAGENT_ID_PHOSPHORUS), // Just spawns with 10, is the same as normal one
+ /obj/item/stack/material/concrete = list(REAGENT_ID_SILICATE, REAGENT_ID_CALCIUM),
+ /obj/item/stack/material/cardboard = list(REAGENT_ID_WOODPULP),
+ // Woods
+ /obj/item/stack/material/wood = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/wood/sif = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/wood/hard = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
+ // Hull
+ /obj/item/stack/material/steel/hull = list(REAGENT_ID_IRON, REAGENT_ID_CARBON),
+ /obj/item/stack/material/plasteel/hull = list(REAGENT_ID_IRON, REAGENT_ID_IRON, REAGENT_ID_CARBON, REAGENT_ID_CARBON, REAGENT_ID_PLATINUM),
+ /obj/item/stack/material/plastitanium/hull = list(REAGENT_ID_TITANIUM, REAGENT_ID_SILICON, REAGENT_ID_IRON, REAGENT_ID_CARBON, REAGENT_ID_PLATINUM),
+ /obj/item/stack/material/durasteel/hull = list(REAGENT_ID_IRON,REAGENT_ID_IRON,REAGENT_ID_CARBON,REAGENT_ID_CARBON,REAGENT_ID_PLATINUM),
+ // Glass
/obj/item/stack/material/glass = list(REAGENT_ID_SILICON),
+ /obj/item/stack/material/glass/reinforced = list(REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_IRON,REAGENT_ID_CARBON),
/obj/item/stack/material/glass/phoronglass = list(REAGENT_ID_PLATINUM, REAGENT_ID_SILICON, REAGENT_ID_SILICON, REAGENT_ID_SILICON), //5 platinum, 15 silicon,
- /obj/item/stack/material/supermatter = list(REAGENT_ID_SUPERMATTER)
+ /obj/item/stack/material/glass/phoronrglass = list(REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_PHORON,REAGENT_ID_PHORON),
+ /obj/item/stack/material/glass/titanium = list(REAGENT_ID_TITANIUM, REAGENT_ID_SILICON),
+ /obj/item/stack/material/glass/plastitanium = list(REAGENT_ID_TITANIUM, REAGENT_ID_SILICON, REAGENT_ID_IRON, REAGENT_ID_CARBON, REAGENT_ID_PLATINUM),
+ // Rods
+ /obj/item/stack/rods = list(REAGENT_ID_IRON, REAGENT_ID_CARBON), // 2 per sheet of steel
+ /obj/item/stack/material/plasteel/rebar = list(REAGENT_ID_IRON, REAGENT_ID_IRON, REAGENT_ID_CARBON, REAGENT_ID_CARBON, REAGENT_ID_PLATINUM), // Only makes 1 per sheet of plasteel!
+ // Logs
+ /obj/item/stack/material/stick = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/stick/fivestack = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM), // Just spawns with 5, same as normal one
+ /obj/item/stack/material/log = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/log/hard = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
+ /obj/item/stack/material/log/sif = list(REAGENT_ID_CARBON,REAGENT_ID_WOODPULP,REAGENT_ID_NITROGEN,REAGENT_ID_POTASSIUM,REAGENT_ID_SODIUM),
))
GLOBAL_LIST_INIT(ore_reagents, list( //have a number of reageents divisible by REAGENTS_PER_ORE (default 20) unless you like decimals.
@@ -1515,6 +1543,23 @@ GLOBAL_LIST_INIT(reagent_sheets,list( // Recompressing reagents back into sheets
REAGENT_ID_SPIDEREGG = REFINERY_SINTERING_SPIDERS,
))
+GLOBAL_LIST_INIT(deepore_fracking_reagents,list( // Fracking results for fluid pump
+ ORE_HEMATITE = list(REAGENT_ID_SILICATE,REAGENT_ID_IRON,REAGENT_ID_CARBON),
+ ORE_URANIUM = list(REAGENT_ID_RADIUM,REAGENT_ID_RADIUM,REAGENT_ID_CALCIUM,REAGENT_ID_PHOSPHORUS), // Doesn't produce uranium due to low use in reagents, and emp reaction
+ ORE_COPPER = list(REAGENT_ID_GOLD,REAGENT_ID_COPPER,REAGENT_ID_LEAD), // Commonly
+ ORE_GOLD = list(REAGENT_ID_GOLD,REAGENT_ID_COPPER,REAGENT_ID_LEAD), // Found
+ ORE_TIN = list(REAGENT_ID_GOLD,REAGENT_ID_COPPER,REAGENT_ID_LEAD), // Together
+ ORE_SILVER = list(REAGENT_ID_SILVER,REAGENT_ID_LEAD,REAGENT_ID_COPPER), // lead loves this one too
+ ORE_DIAMOND = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_PHOSPHORUS,REAGENT_ID_SULFUR,REAGENT_ID_CARBON), // Ignius process
+ ORE_PHORON = list(REAGENT_ID_PHORON,REAGENT_ID_RADIUM,REAGENT_ID_PHOSPHORUS,REAGENT_ID_SULFUR), // Ignius heavymetals?
+ ORE_PLATINUM = list(REAGENT_ID_PLATINUM,REAGENT_ID_COPPER), // Don't have much to group it with
+ ORE_MHYDROGEN = list(REAGENT_ID_SILICATE,REAGENT_ID_HYDROGEN),
+ ORE_SAND = list(REAGENT_ID_SILICATE,REAGENT_ID_SILICON,REAGENT_ID_LITHIUM,REAGENT_ID_PHOSPHORUS,REAGENT_ID_CALCIUM,REAGENT_ID_SODIUMCHLORIDE,REAGENT_ID_CARBON), // Catch all sedimentry
+ ORE_CARBON = list(REAGENT_ID_SILICATE,REAGENT_ID_CARBON,REAGENT_ID_SODIUMCHLORIDE), // Salty coal
+ ORE_BAUXITE = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_ALUMINIUM,REAGENT_ID_SODIUMCHLORIDE), // ore's general components and neighbours
+ ORE_RUTILE = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_SILICATE,REAGENT_ID_SILICON,REAGENT_ID_SODIUMCHLORIDE) // ore's general components and neighbours
+ ))
+
//List of the ammo types that can be used in game.
GLOBAL_LIST_INIT(global_ammo_types, list(
/obj/item/ammo_casing/a357 = ".357",
diff --git a/code/_helpers/refinery.dm b/code/_helpers/refinery.dm
index 7d93b9190ea..e53c361d662 100644
--- a/code/_helpers/refinery.dm
+++ b/code/_helpers/refinery.dm
@@ -11,7 +11,9 @@
var/obj/item/stack/stack = O
if(istype(stack))
var/list/sheet_components = GLOB.sheet_reagents[stack.type]
- var/amount_to_take = max(0,min(stack.get_amount(),round(remaining_volume/REAGENTS_PER_SHEET)))
+ // Some stacks can be made into other stacks with a multiplier. This handles that.
+ var/remove_amount = stack.reagents_per_sheet()
+ var/amount_to_take = max(0,min(stack.get_amount(),round(remaining_volume/remove_amount)))
if(amount_to_take)
stack.use(amount_to_take)
if(QDELETED(stack))
@@ -19,9 +21,9 @@
if(islist(sheet_components))
amount_to_take = (amount_to_take/(sheet_components.len))
for(var/i in sheet_components)
- R.add_reagent(i, (amount_to_take*REAGENTS_PER_SHEET))
+ R.add_reagent(i, (amount_to_take*remove_amount))
else
- R.add_reagent(sheet_components, (amount_to_take*REAGENTS_PER_SHEET))
+ R.add_reagent(sheet_components, (amount_to_take*remove_amount))
continue
else if(GLOB.ore_reagents[O.type])
diff --git a/code/game/objects/items/devices/scanners/reagents.dm b/code/game/objects/items/devices/scanners/reagents.dm
index fd20f9f9a90..6fa54a707c2 100644
--- a/code/game/objects/items/devices/scanners/reagents.dm
+++ b/code/game/objects/items/devices/scanners/reagents.dm
@@ -24,7 +24,7 @@
return
if(!isnull(O.reagents))
- if(!(O.flags & OPENCONTAINER)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors.
+ if(!(O.flags & OPENCONTAINER) && !istype(O,/obj/machinery/reagent_refinery)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors. Reagent refinery has ports for convenient testing!
to_chat(user, span_warning("\The [O] is sealed, and cannot be scanned by \the [src] until unsealed."))
return
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 216e6cdc586..48d5b2e10b6 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -460,6 +460,9 @@
if(pulledby && isturf(loc))
combine_in_loc()
+/obj/item/stack/proc/reagents_per_sheet()
+ return REAGENTS_PER_SHEET // units total of reagents when grinded
+
/*
* Recipe datum
*/
diff --git a/code/game/turfs/flooring/gas_cracks.dm b/code/game/turfs/flooring/gas_cracks.dm
index 2adbf8728c8..fe05bdbb4ec 100644
--- a/code/game/turfs/flooring/gas_cracks.dm
+++ b/code/game/turfs/flooring/gas_cracks.dm
@@ -23,24 +23,6 @@
oxygen = 0
nitrogen = 0
- // Fracking results for fluid pump
- var/static/list/ore_types = list(
- ORE_HEMATITE = list(REAGENT_ID_SILICATE,REAGENT_ID_IRON,REAGENT_ID_CARBON),
- ORE_URANIUM = list(REAGENT_ID_RADIUM,REAGENT_ID_RADIUM,REAGENT_ID_CALCIUM,REAGENT_ID_PHOSPHORUS), // Doesn't produce uranium due to low use in reagents, and emp reaction
- ORE_COPPER = list(REAGENT_ID_GOLD,REAGENT_ID_COPPER,REAGENT_ID_LEAD), // Commonly
- ORE_GOLD = list(REAGENT_ID_GOLD,REAGENT_ID_COPPER,REAGENT_ID_LEAD), // Found
- ORE_TIN = list(REAGENT_ID_GOLD,REAGENT_ID_COPPER,REAGENT_ID_LEAD), // Together
- ORE_SILVER = list(REAGENT_ID_SILVER,REAGENT_ID_LEAD,REAGENT_ID_COPPER), // lead loves this one too
- ORE_DIAMOND = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_PHOSPHORUS,REAGENT_ID_SULFUR,REAGENT_ID_CARBON), // Ignius process
- ORE_PHORON = list(REAGENT_ID_PHORON,REAGENT_ID_RADIUM,REAGENT_ID_PHOSPHORUS,REAGENT_ID_SULFUR), // Ignius heavymetals?
- ORE_PLATINUM = list(REAGENT_ID_PLATINUM,REAGENT_ID_COPPER), // Don't have much to group it with
- ORE_MHYDROGEN = list(REAGENT_ID_SILICATE,REAGENT_ID_HYDROGEN),
- ORE_SAND = list(REAGENT_ID_SILICATE,REAGENT_ID_SILICON,REAGENT_ID_LITHIUM,REAGENT_ID_PHOSPHORUS,REAGENT_ID_CALCIUM,REAGENT_ID_SODIUMCHLORIDE,REAGENT_ID_CARBON), // Catch all sedimentry
- ORE_CARBON = list(REAGENT_ID_SILICATE,REAGENT_ID_CARBON,REAGENT_ID_SODIUMCHLORIDE), // Salty coal
- ORE_BAUXITE = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_ALUMINIUM,REAGENT_ID_SODIUMCHLORIDE), // ore's general components and neighbours
- ORE_RUTILE = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_SILICATE,REAGENT_ID_SILICON,REAGENT_ID_SODIUMCHLORIDE) // ore's general components and neighbours
- )
-
/turf/simulated/floor/gas_crack/pump_reagents(var/datum/reagents/R, var/volume)
// pick random turfs in range, then use their deep ores to get some extra reagents
var/i = 0
@@ -48,15 +30,16 @@
var/turf/simulated/mineral/M = pick(orange(5,src))
if(!istype(M))
return
- for(var/metal in ore_types)
+ for(var/metal in GLOB.deepore_fracking_reagents)
if(!M.resources[metal])
- return
- var/list/ore_list = ore_types[metal]
+ continue
+ var/list/ore_list = GLOB.deepore_fracking_reagents[metal]
if(!ore_list || !ore_list.len)
- return
+ continue
if(prob(60))
var/reagent_id = pick(ore_list)
- R.add_reagent(reagent_id, round(volume, 0.1))
+ if(reagent_id)
+ R.add_reagent(reagent_id, round(volume, 0.1))
/turf/simulated/floor/gas_crack/oxygen
diff --git a/code/modules/materials/sheets/metals/hull.dm b/code/modules/materials/sheets/metals/hull.dm
index d0f0d6fa1ca..cc1d56d3f17 100644
--- a/code/modules/materials/sheets/metals/hull.dm
+++ b/code/modules/materials/sheets/metals/hull.dm
@@ -2,18 +2,33 @@
name = MAT_STEELHULL
default_type = MAT_STEELHULL
+/obj/item/stack/material/steel/hull/reagents_per_sheet()
+ return REAGENTS_PER_HULL
+
/obj/item/stack/material/plasteel/hull
name = MAT_PLASTEELHULL
default_type = MAT_PLASTEELHULL
+/obj/item/stack/material/plasteel/hull/reagents_per_sheet()
+ return REAGENTS_PER_HULL
+
/obj/item/stack/material/durasteel/hull
name = MAT_DURASTEELHULL
default_type = MAT_DURASTEELHULL
+/obj/item/stack/material/durasteel/hull/reagents_per_sheet()
+ return REAGENTS_PER_HULL
+
/obj/item/stack/material/titanium/hull
name = MAT_TITANIUMHULL
default_type = MAT_TITANIUMHULL
+/obj/item/stack/material/titanium/hull/reagents_per_sheet()
+ return REAGENTS_PER_HULL
+
/obj/item/stack/material/morphium/hull
name = MAT_MORPHIUMHULL
default_type = MAT_MORPHIUMHULL
+
+/obj/item/stack/material/morphium/hull/reagents_per_sheet()
+ return REAGENTS_PER_HULL
diff --git a/code/modules/materials/sheets/metals/rods.dm b/code/modules/materials/sheets/metals/rods.dm
index 892bb3da019..f36295ff40b 100644
--- a/code/modules/materials/sheets/metals/rods.dm
+++ b/code/modules/materials/sheets/metals/rods.dm
@@ -70,6 +70,9 @@
..()
+/obj/item/stack/rods/reagents_per_sheet()
+ return REAGENTS_PER_ROD
+
/*
/obj/item/stack/rods/attack_self(mob/user)
src.add_fingerprint(user)
diff --git a/code/modules/materials/sheets/organic/wood.dm b/code/modules/materials/sheets/organic/wood.dm
index 8139643b17c..f9d370ff4d9 100644
--- a/code/modules/materials/sheets/organic/wood.dm
+++ b/code/modules/materials/sheets/organic/wood.dm
@@ -32,6 +32,9 @@
drop_sound = 'sound/items/drop/wooden.ogg'
pickup_sound = 'sound/items/pickup/wooden.ogg'
+/obj/item/stack/material/log/reagents_per_sheet()
+ return REAGENTS_PER_LOG
+
/obj/item/stack/material/log/sif
name = MAT_SIFLOG
default_type = MAT_SIFLOG
@@ -77,6 +80,9 @@
pass_color = TRUE
apply_colour = TRUE
+/obj/item/stack/material/stick/reagents_per_sheet()
+ return REAGENTS_PER_ROD
+
/obj/item/stack/material/stick/fivestack
amount = 5
color = "#824B28"
diff --git a/code/modules/reagents/machinery/pump.dm b/code/modules/reagents/machinery/pump.dm
index 8d6fd263a4f..aaa9ae5efc3 100644
--- a/code/modules/reagents/machinery/pump.dm
+++ b/code/modules/reagents/machinery/pump.dm
@@ -4,8 +4,9 @@
description_info = "A machine that can pump fluid from certain turfs.
\
Water can be pumped from any body of water. Certain locations or environmental\
- conditions can cause different byproducts to be produced.
\
- Magma or Lava can be pumped to produce mineralized fluid."
+ conditions can cause different byproducts to be produced.
\
+ Magma or Lava can be pumped to produce mineralized fluid.
\
+ Deep bore mining drills can create boreholes that can be fracked for fluids."
anchored = TRUE
density = TRUE
@@ -192,8 +193,8 @@
if(air.temperature <= T0C) // Uses the current air temp, instead of the turf starting temp
R.add_reagent(REAGENT_ID_ICE, round(volume / 2, 0.1))
- for(var/turf/simulated/mineral/M in orange(5,src)) // Uses the turf as center instead of an unset usr
- if(M.mineral && prob(40)) // v
+ for(var/turf/simulated/mineral/M in orange(5,src))
+ if(M.mineral && prob(40) && M.mineral.reagent) // v
R.add_reagent(M.mineral.reagent, round(volume / 5, 0.1)) // Was the turf's reagents variable not the R argument, and changed ore_reagent to M.mineral.reagent because of above change. Also nerfed amount to 1/5 instead of 1/2
/turf/simulated/floor/water/pool/pump_reagents(var/datum/reagents/R, var/volume)
@@ -207,3 +208,26 @@
/turf/simulated/floor/water/contaminated/pump_reagents(var/datum/reagents/R, var/volume)
. = ..()
R.add_reagent(REAGENT_ID_VATSTABILIZER, round(volume / 2, 0.1))
+
+/turf/simulated/mineral/pump_reagents(var/datum/reagents/R, var/volume)
+ . = ..()
+ if(density)
+ return
+ if(!sand_dug)
+ return
+ var/turf/simulated/mineral/M = pick(orange(5,src))
+ if(!istype(M))
+ return
+ // Use nearby ores as well
+ if(M.mineral && M.mineral.reagent && prob(40))
+ R.add_reagent(M.mineral.reagent, rand(0,volume / 8))
+ // Pump deep reagents from deepdrill boreholes
+ for(var/metal in GLOB.deepore_fracking_reagents)
+ if(!M.resources[metal])
+ continue
+ var/list/ore_list = GLOB.deepore_fracking_reagents[metal]
+ if(!ore_list || !ore_list.len)
+ continue
+ var/reagent_id = pick(ore_list)
+ if(reagent_id && prob(60))
+ R.add_reagent(reagent_id, rand(0,volume / 6))
diff --git a/code/modules/refinery/core/industrial_reagent_grinder.dm b/code/modules/refinery/core/industrial_reagent_grinder.dm
index 032bd251def..4c1aa867d8a 100644
--- a/code/modules/refinery/core/industrial_reagent_grinder.dm
+++ b/code/modules/refinery/core/industrial_reagent_grinder.dm
@@ -8,7 +8,7 @@
idle_power_usage = 5
active_power_usage = 300
circuit = /obj/item/circuitboard/industrial_reagent_grinder
- VAR_PRIVATE/limit = 50
+ var/static/limit = 50
VAR_PRIVATE/list/holdingitems = list()
/obj/machinery/reagent_refinery/grinder/Initialize(mapload)
@@ -34,7 +34,7 @@
// Insert grindables if not handled by parent proc
if(holdingitems && holdingitems.len >= limit)
to_chat(user, "The machine cannot hold anymore items.")
- return TRUE
+ return FALSE
// Botany/Chemistry gameplay
if(istype(O,/obj/item/storage/bag))
@@ -71,6 +71,8 @@
return FALSE
// Needs to be sheet, ore, or grindable reagent containing things
+ if(istype(O,/obj/item/tool)) // Stops messages about the wrench being unsuitable to grind
+ return FALSE
if(!GLOB.sheet_reagents[O.type] && !GLOB.ore_reagents[O.type] && (!O.reagents || !O.reagents.total_volume))
to_chat(user, "\The [O] is not suitable for blending.")
return FALSE
@@ -88,6 +90,18 @@
if(stat & (NOPOWER|BROKEN))
return
+ // Get objects from incoming conveyors
+ if(holdingitems.len < limit)
+ for(var/D in GLOB.cardinal)
+ var/turf/T = get_step(src,D)
+ if(!T)
+ continue
+ var/obj/machinery/conveyor/C = locate() in T
+ if(C && !C.stat && C.operating && C.dir == GLOB.reverse_dir[D]) // If an operating conveyor points into us... Check if it's moving anything
+ var/obj/item/I = pick(T.contents - list(C))
+ if(istype(I) && conveyor_load(I))
+ break
+
if(holdingitems.len > 0 && grind_items_to_reagents(holdingitems,reagents))
//Lazy coder sound design moment. THE SEQUEL
playsound(src, 'sound/items/poster_being_created.ogg', 50, 1)
@@ -109,21 +123,18 @@
var/image/dot = image(icon, icon_state = "grinder_dot_[holdingitems.len ? "on" : "off" ]")
add_overlay(dot)
-/obj/machinery/reagent_refinery/grinder/Bumped(atom/movable/AM as mob|obj)
- . = ..()
- if(!anchored)
- return
+/obj/machinery/reagent_refinery/grinder/proc/conveyor_load(atom/movable/AM as mob|obj)
if(!AM || QDELETED(AM))
- return
+ return FALSE
if(holdingitems.len >= limit)
- return
+ return FALSE
if(ismob(AM)) // No mob bumping YET
- return
+ return FALSE
if(!GLOB.sheet_reagents[AM.type] && !GLOB.ore_reagents[AM.type] && (!AM.reagents || !AM.reagents.total_volume))
- return
-
+ return FALSE
AM.forceMove(src)
holdingitems += AM
+ return TRUE
/obj/machinery/reagent_refinery/grinder/examine(mob/user, infix, suffix)
. = ..()