From 747ed116c63a1a7c6fea77fd2da82466521f87a2 Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Sat, 2 Aug 2025 03:08:35 -0700 Subject: [PATCH] [MIRROR] Reagent Refinery (#11282) Co-authored-by: Will <7099514+Willburd@users.noreply.github.com> Co-authored-by: C.L. --- code/__defines/_reagents.dm | 7 +- code/__defines/refinery.dm | 52 ++++ code/__defines/research/techweb_nodes.dm | 1 + code/_helpers/global_lists.dm | 40 +++- code/_helpers/refinery.dm | 85 +++++++ code/controllers/subsystems/internal_wiki.dm | 34 +-- .../changeling/powers/epinephrine_overdose.dm | 2 + code/datums/components/reagent_hose/item.dm | 3 +- code/datums/elements/sellable.dm | 50 ++++ code/datums/roundstats/roundstats.dm | 22 +- code/datums/supplypacks/supply.dm | 14 ++ code/game/machinery/frame.dm | 46 ++++ .../items/weapons/circuitboards/frame.dm | 105 ++++++++ code/game/objects/items/weapons/manuals.dm | 73 ++++++ code/game/turfs/flooring/gas_cracks.dm | 224 ++++++++++++++++++ code/modules/Phorochemistry/phororeagent.dm | 14 ++ code/modules/mining/alloys.dm | 3 +- code/modules/mining/drilling/drill.dm | 43 +++- code/modules/mining/drilling/scanner.dm | 14 +- .../mining/machinery/machine_processing.dm | 4 +- code/modules/mining/mine_turfs.dm | 18 +- code/modules/mining/ore.dm | 10 +- code/modules/mining/ore_datum.dm | 15 +- .../human/species/lleill/lleill_items.dm | 6 + .../station/station_special_abilities_ch.dm | 6 + .../human/species/station/traits/negative.dm | 8 +- .../particle_accelerator/particle_smasher.dm | 2 - code/modules/random_map/automata/caves.dm | 2 - code/modules/random_map/noise/ore.dm | 40 ++-- code/modules/reagents/holder/holder.dm | 9 +- code/modules/reagents/machinery/grinder.dm | 76 +----- .../reactions/distilling/crystalizing.dm | 28 +++ .../reactions/distilling/distilling.dm | 145 +++++++++++- .../reactions/distilling/gas_condensing.dm | 101 ++++++++ .../reactions/distilling/heavy_industrial.dm | 187 +++++++++++++++ .../reactions/distilling/hydroponics.dm | 52 ++++ .../reagents/reactions/instant/instant.dm | 204 +++++++++++++++- code/modules/reagents/reagents/_reagents.dm | 2 + code/modules/reagents/reagents/core.dm | 13 + code/modules/reagents/reagents/dispenser.dm | 80 +++++++ code/modules/reagents/reagents/drugs.dm | 21 ++ code/modules/reagents/reagents/food_drinks.dm | 37 ++- .../reagents/reagents/food_drinks_vr.dm | 7 +- code/modules/reagents/reagents/medicine.dm | 105 +++++++- code/modules/reagents/reagents/medicine_ch.dm | 14 ++ code/modules/reagents/reagents/medicine_vr.dm | 19 ++ code/modules/reagents/reagents/modifiers.dm | 9 + code/modules/reagents/reagents/other.dm | 80 +++++++ code/modules/reagents/reagents/other_ch.dm | 12 + code/modules/reagents/reagents/other_vr.dm | 11 + code/modules/reagents/reagents/toxins.dm | 82 +++++++ code/modules/reagents/reagents/virology.dm | 2 + code/modules/reagents/reagents/vore_ch.dm | 5 + code/modules/reagents/reagents/vore_vr.dm | 25 ++ .../core/industrial_reagent_filter.dm | 133 +++++++++++ .../core/industrial_reagent_furnace.dm | 211 +++++++++++++++++ .../core/industrial_reagent_grinder.dm | 136 +++++++++++ .../refinery/core/industrial_reagent_hub.dm | 85 +++++++ .../core/industrial_reagent_machines.dm | 170 +++++++++++++ .../refinery/core/industrial_reagent_pipe.dm | 67 ++++++ .../refinery/core/industrial_reagent_pump.dm | 55 +++++ .../core/industrial_reagent_reactor.dm | 155 ++++++++++++ .../refinery/core/industrial_reagent_vat.dm | 109 +++++++++ .../refinery/core/industrial_reagent_waste.dm | 88 +++++++ .../refinery/equipment/chemcontainer.dm | 165 +++++++++++++ code/modules/refinery/equipment/pumprelay.dm | 62 +++++ .../refinery/equipment/smart_centrifuge.dm | 117 +++++++++ .../research/tg/designs/boards/refinery.dm | 119 ++++++++++ .../research/tg/techwebs/nodes/engi_nodes.dm | 22 ++ code/modules/vehicles/cargo_train.dm | 129 +++++++++- code/modules/vehicles/train.dm | 5 +- code/unit_tests/reagent_tests.dm | 95 ++++++-- icons/obj/chemical.dmi | Bin 63579 -> 59366 bytes icons/obj/library.dmi | Bin 47899 -> 48168 bytes icons/obj/machines/refinery_machines.dmi | Bin 0 -> 16265 bytes icons/obj/stock_parts_refinery.dmi | Bin 0 -> 13556 bytes icons/obj/vehicles_vr.dmi | Bin 21830 -> 25819 bytes maps/expedition_vr/aerostat/_aerostat.dm | 36 +-- .../aerostat/_aerostat_science_outpost.dm | 12 +- maps/groundbase/groundbase_mining.dm | 11 +- maps/om_adventure/grasscave.dm | 13 +- maps/stellar_delight/stellar_delight_turfs.dm | 12 +- maps/submaps/space_rocks/space_rocks.dm | 12 +- .../underdark_pois/underdark_things.dm | 11 + maps/tether/tether_turfs.dm | 10 +- .../simple_mob/subtypes/vore/xeyakin.dm | 2 + .../modules/reagents/reagents/dispenser.dm | 2 + .../modules/reagents/reagents/food_drinks.dm | 8 + .../modules/reagents/reagents/medicine.dm | 30 +++ vorestation.dme | 18 ++ 90 files changed, 4125 insertions(+), 244 deletions(-) create mode 100644 code/__defines/refinery.dm create mode 100644 code/_helpers/refinery.dm create mode 100644 code/game/turfs/flooring/gas_cracks.dm create mode 100644 code/modules/reagents/reactions/distilling/crystalizing.dm create mode 100644 code/modules/reagents/reactions/distilling/gas_condensing.dm create mode 100644 code/modules/reagents/reactions/distilling/heavy_industrial.dm create mode 100644 code/modules/reagents/reactions/distilling/hydroponics.dm create mode 100644 code/modules/refinery/core/industrial_reagent_filter.dm create mode 100644 code/modules/refinery/core/industrial_reagent_furnace.dm create mode 100644 code/modules/refinery/core/industrial_reagent_grinder.dm create mode 100644 code/modules/refinery/core/industrial_reagent_hub.dm create mode 100644 code/modules/refinery/core/industrial_reagent_machines.dm create mode 100644 code/modules/refinery/core/industrial_reagent_pipe.dm create mode 100644 code/modules/refinery/core/industrial_reagent_pump.dm create mode 100644 code/modules/refinery/core/industrial_reagent_reactor.dm create mode 100644 code/modules/refinery/core/industrial_reagent_vat.dm create mode 100644 code/modules/refinery/core/industrial_reagent_waste.dm create mode 100644 code/modules/refinery/equipment/chemcontainer.dm create mode 100644 code/modules/refinery/equipment/pumprelay.dm create mode 100644 code/modules/refinery/equipment/smart_centrifuge.dm create mode 100644 code/modules/research/tg/designs/boards/refinery.dm create mode 100644 icons/obj/machines/refinery_machines.dmi create mode 100644 icons/obj/stock_parts_refinery.dmi diff --git a/code/__defines/_reagents.dm b/code/__defines/_reagents.dm index d2257c0706..6bfb2457e6 100644 --- a/code/__defines/_reagents.dm +++ b/code/__defines/_reagents.dm @@ -83,7 +83,12 @@ #define REAGENT_ID_TUNGSTEN "tungsten" #define REAGENT_NUTRIMENT "Nutriment" #define REAGENT_ID_NUTRIMENT "nutriment" - +#define REAGENT_TITANIUM "Titanium" +#define REAGENT_ID_TITANIUM "titanium" +#define REAGENT_TITANIUMDIOX "Titanium dioxide" +#define REAGENT_ID_TITANIUMDIOX "titanium_diox" +#define REAGENT_TIN "Tin" +#define REAGENT_ID_TIN "tin" // Xeno chem react #define XENO_CHEM_NUTRI "nutr" diff --git a/code/__defines/refinery.dm b/code/__defines/refinery.dm new file mode 100644 index 0000000000..221c6b44b7 --- /dev/null +++ b/code/__defines/refinery.dm @@ -0,0 +1,52 @@ +#define REFINERY_SINTERING_SMOKE "FLAG_SMOKE" +#define REFINERY_SINTERING_EXPLODE "FLAG_EXPLODE" +#define REFINERY_SINTERING_SPIDERS "FLAG_SPIDERS" + +#define REFINERY_DEFAULT_TRANSFER_AMOUNTS list(0,1,2,5,10,15,20,25,30,40,60,80,100,120) +#define SHEET_TO_REAGENT_EQUIVILENT *(1/REAGENTS_PER_SHEET) // 0.05 normally 1/20 +// The tl;dr here is that the supply_conversion_value of the reagent should just match the per sheet value with the macro above. +// That should keep everything inline and not cause any cargo exploits. + +#define REFINERY_TUTORIAL_INPUT (1 << 0) +#define REFINERY_TUTORIAL_FILTER (1 << 1) +#define REFINERY_TUTORIAL_HUB (1 << 2) +#define REFINERY_TUTORIAL_NOPOWER (1 << 3) +#define REFINERY_TUTORIAL_NOINPUT (1 << 4) +#define REFINERY_TUTORIAL_NOOUTPUT (1 << 5) +#define REFINERY_TUTORIAL_ALLIN (1 << 6) +#define REFINERY_TUTORIAL_SINGLEOUTPUT (1 << 7) + +#define REAGENT_VAT_VOLUME 500 +#define CARGOTANKER_VOLUME 3000 + +// Use these, unless it had a sheet analog to match, VAL * 0.05 * 2000 = per full tank points +#define REFINERYEXPORT_VALUE_NO 0.1 SHEET_TO_REAGENT_EQUIVILENT // 10 per tank +#define REFINERYEXPORT_VALUE_UNWANTED 0.5 SHEET_TO_REAGENT_EQUIVILENT // 50 per tank +#define REFINERYEXPORT_VALUE_COMMON 1 SHEET_TO_REAGENT_EQUIVILENT // 100 per tank +#define REFINERYEXPORT_VALUE_RARE 2 SHEET_TO_REAGENT_EQUIVILENT // 200 per tank +#define REFINERYEXPORT_VALUE_PROCESSED 3 SHEET_TO_REAGENT_EQUIVILENT // 300 per tank +#define REFINERYEXPORT_VALUE_HIGHREFINED 4 SHEET_TO_REAGENT_EQUIVILENT // 400 per tank +#define REFINERYEXPORT_VALUE_MASSINDUSTRY 8 SHEET_TO_REAGENT_EQUIVILENT // 800 per tank +#define REFINERYEXPORT_VALUE_PEAK 16 SHEET_TO_REAGENT_EQUIVILENT // 1600 per tank +#define REFINERYEXPORT_VALUE_GODTIER 20 SHEET_TO_REAGENT_EQUIVILENT // 2000 per tank + +// Use these or you'll get weird endround lists +#define REFINERYEXPORT_REASON_BIOHAZARD "unwanted biohazards" +#define REFINERYEXPORT_REASON_RAW "raw industrial materials" +#define REFINERYEXPORT_REASON_PHORON "advanced phoronics research" +#define REFINERYEXPORT_REASON_DRUG "pharmaceutical drugs" +#define REFINERYEXPORT_REASON_ILLDRUG "illegal drugs" +#define REFINERYEXPORT_REASON_RECDRUG "widespread recreational drugs" +#define REFINERYEXPORT_REASON_CLONEDRUG "vat cloning stablizers" +#define REFINERYEXPORT_REASON_SPECIALDRUG "specialized high end drugs" +#define REFINERYEXPORT_REASON_DIET "dietary supplements" +#define REFINERYEXPORT_REASON_FOOD "culinary ingredients" +#define REFINERYEXPORT_REASON_MATSCI "material science research" +#define REFINERYEXPORT_REASON_MEDSCI "medical science research" +#define REFINERYEXPORT_REASON_INDUSTRY "heavy industrial materials" +#define REFINERYEXPORT_REASON_PRECURSOR "industrial precursor chemicals" +#define REFINERYEXPORT_REASON_WEAPONS "chemical weaponry" +#define REFINERYEXPORT_REASON_COMSTIM "combat stimulants" +#define REFINERYEXPORT_REASON_COSMETIC "cosmetic coatings and drugs" +#define REFINERYEXPORT_REASON_CLEAN "cleaning products" +#define REFINERYEXPORT_REASON_LUBE "industrial lubricants" diff --git a/code/__defines/research/techweb_nodes.dm b/code/__defines/research/techweb_nodes.dm index a63a1e97ff..26e2bb219f 100644 --- a/code/__defines/research/techweb_nodes.dm +++ b/code/__defines/research/techweb_nodes.dm @@ -40,6 +40,7 @@ #define TECHWEB_NODE_DONK_PRODUCTS "donk_products" #define TECHWEB_NODE_ELECTRIC_WEAPONS "electric_weapons" #define TECHWEB_NODE_ENERGY_MANIPULATION "energy_manipulation" +#define TECHWEB_NODE_CHEM_REFINERY "chem_refinery" #define TECHWEB_NODE_EXODRONE "exodrone" #define TECHWEB_NODE_EXOTIC_AMMO "exotic_ammo" #define TECHWEB_NODE_EXP_TOOLS "exp_tools" diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index b9dc6af321..579e0efaf1 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -1506,8 +1506,44 @@ GLOBAL_LIST_INIT(ore_reagents, list( //have a number of reageents divisible by R /obj/item/ore/lead = list(REAGENT_ID_LEAD), /obj/item/ore/hydrogen = list(REAGENT_ID_HYDROGEN), /obj/item/ore/verdantium = list(REAGENT_ID_RADIUM,REAGENT_ID_PHORON,REAGENT_ID_NITROGEN,REAGENT_ID_PHOSPHORUS,REAGENT_ID_SODIUM), // Some fun stuff to be useful with - /obj/item/ore/rutile = list(REAGENT_ID_TUNGSTEN,REAGENT_ID_OXYGEN) // Should be titanium -)) + /obj/item/ore/rutile = list(REAGENT_ID_TITANIUMDIOX,REAGENT_ID_OXYGEN), + /obj/item/ore/copper = list(REAGENT_ID_COPPER), + /obj/item/ore/tin = list(REAGENT_ID_TIN), + /obj/item/ore/void_opal = list(REAGENT_ID_SILICON,REAGENT_ID_SILICON,REAGENT_ID_OXYGEN,REAGENT_ID_WATER), + /obj/item/ore/painite = list(REAGENT_ID_CALCIUM,REAGENT_ID_ALUMINIUM,REAGENT_ID_OXYGEN,REAGENT_ID_OXYGEN), + /obj/item/ore/quartz = list(REAGENT_ID_SILICON,REAGENT_ID_OXYGEN), + /obj/item/ore/bauxite = list(REAGENT_ID_ALUMINIUM,REAGENT_ID_ALUMINIUM), + )) + +// Don't need a new list for every grinder in the game +GLOBAL_LIST_INIT(reagent_sheets,list( // Recompressing reagents back into sheets + REAGENT_ID_COPPER = MAT_COPPER, + REAGENT_ID_TIN = MAT_TIN, + REAGENT_ID_WOODPULP = MAT_CARDBOARD, + REAGENT_ID_CARBON = MAT_GRAPHITE, + REAGENT_ID_ALUMINIUM = MAT_ALUMINIUM, + REAGENT_ID_TITANIUM = MAT_TITANIUM, + REAGENT_ID_IRON = MAT_IRON, + REAGENT_ID_LEAD = MAT_LEAD, + REAGENT_ID_URANIUM = MAT_URANIUM, + REAGENT_ID_GOLD = MAT_GOLD, + REAGENT_ID_SILVER = MAT_SILVER, + REAGENT_ID_PLATINUM = MAT_PLATINUM, + REAGENT_ID_SILICON = MAT_GLASS, + // Mostly harmless + REAGENT_ID_PROTEIN = REFINERY_SINTERING_SMOKE, + REAGENT_ID_TRIGLYCERIDE = REFINERY_SINTERING_SMOKE, + REAGENT_ID_SODIUM = REFINERY_SINTERING_SMOKE, + REAGENT_ID_PHOSPHORUS = REFINERY_SINTERING_SMOKE, + REAGENT_ID_ETHANOL = REFINERY_SINTERING_SMOKE, + // Extremely stupid ones + REAGENT_ID_OXYGEN = REFINERY_SINTERING_EXPLODE, + REAGENT_ID_HYDROGEN = REFINERY_SINTERING_EXPLODE, + REAGENT_ID_PHORON = REFINERY_SINTERING_EXPLODE, + REAGENT_ID_SUPERMATTER = REFINERY_SINTERING_EXPLODE, + // Nothing is funnier to me + REAGENT_ID_SPIDEREGG = REFINERY_SINTERING_SPIDERS, + )) //List of the ammo types that can be used in game. GLOBAL_LIST_INIT(global_ammo_types, list( diff --git a/code/_helpers/refinery.dm b/code/_helpers/refinery.dm new file mode 100644 index 0000000000..d9f278f149 --- /dev/null +++ b/code/_helpers/refinery.dm @@ -0,0 +1,85 @@ +/// Grinds down various objects into their reagent components. Returns true if any reagents were gained from the attempt. +/proc/grind_items_to_reagents(var/list/holdingitems,var/datum/reagents/R) + var/start_volume = R.total_volume + + for(var/obj/item/O in holdingitems) + var/remaining_volume = R.maximum_volume - R.total_volume + if(remaining_volume <= 0) + break + + //CHOMPedit start + if(istype(O,/obj/item/stack/material/supermatter)) + var/regrets = 0 + for(var/obj/item/stack/material/supermatter/S in holdingitems) + regrets += S.get_amount() + puny_protons(regrets, R.my_atom, holdingitems) + return + //CHOMPedit end + + if(GLOB.sheet_reagents[O.type]) + 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))) + if(amount_to_take) + stack.use(amount_to_take) + if(QDELETED(stack)) + holdingitems -= stack + 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)) + else + R.add_reagent(sheet_components, (amount_to_take*REAGENTS_PER_SHEET)) + continue + + else if(GLOB.ore_reagents[O.type]) + var/obj/item/ore/D = O + if(istype(D)) + var/list/ore_components = GLOB.ore_reagents[D.type] + if(remaining_volume >= REAGENTS_PER_ORE) + holdingitems -= D + qdel(D) + if(islist(ore_components)) + var/amount_to_take = (REAGENTS_PER_ORE/(ore_components.len)) + for(var/i in ore_components) + R.add_reagent(i, amount_to_take) + else + R.add_reagent(ore_components, REAGENTS_PER_ORE) + continue + + else if(O.reagents && O.reagents.total_volume > 0) + O.reagents.trans_to_obj(R.my_atom, min(O.reagents.total_volume, remaining_volume)) + if(O.reagents.total_volume == 0) + holdingitems -= O + qdel(O) + if (R.total_volume >= R.maximum_volume) + break + + else + // Cronch + holdingitems -= O + qdel(O) + + return (R.total_volume > start_volume) + +// CHOMPedit start: Repurposed coffee grinders and supermatter do not mix. +/proc/puny_protons(regrets = 0, var/atom/our_atom, var/list/holdingitems) + our_atom.set_light(0) + if(regrets > 0) // If you thought grinding supermatter would end well. Values taken from ex_act() for the supermatter stacks. + SSradiation.radiate(get_turf(our_atom), 15 + regrets * 4) + explosion(get_turf(our_atom), round(regrets / 12) , round(regrets / 6), round(regrets / 3), round(regrets / 25)) + qdel(our_atom) + return + + else // If you added supermatter but didn't try grinding it, or somehow this is negative. + for(var/obj/item/stack/material/supermatter/S in holdingitems) + S.loc = our_atom.loc + holdingitems -= S + regrets += S.get_amount() + SSradiation.radiate(get_turf(our_atom), 15 + regrets) + our_atom.visible_message(span_warning("\The [our_atom] glows brightly, bursting into flames and flashing into ash."),\ + span_warning("You hear an unearthly shriek, burning heat washing over you.")) + new /obj/effect/decal/cleanable/ash(our_atom.loc) + qdel(our_atom) +// CHOMPedit end diff --git a/code/controllers/subsystems/internal_wiki.dm b/code/controllers/subsystems/internal_wiki.dm index 34429a27f4..bae4349bb5 100644 --- a/code/controllers/subsystems/internal_wiki.dm +++ b/code/controllers/subsystems/internal_wiki.dm @@ -294,12 +294,10 @@ SUBSYSTEM_DEF(internal_wiki) var/list/assemble_reaction = list() assemble_reaction["temp_min"] = CR.temp_range[1] assemble_reaction["temp_max"] = CR.temp_range[2] - /* Downstream features assemble_reaction["xgm_min"] = CR.minimum_xgm_pressure assemble_reaction["xgm_max"] = CR.maximum_xgm_pressure - assemble_reaction["require_xgm_gas"] = CR.require_xgm_gas - assemble_reaction["rejects_xgm_gas"] = CR.rejects_xgm_gas - */ + assemble_reaction["require_xgm_gas"] = CR.require_xgm_gas ? GLOB.gas_data.name[CR.require_xgm_gas] : null + assemble_reaction["rejects_xgm_gas"] = CR.rejects_xgm_gas ? GLOB.gas_data.name[CR.rejects_xgm_gas] : null var/list/reqs = list() for(var/RQ in CR.required_reagents) var/decl/chemical_reaction/r_RQ = SSchemistry.chemical_reagents[RQ] @@ -431,6 +429,15 @@ SUBSYSTEM_DEF(internal_wiki) return allergies return null +/datum/controller/subsystem/internal_wiki/proc/assemble_sintering(var/sinter) + if(sinter == REFINERY_SINTERING_EXPLODE) + return "violent detonation" + if(sinter == REFINERY_SINTERING_SMOKE) + return "toxic fumes" + if(sinter == REFINERY_SINTERING_SPIDERS) + return "OH GOD WHY!?" + return sinter + /datum/controller/subsystem/internal_wiki/proc/add_icon(var/list/data, var/ic, var/is, var/col) var/load_data = list() load_data["icon"] = ic // dmi path @@ -1148,14 +1155,12 @@ SUBSYSTEM_DEF(internal_wiki) data["addictive"] = 0 if(R.id in get_addictive_reagents(ADDICT_ALL)) data["addictive"] = TRUE - /* Downstream features data["industrial_use"] = R.industrial_use data["supply_points"] = R.supply_conversion_value ? R.supply_conversion_value : 0 var/value = R.supply_conversion_value * REAGENTS_PER_SHEET * SSsupply.points_per_money value = FLOOR(value * 100,1) / 100 // Truncate decimals data["market_price"] = value - data["sintering"] = global.reagent_sheets[R.id] - */ + data["sintering"] = SSinternal_wiki.assemble_sintering(GLOB.reagent_sheets[R.id]) data["overdose"] = R.overdose data["flavor"] = R.taste_description data["allergen"] = SSinternal_wiki.assemble_allergens(R.allergen_type) @@ -1166,7 +1171,6 @@ SUBSYSTEM_DEF(internal_wiki) body += "Description: [data["description"]]
" if(data["addictive"]) body += "DANGER, addictive.
" - /* Downstream features if(data["industrial_use"]) body += "Industrial Use: [data["industrial_use"]]
" var/tank_size = CARGOTANKER_VOLUME @@ -1177,16 +1181,16 @@ SUBSYSTEM_DEF(internal_wiki) if(data["sintering"]) var/mat_id = data["sintering"] switch(mat_id) - if("FLAG_SMOKE") + if(REFINERY_SINTERING_SMOKE) body += "Sintering Results: COMBUSTION
" - if("FLAG_EXPLODE") + if(REFINERY_SINTERING_EXPLODE) body += "Sintering Results: DETONATION
" - if("FLAG_SPIDERS") + if(REFINERY_SINTERING_SPIDERS) body += "Sintering Results: DO NOT EVER
" else var/datum/material/C = get_material_by_name(data["sintering"]) - body += "Sintering Results: [C.display_name] [C.sheet_plural_name]
" - */ + if(C) + body += "Sintering Results: [C.display_name] [C.sheet_plural_name]
" if(data["overdose"] > 0) body += "Overdose: [data["overdose"]]u
" body += "Flavor: [data["flavor"]]
" @@ -1569,13 +1573,11 @@ SUBSYSTEM_DEF(internal_wiki) else body += "Potential Chemical breakdown [segment]:
" segment++ - /* Downstream features body += " -Temperature: [react["xgm_min"]]K - [react["xgm_max"]]K | ([react["xgm_min"] - T0C]C - [react["xgm_max"] - T0C]C)
" if(react["require_xgm_gas"]) - body += " -Requires Gas: [react["require_xgm_gas"])]
" + body += " -Requires Gas: [react["require_xgm_gas"]]
" if(react["rejects_xgm_gas"]) body += " -Rejects Gas: [react["rejects_xgm_gas"]]
" - */ for(var/RQ in react["required"]) body += " -Component: [RQ]
" for(var/IH in react["inhibitor"]) diff --git a/code/datums/components/antags/changeling/powers/epinephrine_overdose.dm b/code/datums/components/antags/changeling/powers/epinephrine_overdose.dm index 38177dc956..7dbab67563 100644 --- a/code/datums/components/antags/changeling/powers/epinephrine_overdose.dm +++ b/code/datums/components/antags/changeling/powers/epinephrine_overdose.dm @@ -52,6 +52,8 @@ color = "#C8A5DC" metabolism = REM * 2 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/epinephrine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) diff --git a/code/datums/components/reagent_hose/item.dm b/code/datums/components/reagent_hose/item.dm index b250a07717..3151261b69 100644 --- a/code/datums/components/reagent_hose/item.dm +++ b/code/datums/components/reagent_hose/item.dm @@ -103,6 +103,7 @@ return else - to_chat(user, span_notice("There are no available connectors on \the [target]. You wind \the [src] back up.")) + if(remembered) + to_chat(user, span_notice("There are no available connectors on \the [target]. You wind \the [src] back up.")) remembered = null // Unintuitive if it does not reset state ..() diff --git a/code/datums/elements/sellable.dm b/code/datums/elements/sellable.dm index 00b64c9985..59258661b6 100644 --- a/code/datums/elements/sellable.dm +++ b/code/datums/elements/sellable.dm @@ -123,6 +123,56 @@ /datum/element/sellable/vaccine/calculate_sell_value(obj/source) return 5 + +// Refinery chemical tanks +/datum/element/sellable/trolley_tank + sale_info = "This can be sold on the cargo shuttle if filled with a single reagent." + needs_crate = FALSE + +/datum/element/sellable/trolley_tank/sell_error(obj/source) + var/obj/vehicle/train/trolley_tank/tank = source + if(!tank.reagents || tank.reagents.reagent_list.len == 0) + return "Error: Product was not filled with any reagents to sell. Payment rendered null under terms of agreement." + var/min_tank = (CARGOTANKER_VOLUME - 100) + if(tank.reagents.total_volume < min_tank) + return "Error: Product was improperly packaged. Send full tanks only (minimum [min_tank] units). Payment rendered null under terms of agreement." + if(tank.reagents.reagent_list.len > 1) + return "Error: Product was improperly refined. Send purified mixtures only (too many reagents in tank). Payment rendered null under terms of agreement." + return null + +/datum/element/sellable/trolley_tank/calculate_sell_value(obj/source) + var/obj/vehicle/train/trolley_tank/tank = source + + // Update export values + var/datum/reagent/R = tank.reagents.reagent_list[1] + var/reagent_value = FLOOR(R.volume * R.supply_conversion_value, 1) + + return reagent_value + +/datum/element/sellable/trolley_tank/calculate_sell_quantity(obj/source) + var/obj/vehicle/train/trolley_tank/tank = source + if(!tank.reagents || tank.reagents.reagent_list.len == 0) + return "0u " + var/datum/reagent/R = tank.reagents.reagent_list[1] + return "[R.name] [tank.reagents.total_volume]u " + +/datum/element/sellable/trolley_tank/sell(obj/source, var/datum/exported_crate/EC, var/in_crate) + . = ..() + var/obj/vehicle/train/trolley_tank/tank = source + if(. && tank.reagents?.reagent_list?.len) + // Update end round data, has nothing to do with actual cargo sales + var/datum/reagent/R = tank.reagents.reagent_list[1] + var/reagent_value = FLOOR(R.volume * R.supply_conversion_value, 1) + if(R.industrial_use) + if(isnull(GLOB.refined_chems_sold[R.industrial_use])) + var/list/data = list() + data["units"] = FLOOR(R.volume, 1) + data["value"] = reagent_value + GLOB.refined_chems_sold[R.industrial_use] = data + else + GLOB.refined_chems_sold[R.industrial_use]["units"] += FLOOR(R.volume, 1) + GLOB.refined_chems_sold[R.industrial_use]["value"] += reagent_value + //CHOMPEdit Start /datum/element/sellable/salvage //For selling /obj/item/salvage diff --git a/code/datums/roundstats/roundstats.dm b/code/datums/roundstats/roundstats.dm index 8ecfddbe0f..4052c7fde4 100644 --- a/code/datums/roundstats/roundstats.dm +++ b/code/datums/roundstats/roundstats.dm @@ -26,7 +26,7 @@ GLOBAL_VAR_INIT(prey_absorbed_roundstat, 0) //VOREStation Edit - Obviously GLOBAL_VAR_INIT(prey_digested_roundstat, 0) //VOREStation Edit - Obviously GLOBAL_VAR_INIT(items_digested_roundstat, 0) //VOREStation Edit - Obviously GLOBAL_LIST_EMPTY(security_printer_tickets) //VOREStation Edit - +GLOBAL_LIST_EMPTY(refined_chems_sold) /hook/roundend/proc/RoundTrivia()//bazinga var/list/valid_stats_list = list() //This is to be populated with the good shit @@ -72,7 +72,6 @@ GLOBAL_LIST_EMPTY(security_printer_tickets) //VOREStation Edit else good_num = 0 - //VOREStation Add Start - Vore stats lets gooooo if(GLOB.prey_eaten_roundstat > 0) valid_stats_list.Add("Individuals were eaten a total of [GLOB.prey_eaten_roundstat] times today!") //CHOMPEdit if(GLOB.prey_digested_roundstat > 0) @@ -81,7 +80,24 @@ GLOBAL_LIST_EMPTY(security_printer_tickets) //VOREStation Edit valid_stats_list.Add("A total of [GLOB.prey_absorbed_roundstat] individuals were absorbed today!") if(GLOB.items_digested_roundstat > 0) valid_stats_list.Add("A total of [GLOB.items_digested_roundstat] items were digested today!") - //VOREStation Add End + + var/points = 0 + var/units = 0 + if(GLOB.refined_chems_sold && GLOB.refined_chems_sold.len > 0) + valid_stats_list.Add(span_warning("The station exported:")) + + for(var/D in GLOB.refined_chems_sold) + units += GLOB.refined_chems_sold[D]["units"] + points += GLOB.refined_chems_sold[D]["value"] + + if(GLOB.refined_chems_sold[D]["units"] >= 1000) // Don't spam the list + var/dols = GLOB.refined_chems_sold[D]["value"] * SSsupply.points_per_money + dols = FLOOR(dols * 100,1) / 100 // Truncate decimals + valid_stats_list.Add("[GLOB.refined_chems_sold[D]["units"]]u of [D], for [GLOB.refined_chems_sold[D]["value"]] points! A total of [dols] [dols > 1 ? "thalers" : "thaler"]") + + var/end_dols = points * SSsupply.points_per_money + end_dols = FLOOR(end_dols * 100,1) / 100 // Truncate decimals + valid_stats_list.Add("For a total of: [points] points, or [end_dols] [end_dols > 1 ? "thalers" : "thaler"]!") if(LAZYLEN(valid_stats_list)) to_world(span_world("Shift trivia!")) diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm index e905c23d99..4a45ed0198 100644 --- a/code/datums/supplypacks/supply.dm +++ b/code/datums/supplypacks/supply.dm @@ -169,6 +169,20 @@ contains = list(/obj/vehicle/train/trolley) cost = 15 +/datum/supply_pack/supply/cargotank + name = "Cargo Train Tanker" + desc = "A cargo train tanker. For selling large volumes of a reagent." + contains = list(/obj/vehicle/train/trolley_tank) + cost = 15 + +/datum/supply_pack/supply/freezer + name = "Freezer crate" + desc = "An empty freezer for storing perishable items." + contains = list() + cost = 20 + containertype = /obj/structure/closet/crate/freezer + containername = "Freezer crate" + /datum/supply_pack/explorergear name= JOB_EXPLORER + " gear" desc = "Standard issue equipment for Explorers. Requires EVA and Exploration access." diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index d41491f22f..89281eca65 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -216,6 +216,52 @@ GLOBAL_LIST(construction_frame_floor) circuit = /obj/machinery/atmospheric_field_generator frame_size = 3 +// Refinery machines +/datum/frame/frame_types/industrial_reagent_grinder + name = "Industrial Chemical Grinder" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_pump + name = "Industrial Chemical Pump" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_filter + name = "Industrial Chemical Filter" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_vat + name = "Industrial Chemical Vat" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_pipe + name = "Industrial Chemical Pipe" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_waste_processor + name = "Industrial Chemical Waste Processor" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_hub + name = "Industrial Chemical Hub" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_reactor + name = "Industrial Chemical Reactor" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + +/datum/frame/frame_types/industrial_reagent_furnace + name = "Industrial Chemical Sintering Furnace" + icon_override = 'icons/obj/stock_parts_refinery.dmi' + frame_class = FRAME_CLASS_MACHINE + ////////////////////////////// // Frame Object (Structure) ////////////////////////////// diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index d0f3f9e518..3aa1778c54 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -297,3 +297,108 @@ /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/console_screen = 1 ) + +// Smart centrifuge +/obj/item/circuitboard/smart_centrifuge + name = T_BOARD("smart centrifuge") + build_path = /obj/machinery/smart_centrifuge + board_type = new /datum/frame/frame_types/machine + matter = list(MAT_STEEL = 50, MAT_GLASS = 50) + origin_tech = list(TECH_MAGNET = 3, TECH_DATA = 2, TECH_MATERIAL = 3) + req_components = list( + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/motor = 1, + /obj/item/stock_parts/gear = 3, + /obj/item/stack/material/glass/reinforced = 1) + +// Refinery machines +/obj/item/circuitboard/industrial_reagent_grinder + name = T_BOARD("industrial chemical grinder") + build_path = /obj/machinery/reagent_refinery/grinder + board_type = new /datum/frame/frame_types/industrial_reagent_grinder + req_components = list( + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/motor = 2, + /obj/item/stock_parts/gear = 2, + /obj/item/reagent_containers/glass/beaker/large = 1) + +/obj/item/circuitboard/industrial_reagent_pump + name = T_BOARD("industrial chemical pump") + build_path = /obj/machinery/reagent_refinery/pump + board_type = new /datum/frame/frame_types/industrial_reagent_pump + req_components = list( + /obj/item/stock_parts/motor = 1, + /obj/item/stack/material/glass/reinforced = 1) + +/obj/item/circuitboard/industrial_reagent_filter + name = T_BOARD("industrial chemical filter") + build_path = /obj/machinery/reagent_refinery/filter + board_type = new /datum/frame/frame_types/industrial_reagent_filter + req_components = list( + /obj/item/stock_parts/motor = 1, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/motor = 1, + /obj/item/stock_parts/gear = 1, + /obj/item/stack/material/glass/reinforced = 1) + +/obj/item/circuitboard/industrial_reagent_vat + name = T_BOARD("industrial chemical vat") + build_path = /obj/machinery/reagent_refinery/vat + board_type = new /datum/frame/frame_types/industrial_reagent_vat + req_components = list( + /obj/item/stock_parts/motor = 1, + /obj/item/stack/material/glass/reinforced = 1) + +/obj/item/circuitboard/industrial_reagent_pipe + name = T_BOARD("industrial chemical pipe") + build_path = /obj/machinery/reagent_refinery/pipe + board_type = new /datum/frame/frame_types/industrial_reagent_pipe + req_components = list( /obj/item/stack/material/glass/reinforced = 1) + +/obj/item/circuitboard/industrial_reagent_waste_processor + name = T_BOARD("industrial chemical waste processor") + build_path = /obj/machinery/reagent_refinery/waste_processor + board_type = new /datum/frame/frame_types/industrial_reagent_waste_processor + req_components = list( + /obj/item/stock_parts/capacitor = 4, + /obj/item/stock_parts/micro_laser = 4, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/material/glass/reinforced = 1) + +/obj/item/circuitboard/industrial_reagent_hub + name = T_BOARD("industrial chemical hub") + build_path = /obj/machinery/reagent_refinery/hub + board_type = new /datum/frame/frame_types/industrial_reagent_hub + req_components = list( + /obj/item/stock_parts/motor = 1, + /obj/item/stock_parts/manipulator = 1) + +/obj/item/circuitboard/industrial_reagent_reactor + name = T_BOARD("industrial chemical reactor") + build_path = /obj/machinery/reagent_refinery/reactor + board_type = new /datum/frame/frame_types/industrial_reagent_reactor + req_components = list( + /obj/item/stock_parts/motor = 1, + /obj/item/stock_parts/capacitor = 4, + /obj/item/stock_parts/micro_laser = 4, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/material/glass/reinforced = 1) + +/obj/item/circuitboard/industrial_reagent_furnace + name = T_BOARD("industrial chemical sintering furnace") + build_path = /obj/machinery/reagent_refinery/furnace + board_type = new /datum/frame/frame_types/industrial_reagent_furnace + req_components = list( + /obj/item/stock_parts/motor = 2, + /obj/item/stock_parts/capacitor = 4, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/gear = 2) + +/obj/item/circuitboard/pump_relay + name = T_BOARD("pump relay") + build_path = /obj/machinery/pump_relay + board_type = new /datum/frame/frame_types/machine + req_components = list( + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/motor = 1) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 7d2c2e5f68..fa395df758 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1720,3 +1720,76 @@ "} + + +// Chemical Refinery +/obj/item/book/manual/chem_refinery + name = "Chemical Refinery Basic Operations" + icon_state ="bookrefinery" + item_state = "book15" + author = "Engineering Encyclopedia" + title = "Chemical Refinery Basic Operations" + + dat = {" + + + + +

OPERATING MANUAL FOR MK 1 INDUSTRIAL REAGENT REFINERY EQUIPMENT

+
+

OPERATING PRINCIPLES

+

The chemical refinery is not a single machine, but instead many machines connected together to perform the complex, multi-step, reactions needed for production of high value industrial reagents for export from the station.

+

Unlike a traditional chemistry department where reagents are created at small scales for local use; A chemical refinery is often dedicated to one or two types of reagents, produced at massive quantities. Each cargo train tanker will need to be filled full of a single reagent to be properly sold by cargo.

+

To achieve this, the refinery has many unique machines, each with a role to play. Multiple of the same type of machine will often be needed. As reagents often need many steps to filter and react them to their final forms.

+
+

MACHINERY OVERVIEW

+

In order of importance in refinery operations:

+

Pipes:

+

Pipes form the inexpensive backbone of reagent transfer in a refinery, and connect more complex modules of a refinery together. Pipes do not require power to transport reagents, but do so only in one direction. The red pipe marks an input connection from another machine. Arrows are also pressed into the hull of the pipe to indicate flow.

+ +

Filters:

+

Similar to pipes, a filter allows reagents to flow from one machine to the next. With a red pipe as input. Once reagents are present in a filter, one of them may be chosen. Once chosen the reagent will be filtered to the purple marked outlet on the filter's side. The filter will not move any reagents if no filtered reagent is selected. It can also be configured to filter out nothing, or everything, if the filter is being used as a way divert flow or purge upstream machinery.

+ +

Hubs:

+

Hubs are an automatic quick connect solution to pumping reagents from the refinery into cargo train tankers. Once a tanker is moved onto a hub's pad, it will begin filling or draining after a small delay. A hub's mode of operation depends entirely on if a machine's output points into it, or not. If a machine's output points into a hub, it will fill cargo tankers on the pad. If the hub connects to a machine's input instead, it will drain cargo tankers into that machine.

+ +

Grinders:

+

Solid materials such as metal sheets, ores, and plants may be ground down for use in the refinery. Though this method of reagent production is generally slower, and requires manual input. The grinder only has a single output.

+ +

Vats:

+

Vats are your primary reagent storage tanks. They hold large volumes of reagents. Like any part of the refinery, once reagents are flowing inside them, they can react with other reagents. Separation, filtering, and careful mixing is critical for the construction of a seamlessly operating refinery. Vats only have a single output, all other sides are considered inputs.

+ +

Reactors:

+

Reactors are the most complex machine in the refinery. It is capable of distilling reagents that require complex atmospheric conditions. A reactor only has a single output, all other sides are considered inputs. Reagents inside a reactor are separated into internal pressurized tanks, and only react during the machine's distillation cycle. The reactor will automatically shift between pumping and distilling once it detects chemical input. The results will often require filtering and reprocessing, as the input reagents are used to flush the reaction chamber each cycle.

+

Reactors are compatible with portable atmospherics pads, and may be anchored on top of one to automatically connect it to a gas network. The gas network will provide the specific pressure and temperature required for the reaction within the machine. Many reactions require specific conditions to progress, and some input reagents may have different reactions depending on temperature and gas composition. Consult a trained chemist for insights on enhancing your refinery layout.

+ +

Sintering Furnaces:

+

Sintering is the process of heating a material under high pressure, causing it to weld together into a cohesive form. Unfortunately, this can only be done with pure materials, as the correctly mixed ratios required for proper alloy production are not possible. Only base materials such as iron, gold, or silver may be formed. Though some reagents may produce other results. It is inadvisable to attempt sintering on flammable or explosive reagents.

+ +

Pumps:

+

Pumps allow for the high volume exchange of reagents from one machine to another, but they are also useful for their multiple hose connectors. Allowing you to pump reagents from any other hose connector equipped tool. With this feature, they can serve as the input connection for long distance fracking networks.

+ +

Fluid Pumps:

+

While not directly a refinery machine, they serve a core function outside of the refinery. Fluid pumps will extract eroded ores from bodies of water near mineral rich deposits. Discussion of high value ores with an experienced miner is recommended. Ores must remain intact near a body of water to be collected by the pump.

+

Fluid pumps operate on an internal power cell, protected behind a water proof panel. A crowbar is handy for opening it. Hoses can be connected to a fluid pump, allowing it to connect to long distance tube networks.

+

Rarely, large cracks can be found underground, these complex networks of micro fractures can be pumped and drained repeatedly to expand them, and extract the dissolved ores deep within the ground. This process is described as fracking.

+ +

Pump Relay:

+

The location of external fluid pumps are often very far away from the chemical refinery they are destined for. Pump relays allow two input hoses, and one output hose. Active as a passive, no power required pump. Using the pressure of the other pumps at the head of the network. Pump relays may be spaced far apart, unlike refinery piping, saving crews time and expensive parts.

+ +

Waste Processors:

+

Many reagents have little use in huge quantities, such as water from a pumped river. This waste reagent may be disposed of quickly in a waste processor. Shredding it to an atomic level and dispersing it through nearby bluespace. Similar to what happens to opens dropped out of a shuttles bluespace shielding during flight.

+ +
+

OPERATIONAL GOALS

+

With the provided knowledge, anything is possible with the right reagents and machines. Reagents produced by the refinery are intended for sale from the station's cargo department. Reagents must be sold pure, and in a full cargo tanker. Each reagent has a different value and purpose on the market. For methods of reagent production, consult a trained chemist, or one of our trusted exonet partners; Such as BINGLE.

+ + + "} diff --git a/code/game/turfs/flooring/gas_cracks.dm b/code/game/turfs/flooring/gas_cracks.dm new file mode 100644 index 0000000000..2adbf8728c --- /dev/null +++ b/code/game/turfs/flooring/gas_cracks.dm @@ -0,0 +1,224 @@ +/************************************************************************ + * Mapper information: + * Intended for POI spawns, surrounded by mineral turf walls that DO NOT CAVEGEN + * These turfs must be surrounded by atmos of the exact same type, or be isolated + * by walls. They may be placed next to eachother freely. They do not use the planet's + * atmos. They start as compressed pockets of gas for miners to uncover. + * + * If these are given a /sif or other planet override they should be safe to use anywhere. + * As these cracks do not produce gas on their own. They just have the atmos at init, and + * produce gas when mined with a deep drill rig. + * + * Be careful when mapping them to avoid active edges. +************************************************************************/ + +/turf/simulated/floor/gas_crack + icon = 'icons/turf/flooring/asteroid.dmi' + desc = "Rough sand with a huge crack. It seems to be nothing in particular." + description_info = "Fluid pumps can be used to frack for reagents in nearby ores, and a mining drill can also bore through trapped gas deposits beneath it." + name = "cracked sand" + icon_state = "asteroid_cracked" + initial_flooring = /decl/flooring/rock + var/list/gas_type = null + 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 + while(i++ < 4) // Do this a few times + var/turf/simulated/mineral/M = pick(orange(5,src)) + if(!istype(M)) + return + for(var/metal in ore_types) + if(!M.resources[metal]) + return + var/list/ore_list = ore_types[metal] + if(!ore_list || !ore_list.len) + return + if(prob(60)) + var/reagent_id = pick(ore_list) + R.add_reagent(reagent_id, round(volume, 0.1)) + + +/turf/simulated/floor/gas_crack/oxygen + gas_type = list(GAS_O2) + oxygen = 500 + +/turf/simulated/floor/gas_crack/oxygen/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_OXYGEN, round(volume / 2, 0.1)) + +/turf/simulated/floor/gas_crack/oxygen/examine(mob/user) + . = ..() + . += "A strong breeze blows through it." + + +/turf/simulated/floor/gas_crack/nitrogen + gas_type = list(GAS_N2) + nitrogen = 500 + +/turf/simulated/floor/gas_crack/nitrogen/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_NITROGEN, round(volume / 2, 0.1)) + +/turf/simulated/floor/gas_crack/nitrogen/examine(mob/user) + . = ..() + . += "A stale breeze blows through it." + +/turf/simulated/floor/gas_crack/carbon + gas_type = list(GAS_CO2) + carbon_dioxide = 500 + +/turf/simulated/floor/gas_crack/carbon/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_CARBON, round(volume / 2, 0.1)) + +/turf/simulated/floor/gas_crack/carbon/examine(mob/user) + . = ..() + . += "A warm breeze blows through it." + +/turf/simulated/floor/gas_crack/nitro + gas_type = list(GAS_N2O) + nitrogen = 250 + carbon_dioxide = 250 + +/turf/simulated/floor/gas_crack/nitro/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_OXYGEN, round(volume / 3, 0.1)) + R.add_reagent(REAGENT_ID_NITROGEN, round(volume / 3, 0.1)) + +/turf/simulated/floor/gas_crack/nitro/examine(mob/user) + . = ..() + . += "A strange smell wafts from beneath it." + +/turf/simulated/floor/gas_crack/phoron + gas_type = list(GAS_PHORON) + phoron = 500 + +/turf/simulated/floor/gas_crack/phoron/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_PHORON, round(volume / 3, 0.1)) + +/turf/simulated/floor/gas_crack/phoron/examine(mob/user) + . = ..() + . += "A terrible smell wafts from beneath it." + +/turf/simulated/floor/gas_crack/air + gas_type = list(GAS_O2,GAS_N2) + oxygen = 250 + nitrogen = 250 + +/turf/simulated/floor/gas_crack/air/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_OXYGEN, round(volume / 2, 0.1)) + R.add_reagent(REAGENT_ID_NITROGEN, round(volume / 2, 0.1)) + +/turf/simulated/floor/gas_crack/air/examine(mob/user) + . = ..() + . += "A fresh breeze blows through it." + + +/turf/simulated/floor/gas_crack/terrible + gas_type = list(GAS_CO2,GAS_PHORON,GAS_N2O) + carbon_dioxide = 250 + phoron = 250 + +/turf/simulated/floor/gas_crack/terrible/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(REAGENT_ID_NITROGEN, round(volume / 2, 0.1)) + R.add_reagent(REAGENT_ID_SULFUR, round(volume / 2, 0.1)) + R.add_reagent(REAGENT_ID_PHOSPHORUS, round(volume / 2, 0.1)) + R.add_reagent(REAGENT_ID_PHORON, round(volume / 3, 0.1)) + +/turf/simulated/floor/gas_crack/terrible/examine(mob/user) + . = ..() + . += "A dangerous smell wafts from beneath it." + + + + +// a highly randomized version of the gascrack. Do not use the base type, use the planet atmo overrides. +/turf/simulated/floor/gas_crack/random + var/random_reagents = list() + gas_type = list() + +/turf/simulated/floor/gas_crack/random/Initialize(mapload, floortype) + . = ..() + // Set mined gas type + if(prob(15)) + gas_type.Add(GAS_CO2) + if(prob(15)) + gas_type.Add(GAS_PHORON) + if(prob(15)) + gas_type.Add(GAS_N2O) + if(prob(15)) + gas_type.Add(GAS_O2) + if(prob(15)) + gas_type.Add(GAS_N2) + if(!gas_type.len) + gas_type.Add(pick(list(GAS_CO2,GAS_PHORON,GAS_N2O,GAS_O2,GAS_N2))) + // Set fracking reagent + add_random_reagent() + if(prob(60)) + add_random_reagent() + if(prob(30)) + add_random_reagent() + if(prob(10)) + add_random_reagent() + if(prob(1)) + add_random_reagent() + if(prob(1)) + add_random_reagent() + +/turf/simulated/floor/gas_crack/random/proc/add_random_reagent() + random_reagents += pick(list(REAGENT_ID_NITROGEN, + REAGENT_ID_SULFUR, + REAGENT_ID_PHOSPHORUS, + REAGENT_ID_PHORON, + REAGENT_ID_COPPER, + REAGENT_ID_GOLD, + REAGENT_ID_IRON, + REAGENT_ID_NITROGEN, + REAGENT_ID_HYDROGEN, + REAGENT_ID_CARBON, + REAGENT_ID_MERCURY, + REAGENT_ID_LITHIUM, + REAGENT_ID_POTASSIUM, + REAGENT_ID_SILICON, + REAGENT_ID_SODIUMCHLORIDE, + REAGENT_ID_RADIUM, + REAGENT_ID_CALCIUM, + REAGENT_ID_CALCIUMCARBONATE, + REAGENT_ID_URANIUM, + REAGENT_ID_AMMONIA, + REAGENT_ID_FLUORINE, + REAGENT_ID_CHLORINE)) + +/turf/simulated/floor/gas_crack/random/pump_reagents(var/datum/reagents/R, var/volume) + . = ..() + R.add_reagent(pick(random_reagents), round(volume / 3, 0.1)) + R.add_reagent(pick(random_reagents), round(volume / 3, 0.1)) + R.add_reagent(pick(random_reagents), round(volume / 3, 0.1)) + +/turf/simulated/floor/gas_crack/random/examine(mob/user) + . = ..() + . += "An odd smell wafts from beneath it." diff --git a/code/modules/Phorochemistry/phororeagent.dm b/code/modules/Phorochemistry/phororeagent.dm index c175488dc0..96e5f05b1d 100644 --- a/code/modules/Phorochemistry/phororeagent.dm +++ b/code/modules/Phorochemistry/phororeagent.dm @@ -20,6 +20,8 @@ var/induromol_code = rand(1, 50) name = REAGENT_MUTAGENX description = "Seems as if it would induce instant, random mutations in a living humanoid" color = "#20E7F5" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/phororeagent/extreme_mutagen/on_mob_life(var/mob/living/M as mob) spawn(20) //give time to inject entire syringe if wanted @@ -76,6 +78,8 @@ var/induromol_code = rand(1, 50) id = REAGENT_ID_GENEDRAZINE name = REAGENT_GENEDRAZINE description = "Seems as if it would heal very quickly, but at the cost of genetic damage" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/phororeagent/genedrazine/on_mob_life(var/mob/living/M as mob, var/alien) var/healedDamage = 0 @@ -533,6 +537,8 @@ var/induromol_code = rand(1, 50) description = "Structure indicates it could purge living cells of non-essential reagents" color = "#8C4C3E" var/message_given = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/phororeagent/expulsicol/on_mob_life(var/mob/living/M as mob, var/alien) if(!message_given) @@ -619,6 +625,8 @@ var/induromol_code = rand(1, 50) name = REAGENT_SAPOFORMATOR description = "Enough units splashed on the ground would appear to have great cleaning effects" color = "#EEE139" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/phororeagent/sapoformator/reaction_obj(var/obj/O, var/volume) if(istype(O,/obj/effect/decal/cleanable)) @@ -833,6 +841,8 @@ var/induromol_code = rand(1, 50) name = REAGENT_OBSCURITOL description = "Exhibits strange electromagnetic properties" color = "#5D505E" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/phororeagent/obscuritol/initial_reaction(var/obj/item/reagent_containers/container, var/turf/T, var/volume, var/message) var/obj/machinery/light/L @@ -869,6 +879,8 @@ var/induromol_code = rand(1, 50) color = "#540E5C" metabolism = 5 * REM overdose = 15 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/phororeagent/oxyphoromin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_PAINKILLER, 600) @@ -1141,6 +1153,8 @@ nocturnol //Should give night vision, does not seem to work using this method of name = REAGENT_NOCTURNOL description = "Reagent bears strong resemblance to enzymes found in feline eyes" color = "#61E34F" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI on_mob_life(var/mob/living/M as mob, var/alien) M.see_in_dark = 50 diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm index 826f30dd5e..d605b08caf 100644 --- a/code/modules/mining/alloys.dm +++ b/code/modules/mining/alloys.dm @@ -44,7 +44,7 @@ ORE_SAND = 2 ) product = /obj/item/stack/material/glass/phoronglass -/* + /datum/alloy/bronze metaltag = MAT_BRONZE requires = list( @@ -52,4 +52,3 @@ ORE_TIN = 1 ) product = /obj/item/stack/material/bronze -*/ diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index db906eb661..332d311355 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -16,10 +16,12 @@ var/supported = 0 var/active = 0 var/list/resource_field = list() + var/list/gas_field = list() var/obj/item/radio/intercom/faultreporter var/drill_range = 5 var/offset = 2 var/current_capacity = 0 + var/drill_moles_per_tick = 0 var/list/stored_ore = list( ORE_SAND = 0, @@ -54,9 +56,9 @@ ORE_MHYDROGEN = /obj/item/ore/hydrogen, ORE_SAND = /obj/item/ore/glass, ORE_CARBON = /obj/item/ore/coal, - // ORE_COPPER = /obj/item/ore/copper, - // ORE_TIN = /obj/item/ore/tin, - // ORE_BAUXITE = /obj/item/ore/bauxite, + ORE_COPPER = /obj/item/ore/copper, + ORE_TIN = /obj/item/ore/tin, + ORE_BAUXITE = /obj/item/ore/bauxite, ORE_RUTILE = /obj/item/ore/rutile ) @@ -70,14 +72,14 @@ // Found with an advanced laser. exotic_drilling >= 1 var/list/ore_types_uncommon = list( ORE_MARBLE = /obj/item/ore/marble, - //ORE_PAINITE = /obj/item/ore/painite, - //ORE_QUARTZ = /obj/item/ore/quartz, + ORE_PAINITE = /obj/item/ore/painite, + ORE_QUARTZ = /obj/item/ore/quartz, ORE_LEAD = /obj/item/ore/lead ) // Found with an ultra laser. exotic_drilling >= 2 var/list/ore_types_rare = list( - //ORE_VOPAL = /obj/item/ore/void_opal, + ORE_VOPAL = /obj/item/ore/void_opal, ORE_VERDANTIUM = /obj/item/ore/verdantium ) @@ -155,7 +157,16 @@ if(ismineralturf(get_turf(src))) var/turf/simulated/mineral/M = get_turf(src) M.GetDrilled() - + // Extract gasses! + else if(istype(get_turf(src), /turf/simulated/floor/gas_crack)) + if(gas_field.len) + //Create gas mixture to hold data for passing + var/datum/gas_mixture/GM = new + for(var/gas in gas_field) + GM.adjust_multi(gas, drill_moles_per_tick) + GM.temperature = 423 // ~150C + var/atom/location = src.loc + location.assume_air(GM) else if(istype(get_turf(src), /turf/simulated)) var/turf/simulated/T = get_turf(src) T.ex_act(2.0) @@ -213,7 +224,8 @@ harvesting.turf_resource_types &= ~(TURF_HAS_MINERALS) harvesting.resources = null resource_field -= harvesting - else + + else if(!gas_field.len) // Won't stop digging if gas pressure is detected active = 0 need_player_check = 1 update_icon() @@ -366,7 +378,9 @@ /obj/machinery/mining/drill/proc/get_resource_field() resource_field = list() + gas_field = list() need_update_field = 0 + drill_moles_per_tick = 0 var/turf/T = get_turf(src) if(!istype(T)) return @@ -380,8 +394,15 @@ if(!istype(mine_turf, /turf/space/)) if(mine_turf && mine_turf.turf_resource_types & TURF_HAS_MINERALS) resource_field += mine_turf - - if(!resource_field.len) + // gas mining + if(istype(mine_turf,/turf/simulated/floor/gas_crack)) + // Get gasses the cracks around us could give! + var/turf/simulated/floor/gas_crack/G = mine_turf + if(!G.gas_type) + continue + drill_moles_per_tick += 2 + gas_field.Add(G.gas_type) + if(!resource_field.len && !gas_field.len) system_error("Resources depleted.") /obj/machinery/mining/drill/proc/use_cell_power() @@ -408,7 +429,7 @@ current_capacity = 0 // Set the amount of ore in the drill to 0. balloon_alert(usr, "onloaded cache into the ore box.") else - balloon_alert(usr, "move an ore box to the droll before unloading it.") + balloon_alert(usr, "move an ore box to the drill before unloading it.") /obj/machinery/mining/brace diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 6fd864e02e..8f9e25c69e 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -41,13 +41,13 @@ var/ore_type switch(metal) - if(ORE_SAND, ORE_CARBON, ORE_MARBLE, /*ORE_QUARTZ*/) ore_type = "surface minerals" - if(ORE_HEMATITE, /*ORE_TIN, ORE_COPPER, ORE_BAUXITE,*/ ORE_LEAD) ore_type = "industrial metals" - if(ORE_GOLD, ORE_SILVER, ORE_RUTILE) ore_type = "precious metals" - if(ORE_DIAMOND, /*ORE_PAINITE*/) ore_type = "precious gems" - if(ORE_URANIUM) ore_type = "nuclear fuel" - if(ORE_PHORON, ORE_PLATINUM, ORE_MHYDROGEN) ore_type = "exotic matter" - if(ORE_VERDANTIUM, /*ORE_VOPAL*/) ore_type = "anomalous matter" + if(ORE_SAND, ORE_CARBON, ORE_MARBLE, ORE_QUARTZ) ore_type = "surface minerals" + if(ORE_HEMATITE, ORE_TIN, ORE_COPPER, ORE_BAUXITE, ORE_LEAD) ore_type = "industrial metals" + if(ORE_GOLD, ORE_SILVER, ORE_RUTILE) ore_type = "precious metals" + if(ORE_DIAMOND, ORE_PAINITE) ore_type = "precious gems" + if(ORE_URANIUM) ore_type = "nuclear fuel" + if(ORE_PHORON, ORE_PLATINUM, ORE_MHYDROGEN) ore_type = "exotic matter" + if(ORE_VERDANTIUM, ORE_VOPAL) ore_type = "anomalous matter" if(ore_type) metals[ore_type] += T.resources[metal] diff --git a/code/modules/mining/machinery/machine_processing.dm b/code/modules/mining/machinery/machine_processing.dm index c924cc820d..d59d321ed9 100644 --- a/code/modules/mining/machinery/machine_processing.dm +++ b/code/modules/mining/machinery/machine_processing.dm @@ -164,7 +164,7 @@ var/active = FALSE var/points = 0 - var/points_mult = 1 //VOREStation Add - multiplier for points generated when ore hits the processors + var/points_mult = 1 //- multiplier for points generated when ore hits the processors var/static/list/ore_values = list( ORE_SAND = 1, ORE_HEMATITE = 1, @@ -185,7 +185,7 @@ ORE_LEAD = 40, ORE_MHYDROGEN = 40, ORE_VERDANTIUM = 60, - ORE_RUTILE = 40) //VOREStation Add + ORE_RUTILE = 40) /obj/machinery/mineral/processing_unit/Initialize(mapload) . = ..() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index b6ca713eb7..a56dcf2868 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -67,12 +67,12 @@ var/list/mining_overlay_cache = list() ORE_VERDANTIUM = /obj/item/ore/verdantium, ORE_MARBLE = /obj/item/ore/marble, ORE_LEAD = /obj/item/ore/lead, -// ORE_COPPER = /obj/item/ore/copper, -// ORE_TIN = /obj/item/ore/tin, -// ORE_BAUXITE = /obj/item/ore/bauxite, -// ORE_VOPAL = /obj/item/ore/void_opal, -// ORE_PAINITE = /obj/item/ore/painite, -// ORE_QUARTZ = /obj/item/ore/quartz, + ORE_COPPER = /obj/item/ore/copper, + ORE_TIN = /obj/item/ore/tin, + ORE_BAUXITE = /obj/item/ore/bauxite, + ORE_VOPAL = /obj/item/ore/void_opal, + ORE_PAINITE = /obj/item/ore/painite, + ORE_QUARTZ = /obj/item/ore/quartz, ORE_RUTILE = /obj/item/ore/rutile ) @@ -729,15 +729,15 @@ var/list/mining_overlay_cache = list() new /obj/item/stack/material/uranium(src, rand(5,25)) /turf/simulated/mineral/proc/make_ore(var/rare_ore) - if(mineral || ignore_mapgen || ignore_oregen) //VOREStation Edit - Makes sense, doesn't it? + if(mineral || ignore_mapgen || ignore_oregen) return var/mineral_name if(rare_ore) - mineral_name = pickweight(list(ORE_MARBLE = 5,/* ORE_QUARTZ = 15, ORE_COPPER = 10, ORE_TIN = 5, ORE_BAUXITE = 5*/, ORE_URANIUM = 15, ORE_PLATINUM = 20, ORE_HEMATITE = 15, ORE_RUTILE = 20, ORE_CARBON = 15, ORE_DIAMOND = 3, ORE_GOLD = 15, ORE_SILVER = 15, ORE_PHORON = 25, ORE_LEAD = 5,/* ORE_VOPAL = 1,*/ ORE_VERDANTIUM = 2/*, ORE_PAINITE = 1*/)) + mineral_name = pickweight(list(ORE_MARBLE = 5, ORE_QUARTZ = 15, ORE_COPPER = 10, ORE_TIN = 5, ORE_BAUXITE = 5, ORE_URANIUM = 15, ORE_PLATINUM = 20, ORE_HEMATITE = 15, ORE_RUTILE = 20, ORE_CARBON = 15, ORE_DIAMOND = 3, ORE_GOLD = 15, ORE_SILVER = 15, ORE_PHORON = 25, ORE_LEAD = 5, ORE_VOPAL = 1, ORE_VERDANTIUM = 2, ORE_PAINITE = 1)) else - mineral_name = pickweight(list(ORE_MARBLE = 3,/* ORE_QUARTZ = 10, ORE_COPPER = 20, ORE_TIN = 15, ORE_BAUXITE = 15*/, ORE_URANIUM = 10, ORE_PLATINUM = 10, ORE_HEMATITE = 70, ORE_RUTILE = 15, ORE_CARBON = 70, ORE_DIAMOND = 2, ORE_GOLD = 10, ORE_SILVER = 10, ORE_PHORON = 20, ORE_LEAD = 3,/* ORE_VOPAL = 1,*/ ORE_VERDANTIUM = 1/*, ORE_PAINITE = 1*/)) + mineral_name = pickweight(list(ORE_MARBLE = 3, ORE_QUARTZ = 10, ORE_COPPER = 20, ORE_TIN = 15, ORE_BAUXITE = 15, ORE_URANIUM = 10, ORE_PLATINUM = 10, ORE_HEMATITE = 70, ORE_RUTILE = 15, ORE_CARBON = 70, ORE_DIAMOND = 2, ORE_GOLD = 10, ORE_SILVER = 10, ORE_PHORON = 20, ORE_LEAD = 3, ORE_VOPAL = 1, ORE_VERDANTIUM = 1, ORE_PAINITE = 1)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 5d82ab3ab5..d38b5a5691 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -106,7 +106,7 @@ icon_state = "ore_lead" material = ORE_LEAD origin_tech = list(TECH_MATERIAL = 3) -/* + /obj/item/ore/copper name = "raw copper" icon_state = "ore_copper" @@ -121,12 +121,12 @@ name = "raw bauxite" icon_state = "ore_bauxite" material = ORE_BAUXITE -*/ + /obj/item/ore/rutile name = "raw rutile" icon_state = "ore_rutile" material = ORE_RUTILE -/* + /obj/item/ore/void_opal name = "raw void opal" icon_state = "ore_void_opal" @@ -141,7 +141,7 @@ name = "raw quartz" icon_state = "ore_quartz" material = ORE_QUARTZ -*/ + /obj/item/ore/slag name = "Slag" desc = "Someone screwed up..." @@ -159,7 +159,6 @@ else return ..() -//VOREStation Add /obj/item/ore/attack(mob/living/M as mob, mob/living/user as mob) if(M.handle_eat_minerals(src, user)) return @@ -169,7 +168,6 @@ if(user.handle_eat_minerals(src)) return ..() -//VOREStation Add End /obj/item/ore_chunk name = "ore chunk" diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 643c10d61d..e85dbdeaf4 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -36,7 +36,7 @@ "million" = 704 ) xarch_source_mineral = REAGENT_ID_POTASSIUM - reagent = REAGENT_ID_URANIUM + reagent = REAGENT_ID_RADIUM // Otherwise it emp pulses constantly with iron /ore/hematite name = ORE_HEMATITE @@ -158,6 +158,7 @@ "billion" = 13, "billion_lower" = 10 ) + reagent = REAGENT_ID_PHOSPHORUS /ore/marble name = ORE_MARBLE @@ -178,7 +179,7 @@ ore = /obj/item/ore/lead scan_icon = "mineral_rare" reagent = REAGENT_ID_LEAD -/* + /ore/copper name = ORE_COPPER display_name = ORE_COPPER @@ -199,6 +200,7 @@ spread_chance = 10 ore = /obj/item/ore/tin scan_icon = "mineral_common" + reagent = REAGENT_ID_TIN /ore/quartz name = ORE_QUARTZ @@ -208,6 +210,7 @@ spread_chance = 5 ore = /obj/item/ore/quartz scan_icon = "mineral_common" + reagent = REAGENT_ID_SILICON /ore/bauxite name = ORE_BAUXITE @@ -218,7 +221,7 @@ ore = /obj/item/ore/bauxite scan_icon = "mineral_common" reagent = REAGENT_ID_ALUMINIUM -*/ + /ore/rutile name = ORE_RUTILE display_name = ORE_RUTILE @@ -228,7 +231,8 @@ alloy = 1 ore = /obj/item/ore/rutile scan_icon = "mineral_uncommon" -/* + reagent = REAGENT_ID_TITANIUMDIOX + /ore/painite name = ORE_PAINITE display_name = "rough painite" @@ -237,6 +241,7 @@ spread_chance = 3 ore = /obj/item/ore/painite scan_icon = "mineral_rare" + reagent = REAGENT_ID_CALCIUM /ore/void_opal name = ORE_VOPAL @@ -246,4 +251,4 @@ spread_chance = 1 ore = /obj/item/ore/void_opal scan_icon = "mineral_rare" -*/ + reagent = REAGENT_ID_SULFUR diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm index 7f25d30a5e..5e84292715 100644 --- a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm +++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm @@ -21,6 +21,8 @@ reagent_state = LIQUID color = "#ffffff" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/glamour_transparent/affect_blood(var/mob/living/carbon/target, var/removed) if(!target.cloaked) @@ -58,6 +60,8 @@ color = "#ffffff" scannable = 1 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/glamour_scaling/affect_blood(var/mob/living/carbon/target, var/removed) if(!(/mob/living/proc/set_size in target.verbs)) @@ -90,6 +94,8 @@ reagent_state = LIQUID color = "#ffffff" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/glamour_twinkling/affect_blood(var/mob/living/carbon/human/target, var/removed) if(target.species.darksight < 10) diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm index a6bc02a037..0de24a5a57 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm @@ -71,6 +71,8 @@ mob/living/carbon/proc/charmed() //TODO color = "#8A0829" scannable = 0 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/succubi_aphrodisiac/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(prob(3)) @@ -86,6 +88,8 @@ mob/living/carbon/proc/charmed() //TODO metabolism = REM * 0.5 color = "#41029B" scannable = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/succubi_numbing/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -104,6 +108,8 @@ mob/living/carbon/proc/charmed() //TODO metabolism= REM * 0.5 color = "#41029B" scannable = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/succubi_paralize/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) //will first keep it like that. lets see what it changes. if nothing, than I will rework the effect again diff --git a/code/modules/mob/living/carbon/human/species/station/traits/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits/negative.dm index ad394e1cf4..34d21197a3 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits/negative.dm @@ -566,15 +566,15 @@ /datum/trait/negative/lonely/proc/handle_loneliness(var/mob/living/carbon/human/H) var/ms = "" if(H.loneliness_stage == escalation_speed) - ms = "[pick("Well.. No one is around you anymore...","Well.. You're alone now...","You suddenly feel alone...")]" // Outpost 21 edit - More variety + ms = "[pick("Well.. No one is around you anymore...","Well.. You're alone now...","You suddenly feel alone...")]" if(H.loneliness_stage >= 50) - ms = "[pick("You begin to feel alone...","You feel isolated...","You need company...","Where is everyone?...","You need to find someone...")]" // Outpost 21 edit - More variety + ms = "[pick("You begin to feel alone...","You feel isolated...","You need company...","Where is everyone?...","You need to find someone...")]" if(H.loneliness_stage >= 250) - ms = "[pick("You don't think you can last much longer without some visible company!", "You should go find someone to be with!","You need to find company!","Find someone to be with!")]" // Outpost 21 edit - More variety + ms = "[pick("You don't think you can last much longer without some visible company!", "You should go find someone to be with!","You need to find company!","Find someone to be with!")]" if(H.stuttering < hallucination_cap) H.stuttering += 5 if(H.loneliness_stage >= warning_cap) - ms = span_danger(span_bold("[pick("Where are the others?", "Please, there has to be someone nearby!", "I don't want to be alone!","Please, anyone! I don't want to be alone!")]")) // Outpost 21 edit - More variety + ms = span_danger(span_bold("[pick("Where are the others?", "Please, there has to be someone nearby!", "I don't want to be alone!","Please, anyone! I don't want to be alone!")]")) if(world.time < H.next_loneliness_time) return if(ms != "") diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index cb4287705a..83c90926c7 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -514,7 +514,6 @@ required_atmos_temp_max = 6000 probability = 40 -/* Currently missing Tin reagent /datum/particle_smasher_recipe/copper_gold display_name = MAT_GOLD + " from " + MAT_COPPER reagents = list(REAGENT_ID_TIN = 10) @@ -528,7 +527,6 @@ required_atmos_temp_min = 5000 required_atmos_temp_max = 8000 probability = 40 -*/ /datum/particle_smasher_recipe/hydrogen_deuterium display_name = MAT_DEUTERIUM + " from " + MAT_GRAPHITE diff --git a/code/modules/random_map/automata/caves.dm b/code/modules/random_map/automata/caves.dm index 20bbd2456b..d1d0770091 100644 --- a/code/modules/random_map/automata/caves.dm +++ b/code/modules/random_map/automata/caves.dm @@ -60,7 +60,6 @@ if(!current_cell) return 0 var/turf/simulated/mineral/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) - //VOREStation Edit Start if(istype(T) && !T.ignore_mapgen) if(!T.ignore_cavegen) if(map[current_cell] == FLOOR_CHAR) @@ -77,7 +76,6 @@ else if(map[current_cell] == EMPTY_CHAR) T.turf_resource_types |= TURF_HAS_RARE_ORE get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y)) - //VOREStation Edit End return T /datum/random_map/automata/cave_system/apply_to_map() diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index 074abe04fe..4a4e77345c 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -64,13 +64,13 @@ T.resources[ORE_MHYDROGEN] = 0 T.resources[ORE_VERDANTIUM] = 0 T.resources[ORE_LEAD] = 0 - //T.resources[ORE_COPPER] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - //T.resources[ORE_TIN] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) - //T.resources[ORE_BAUXITE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - T.resources[ORE_RUTILE] = 0 - //T.resources[ORE_VOPAL] = 0 - //T.resources[ORE_QUARTZ] = 0 - //T.resources[ORE_PAINITE] = 0 + T.resources[ORE_COPPER] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources[ORE_TIN] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources[ORE_BAUXITE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_RUTILE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_VOPAL] = 0 + T.resources[ORE_QUARTZ] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources[ORE_PAINITE] = 0 else if(current_cell < deep_val) // Rare metals. T.resources[ORE_GOLD] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources[ORE_SILVER] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) @@ -83,13 +83,13 @@ T.resources[ORE_DIAMOND] = 0 T.resources[ORE_HEMATITE] = 0 T.resources[ORE_MARBLE] = 0 - //T.resources[ORE_COPPER] = 0 - //T.resources[ORE_TIN] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - //T.resources[ORE_BAUXITE] = 0 - T.resources[ORE_RUTILE] = 0 - //T.resources[ORE_VOPAL] = 0 - //T.resources[ORE_QUARTZ] = 0 - //T.resources[ORE_PAINITE] = 0 + T.resources[ORE_COPPER] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_TIN] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + T.resources[ORE_BAUXITE] = 0 + T.resources[ORE_RUTILE] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources[ORE_VOPAL] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_QUARTZ] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_PAINITE] = 0 else // Deep metals. T.resources[ORE_URANIUM] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources[ORE_DIAMOND] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) @@ -102,13 +102,13 @@ T.resources[ORE_HEMATITE] = 0 T.resources[ORE_GOLD] = 0 T.resources[ORE_SILVER] = 0 - //T.resources[ORE_COPPER] = 0 - //T.resources[ORE_TIN] = 0 - //T.resources[ORE_BAUXITE] = 0 + T.resources[ORE_COPPER] = 0 + T.resources[ORE_TIN] = 0 + T.resources[ORE_BAUXITE] = 0 T.resources[ORE_RUTILE] = 0 - //T.resources[ORE_VOPAL] = 0 - //T.resources[ORE_QUARTZ] = 0 - //T.resources[ORE_PAINITE] = 0 + T.resources[ORE_VOPAL] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_QUARTZ] = 0 + T.resources[ORE_PAINITE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) return /datum/random_map/noise/ore/get_map_char(var/value) diff --git a/code/modules/reagents/holder/holder.dm b/code/modules/reagents/holder/holder.dm index 206a50c27c..daa2810cf6 100644 --- a/code/modules/reagents/holder/holder.dm +++ b/code/modules/reagents/holder/holder.dm @@ -283,17 +283,18 @@ //not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). //If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), //call the appropriate trans_to_*() proc. -/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) +/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/force_open_container = FALSE) //CHOMPEdit Start, do not splash brains! if(ismob(target) && !isbrain(target)) return splash_mob(target, amount * multiplier, copy) //CHOMPEdit End touch(target, amount * multiplier) //First, handle mere touch effects + if(ismob(target)) return splash_mob(target, amount * multiplier, copy) //Touch effects handled by splash_mob if(isturf(target)) return trans_to_turf(target, amount, multiplier, copy) - if(isobj(target) && target.is_open_container() && !isbelly(target.loc)) + if(isobj(target) && (target.is_open_container() || force_open_container) && !isbelly(target.loc)) return trans_to_obj(target, amount, multiplier, copy) return 0 @@ -337,7 +338,7 @@ else if (istype(target, /datum/reagents)) return F.trans_to_holder(target, amount) -/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) +/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1, var/force_open_container = FALSE) if (!target || !target.reagents) return @@ -351,7 +352,7 @@ F.add_reagent(id, amount, tmpdata) remove_reagent(id, amount) - return F.trans_to(target, amount) // Let this proc check the atom's type + return F.trans_to(target, amount, force_open_container = force_open_container) // Let this proc check the atom's type // When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. // This does not handle transferring reagents to things. diff --git a/code/modules/reagents/machinery/grinder.dm b/code/modules/reagents/machinery/grinder.dm index 063775517a..e66fbf31a2 100644 --- a/code/modules/reagents/machinery/grinder.dm +++ b/code/modules/reagents/machinery/grinder.dm @@ -1,5 +1,4 @@ /obj/machinery/reagentgrinder - name = "All-In-One Grinder" desc = "Grinds stuff into itty bitty bits." icon = 'icons/obj/kitchen.dmi' @@ -205,59 +204,7 @@ inuse = 0 // Process. - for (var/obj/item/O in holdingitems) - //CHOMPedit start - if(istype(O,/obj/item/stack/material/supermatter)) - var/regrets = 0 - for(var/obj/item/stack/material/supermatter/S in holdingitems) - regrets += S.get_amount() - puny_protons(regrets) - return - //CHOMPedit end - - var/remaining_volume = beaker.reagents.maximum_volume - beaker.reagents.total_volume - if(remaining_volume <= 0) - break - - if(GLOB.sheet_reagents[O.type]) - 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))) - if(amount_to_take) - stack.use(amount_to_take) - if(QDELETED(stack)) - holdingitems -= stack - if(islist(sheet_components)) - amount_to_take = (amount_to_take/(sheet_components.len)) - for(var/i in sheet_components) - beaker.reagents.add_reagent(i, (amount_to_take*REAGENTS_PER_SHEET)) - else - beaker.reagents.add_reagent(sheet_components, (amount_to_take*REAGENTS_PER_SHEET)) - continue - - if(GLOB.ore_reagents[O.type]) - var/obj/item/ore/R = O - if(istype(R)) - var/list/ore_components = GLOB.ore_reagents[R.type] - if(remaining_volume >= REAGENTS_PER_ORE) - holdingitems -= R - qdel(R) - if(islist(ore_components)) - var/amount_to_take = (REAGENTS_PER_ORE/(ore_components.len)) - for(var/i in ore_components) - beaker.reagents.add_reagent(i, amount_to_take) - else - beaker.reagents.add_reagent(ore_components, REAGENTS_PER_ORE) - continue - - if(O.reagents) - O.reagents.trans_to_obj(beaker, min(O.reagents.total_volume, remaining_volume)) - if(O.reagents.total_volume == 0) - holdingitems -= O - qdel(O) - if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) - break + grind_items_to_reagents(holdingitems,beaker.reagents) /obj/machinery/reagentgrinder/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) if(!user) @@ -272,24 +219,3 @@ beaker = new_beaker update_icon() return TRUE - -// CHOMPedit start: Repurposed coffee grinders and supermatter do not mix. -/obj/machinery/reagentgrinder/proc/puny_protons(regrets = 0) - set_light(0) - if(regrets > 0) // If you thought grinding supermatter would end well. Values taken from ex_act() for the supermatter stacks. - SSradiation.radiate(get_turf(src), 15 + regrets * 4) - explosion(get_turf(src), round(regrets / 12) , round(regrets / 6), round(regrets / 3), round(regrets / 25)) - qdel(src) - return - - else // If you added supermatter but didn't try grinding it, or somehow this is negative. - for(var/obj/item/stack/material/supermatter/S in holdingitems) - S.loc = src.loc - holdingitems -= S - regrets += S.get_amount() - SSradiation.radiate(get_turf(src), 15 + regrets) - visible_message(span_warning("\The [src] glows brightly, bursting into flames and flashing into ash."),\ - span_warning("You hear an unearthly shriek, burning heat washing over you.")) - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) -// CHOMPedit end diff --git a/code/modules/reagents/reactions/distilling/crystalizing.dm b/code/modules/reagents/reactions/distilling/crystalizing.dm new file mode 100644 index 0000000000..0efd0a4c25 --- /dev/null +++ b/code/modules/reagents/reactions/distilling/crystalizing.dm @@ -0,0 +1,28 @@ +// Crystalizing (temps under 0) +/decl/chemical_reaction/distilling/sugar + name = "Crystalizing Sugar" + id = "distill_sugar" + result = REAGENT_ID_SUGAR + required_reagents = list(REAGENT_ID_CARBON = 5) + catalysts = list(REAGENT_ID_WATER = 1, REAGENT_ID_SUGAR = 1) // Rebuild the crystals! + result_amount = 0.5 + + temp_range = list(T0C -10, T0C -5) // crystal growth + temp_shift = -1 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_O2 + +/decl/chemical_reaction/distilling/fuel_phoron + name = "Crystalizing Phoron" + id = "distill_phoron_fuel" + result = REAGENT_ID_PHORON + required_reagents = list(REAGENT_ID_FUEL = 1, REAGENT_ID_MERCURY = 1) + catalysts = list(REAGENT_ID_PHORON = 1) // Rebuild the crystals! + result_amount = 0.5 + + temp_range = list(T0C -70, T0C -25) // crystal growth + temp_shift = 1 + + require_xgm_gas = GAS_N2 + rejects_xgm_gas = GAS_O2 diff --git a/code/modules/reagents/reactions/distilling/distilling.dm b/code/modules/reagents/reactions/distilling/distilling.dm index 09bf8f219e..f906af689c 100644 --- a/code/modules/reagents/reactions/distilling/distilling.dm +++ b/code/modules/reagents/reactions/distilling/distilling.dm @@ -26,25 +26,67 @@ var/list/temp_range = list(T0C, T20C) var/temp_shift = 0 // How much the temperature changes when the reaction occurs. + var/require_xgm_gas = null + var/rejects_xgm_gas = null + var/maximum_xgm_pressure = null + var/minimum_xgm_pressure = null + var/consumes_xgm_gas = 0 // Mols of gas consumed during reaction + /decl/chemical_reaction/distilling/can_happen(var/datum/reagents/holder) - if(!istype(holder, /datum/reagents/distilling) || !istype(holder.my_atom, /obj/machinery/portable_atmospherics/powered/reagent_distillery)) + if(!istype(holder, /datum/reagents/distilling)) return FALSE - // Super special temperature check. - var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = holder.my_atom - if(RD.current_temp < temp_range[1] || RD.current_temp > temp_range[2]) - return FALSE + // return_air() will get the current turf for most things unless overriden to use a tank or such! + var/datum/gas_mixture/GM = holder.my_atom.return_air() + if(require_xgm_gas || rejects_xgm_gas || minimum_xgm_pressure || maximum_xgm_pressure) + if(!GM) + return + if(require_xgm_gas && GM.gas[require_xgm_gas] <= 10) // If have required gas to react + return + if(rejects_xgm_gas && GM.gas[rejects_xgm_gas] >= 1) // If blocked by a gas it doesn't like + return + if(minimum_xgm_pressure && GM.return_pressure() < minimum_xgm_pressure) + return + if(maximum_xgm_pressure && GM.return_pressure() > maximum_xgm_pressure) + return + + // Special distilling conditions must be met, each object has different vars to meet it though. + if(istype(holder.my_atom,/obj/distilling_tester)) + // Unit test needs some special handholding + var/obj/distilling_tester/DD = holder.my_atom + if(DD.current_temp < temp_range[1] || DD.current_temp > temp_range[2]) + return FALSE + else if(istype(holder.my_atom,/obj/machinery/portable_atmospherics/powered/reagent_distillery)) + // Super special temperature check. + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = holder.my_atom + if(RD.current_temp < temp_range[1] || RD.current_temp > temp_range[2]) + return FALSE + else if(istype(holder.my_atom, /obj/machinery/reagent_refinery/reactor)) + // Check gas temp for refinery + if(!GM || GM.temperature < temp_range[1] || GM.temperature > temp_range[2]) + return FALSE return ..() -/* /decl/chemical_reaction/distilling/on_reaction(var/datum/reagents/holder, var/created_volume) - if(istype(holder.my_atom, /obj/item/reagent_containers/glass/distilling)) - var/obj/item/reagent_containers/glass/distilling/D = holder.my_atom - var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = D.Master - RD.current_temp += temp_shift - return -*/ + // Handle gas consumption + var/datum/gas_mixture/GM = holder.my_atom.return_air() + if(consumes_xgm_gas != 0 && GM) + GM.adjust_gas(require_xgm_gas,-consumes_xgm_gas, TRUE) + + // Distilling can change gas temps, handle it here. + if(temp_shift != 0) + if(istype(holder.my_atom,/obj/distilling_tester)) + return + // Special handling for this + if(istype(holder.my_atom,/obj/machinery/portable_atmospherics/powered/reagent_distillery)) + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = holder.my_atom + RD.current_temp += temp_shift + return + // Change gas temps + if(!GM) + return + GM.add_thermal_energy(temp_shift * 1000) // Subtypes // @@ -151,6 +193,17 @@ temp_shift = 0.5 temp_range = list(T0C + 7, T0C + 13) +/decl/chemical_reaction/distilling/ethanol + name = "Distilling Ethanol" + id = "distill_ethanol" + result = REAGENT_ID_ETHANOL + required_reagents = list(REAGENT_ID_NUTRIMENT = 1, REAGENT_ID_WATER = 1, REAGENT_ID_SUGAR = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(30) + + temp_range = list(T20C+30, T20C + 40) + // Unique /decl/chemical_reaction/distilling/berserkjuice name = "Distilling Brute Juice" @@ -214,3 +267,71 @@ reaction_rate = HALF_LIFE(20) temp_range = list(T0C + 90, T0C + 95) + +/decl/chemical_reaction/distilling/hydrogen + name = "Distilling Hydrogen" + id = "distill_hydrogen" + result = REAGENT_ID_HYDROGEN + inhibitors = list(REAGENT_ID_CARBON = 1) + required_reagents = list(REAGENT_ID_WATER = 1) + result_amount = 2 + + temp_range = list(T20C + 110, T20C + 290) + temp_shift = 3 // It's burning off phoron + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_O2 + +/decl/chemical_reaction/distilling/oxygen + name = "Distilling Oxygen" + id = "distill_oxygen" + result = REAGENT_ID_OXYGEN + inhibitors = list(REAGENT_ID_CARBON = 1) + required_reagents = list(REAGENT_ID_WATER = 1) + catalysts = list(REAGENT_ID_PHORON = 1) + result_amount = 1 + + temp_range = list(T20C + 150, T20C + 320) + temp_shift = 3 // It's burning off phoron + + require_xgm_gas = GAS_N2 + rejects_xgm_gas = GAS_O2 + +/decl/chemical_reaction/distilling/mineralized_sodium + name = "Distilling Sodium" + id = "distill_sodium" + result = REAGENT_ID_SODIUM + required_reagents = list(REAGENT_ID_MINERALIZEDFLUID = 1) + result_amount = 1 + + temp_range = list(T20C + 600, T20C + 800) + temp_shift = -1 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_O2 + +/decl/chemical_reaction/distilling/mineralized_carbon + name = "Distilling Carbon" + id = "distill_carbon" + result = REAGENT_ID_CARBON + required_reagents = list(REAGENT_ID_MINERALIZEDFLUID = 1) + result_amount = 1 + + temp_range = list(T20C + 400, T20C + 800) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/reduce_salt + name = "Distilling Sodium" + id = "distill_reduce_tablesalt" + result = REAGENT_ID_SODIUM + required_reagents = list(REAGENT_ID_SODIUMCHLORIDE = 1) + result_amount = 1 + + temp_range = list(T20C + 800, T20C + 1000) + temp_shift = -1 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_O2 diff --git a/code/modules/reagents/reactions/distilling/gas_condensing.dm b/code/modules/reagents/reactions/distilling/gas_condensing.dm new file mode 100644 index 0000000000..959096ef93 --- /dev/null +++ b/code/modules/reagents/reactions/distilling/gas_condensing.dm @@ -0,0 +1,101 @@ +// Condensing atmo gasses into reagents +// If there is ever work done converting atmogas back and forth from reagent to gas then this should be tuned to avoid creating something from nothing! +#define CONDENSING_RATE 50 +#define CONDENSING_RESULT 0.5 +#define CONDENSING_HEAT 2 +#define COOLANT_CONSUMPTION_RATE 0.01 + +/decl/chemical_reaction/distilling/condense_oxygen + name = "Condensing Oxygen" + id = "condense_oxygen" + result = REAGENT_ID_OXYGEN + required_reagents = list(REAGENT_ID_COOLANT = COOLANT_CONSUMPTION_RATE) + inhibitors = list(REAGENT_ID_OXYGEN = 0.1) // Used to limit the reaction + result_amount = CONDENSING_RESULT + + temp_range = list(54.36, 90.19) // kelvin + temp_shift = CONDENSING_HEAT + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + consumes_xgm_gas = CONDENSING_RATE + +/decl/chemical_reaction/distilling/condense_nitrogen + name = "Condensing Nitrogen" + id = "condense_nitrogen" + result = REAGENT_ID_NITROGEN + required_reagents = list(REAGENT_ID_COOLANT = COOLANT_CONSUMPTION_RATE) + inhibitors = list(REAGENT_ID_NITROGEN = 0.1) // Used to limit the reaction + result_amount = CONDENSING_RESULT + + temp_range = list(63.15, 77.36) // kelvin + temp_shift = CONDENSING_HEAT + + require_xgm_gas = GAS_N2 + rejects_xgm_gas = GAS_PHORON + consumes_xgm_gas = CONDENSING_RATE + +/decl/chemical_reaction/distilling/condense_nitrox + name = "Condensing Nitrous Oxide" + id = "condense_nitro" + result = REAGENT_ID_NITROGEN // Figure out something better + required_reagents = list(REAGENT_ID_COOLANT = COOLANT_CONSUMPTION_RATE) + inhibitors = list(REAGENT_ID_NITROGEN = 0.1) // Used to limit the reaction + result_amount = CONDENSING_RESULT + + temp_range = list(0, 182.3) // kelvin + temp_shift = CONDENSING_HEAT + + require_xgm_gas = GAS_N2O + rejects_xgm_gas = GAS_PHORON + consumes_xgm_gas = CONDENSING_RATE + +/decl/chemical_reaction/distilling/condense_carbon + name = "Condensing Carbon Dioxide" + id = "condense_carbon" + result = REAGENT_ID_CARBON + required_reagents = list(REAGENT_ID_COOLANT = COOLANT_CONSUMPTION_RATE) + inhibitors = list(REAGENT_ID_CARBON = 0.1) // Used to limit the reaction + result_amount = CONDENSING_RESULT + + temp_range = list(54.36, 90.19) // kelvin + temp_shift = CONDENSING_HEAT + + require_xgm_gas = GAS_CO2 + rejects_xgm_gas = GAS_PHORON + consumes_xgm_gas = CONDENSING_RATE + +/decl/chemical_reaction/distilling/condense_phoron + name = "Condensing Phoron" + id = "condense_phoron" + result = REAGENT_ID_PHORON + required_reagents = list(REAGENT_ID_COOLANT = COOLANT_CONSUMPTION_RATE) + inhibitors = list(REAGENT_ID_PHORON = 0.1) // Used to limit the reaction + result_amount = CONDENSING_RESULT + + temp_range = list(14.60, 52.99) // kelvin + temp_shift = CONDENSING_HEAT + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_O2 + consumes_xgm_gas = CONDENSING_RATE + +/decl/chemical_reaction/distilling/condense_fuel + name = "Condensing Volatiles" + id = "condense_fuel" + result = REAGENT_ID_FUEL + required_reagents = list(REAGENT_ID_COOLANT = COOLANT_CONSUMPTION_RATE) + inhibitors = list(REAGENT_ID_FUEL = 0.1) // Used to limit the reaction + result_amount = CONDENSING_RESULT + + temp_range = list(91.60, 120.19) // kelvin + temp_shift = CONDENSING_HEAT + + require_xgm_gas = GAS_VOLATILE_FUEL + rejects_xgm_gas = GAS_O2 + consumes_xgm_gas = CONDENSING_RATE + +#undef CONDENSING_RATE +#undef CONDENSING_RESULT +#undef CONDENSING_HEAT +#undef COOLANT_CONSUMPTION_RATE diff --git a/code/modules/reagents/reactions/distilling/heavy_industrial.dm b/code/modules/reagents/reactions/distilling/heavy_industrial.dm new file mode 100644 index 0000000000..0f477b3276 --- /dev/null +++ b/code/modules/reagents/reactions/distilling/heavy_industrial.dm @@ -0,0 +1,187 @@ +// Heavy chemicals +/decl/chemical_reaction/distilling/titanium_refine + name = REAGENT_TITANIUM + id = "distill_titanium" + result = REAGENT_ID_TITANIUM + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_CHLORINE = 4, REAGENT_ID_SODIUM = 1) + result_amount = 1 + + temp_range = list(T20C + 900, T20C + 1100) + temp_shift = -1 + + require_xgm_gas = GAS_N2 + rejects_xgm_gas = GAS_O2 + +/decl/chemical_reaction/distilling/concentrate_radium + name = REAGENT_CONCENTRATEDRADIUM + id = "distill_conrad" + result = REAGENT_ID_CONCENTRATEDRADIUM + required_reagents = list(REAGENT_ID_RADIUM = 5, REAGENT_ID_LEAD = 1) + catalysts = list(REAGENT_ID_URANIUM = 1) + result_amount = 1 + + temp_range = list(T20C + 1500, T20C + 2000) + temp_shift = -1 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_N2 + +/decl/chemical_reaction/distilling/cyanide + name = REAGENT_CYANIDE + id = "distill_cyanide" + result = REAGENT_ID_CYANIDE + required_reagents = list(REAGENT_ID_CARBON = 1, REAGENT_ID_NITROGEN = 1, REAGENT_ID_WATER = 2) + result_amount = 1 + + temp_range = list(T0C + 150, T0C + 170) + temp_shift = 0 + + require_xgm_gas = GAS_N2 + rejects_xgm_gas = GAS_O2 + +/decl/chemical_reaction/distilling/sacid + name = REAGENT_SACID + id = "distill_sacid" + result = REAGENT_ID_SACID + required_reagents = list(REAGENT_ID_HYDROGEN = 2, REAGENT_ID_SULFUR = 1) + result_amount = 1 + + temp_range = list(T0C + 200, T0C + 300) + temp_shift = 5 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_N2 + +/decl/chemical_reaction/distilling/toxin + name = REAGENT_TOXIN + id = "distill_rawtoxin" + result = REAGENT_ID_TOXIN + required_reagents = list(REAGENT_ID_SACID = 2, REAGENT_ID_CYANIDE = 1) + result_amount = 1 + + temp_range = list(T0C + 120, T0C + 580) + temp_shift = 2 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_N2 + + +// Marker ink for paint production +/decl/chemical_reaction/distilling/marker_ink_black + name = REAGENT_MARKERINKBLACK + id = "distill_marker_black" + result = REAGENT_ID_MARKERINKBLACK + required_reagents = list(REAGENT_ID_LUBE = 1, REAGENT_ID_ETHANOL = 1, REAGENT_ID_CARBON = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_red + name = REAGENT_MARKERINKRED + id = "distill_marker_red" + result = REAGENT_ID_MARKERINKRED + required_reagents = list(REAGENT_ID_LUBE = 1, REAGENT_ID_ETHANOL = 1, REAGENT_ID_IRON = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_yellow + name = REAGENT_MARKERINKYELLOW + id = "distill_marker_yellow" + result = REAGENT_ID_MARKERINKYELLOW + required_reagents = list(REAGENT_ID_LUBE = 1, REAGENT_ID_ETHANOL = 1, REAGENT_ID_SULFUR = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_green + name = REAGENT_MARKERINKGREEN + id = "distill_marker_green" + result = REAGENT_ID_MARKERINKGREEN + required_reagents = list(REAGENT_ID_LUBE = 1, REAGENT_ID_ETHANOL = 1, REAGENT_ID_COPPER = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_blue + name = REAGENT_MARKERINKBLUE + id = "distill_marker_blue" + result = REAGENT_ID_MARKERINKBLUE + required_reagents = list(REAGENT_ID_LUBE = 1, REAGENT_ID_ETHANOL = 1, REAGENT_ID_PRUSSIANBLUE = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_grey + name = REAGENT_MARKERINKGREY + id = "distill_marker_grey" + result = REAGENT_ID_MARKERINKGREY + required_reagents = list(REAGENT_ID_LUBE = 1, REAGENT_ID_ETHANOL = 1, REAGENT_ID_TIN = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + + +// Secondary distillation for markers +/decl/chemical_reaction/distilling/marker_ink_orange + name = REAGENT_MARKERINKORANGE + id = "distill_marker_orange" + result = REAGENT_ID_MARKERINKORANGE + required_reagents = list(REAGENT_ID_MARKERINKRED = 1, REAGENT_ID_MARKERINKYELLOW = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_purple + name = REAGENT_MARKERINKPURPLE + id = "distill_marker_purple" + result = REAGENT_ID_MARKERINKPURPLE + required_reagents = list(REAGENT_ID_MARKERINKRED = 1, REAGENT_ID_MARKERINKBLUE = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/marker_ink_brown + name = REAGENT_MARKERINKBROWN + id = "distill_marker_brown" + result = REAGENT_ID_MARKERINKBROWN + required_reagents = list(REAGENT_ID_MARKERINKRED = 1, REAGENT_ID_MARKERINKGREY = 1) + result_amount = 1 + + temp_range = list(T20C + 90, T20C + 160) + temp_shift = -1 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON diff --git a/code/modules/reagents/reactions/distilling/hydroponics.dm b/code/modules/reagents/reactions/distilling/hydroponics.dm new file mode 100644 index 0000000000..9f340eff3c --- /dev/null +++ b/code/modules/reagents/reactions/distilling/hydroponics.dm @@ -0,0 +1,52 @@ +// Hydroponics refinery fun +/decl/chemical_reaction/distilling/fertilizer + name = REAGENT_FERTILIZER + id = "distill_fertilizer" + result = REAGENT_ID_FERTILIZER + required_reagents = list(REAGENT_ID_WATER = 5, REAGENT_ID_NUTRIMENT = 1, REAGENT_ID_PHOSPHORUS = 1, REAGENT_ID_SULFUR = 1) + result_amount = 3 + + temp_range = list(T20C + 40, T20C + 60) + temp_shift = 0 + + require_xgm_gas = GAS_CO2 + rejects_xgm_gas = GAS_N2 + +/decl/chemical_reaction/distilling/eznutrient + name = REAGENT_EZNUTRIENT + id = "distill_eznutriment" + result = REAGENT_ID_EZNUTRIENT + required_reagents = list(REAGENT_ID_FERTILIZER = 1, REAGENT_ID_CALCIUM = 1, REAGENT_ID_CARBON = 2) + result_amount = 1 + + temp_range = list(T0C + 10, T0C + 50) + temp_shift = 0 + + require_xgm_gas = GAS_O2 + rejects_xgm_gas = GAS_PHORON + +/decl/chemical_reaction/distilling/leftforzed + name = REAGENT_LEFT4ZED + id = "distill_leftforzed" + result = REAGENT_ID_LEFT4ZED + required_reagents = list(REAGENT_ID_FERTILIZER = 1, REAGENT_ID_RADIUM = 2, REAGENT_ID_CALCIUM = 2) + result_amount = 1 + + temp_range = list(T0C + 40, T0C + 80) + temp_shift = 2 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_N2 + +/decl/chemical_reaction/distilling/robustharvest + name = REAGENT_ROBUSTHARVEST + id = "distill_robustharvest" + result = REAGENT_ID_ROBUSTHARVEST + required_reagents = list(REAGENT_ID_FERTILIZER = 1, REAGENT_ID_CARBON = 2, REAGENT_ID_BICARIDINE = 1) + result_amount = 1 + + temp_range = list(T0C + 40, T0C + 80) + temp_shift = 2 + + require_xgm_gas = GAS_PHORON + rejects_xgm_gas = GAS_N2 diff --git a/code/modules/reagents/reactions/instant/instant.dm b/code/modules/reagents/reactions/instant/instant.dm index 39d03c648a..eb6effe2bc 100644 --- a/code/modules/reagents/reactions/instant/instant.dm +++ b/code/modules/reagents/reactions/instant/instant.dm @@ -11,6 +11,7 @@ id = REAGENT_ID_INAPROVALINE result = REAGENT_ID_INAPROVALINE required_reagents = list(REAGENT_ID_OXYGEN = 1, REAGENT_ID_CARBON = 1, REAGENT_ID_SUGAR = 1) + inhibitors = list(REAGENT_ID_WATER = 1) result_amount = 3 /decl/chemical_reaction/instant/dylovene @@ -140,6 +141,7 @@ id = REAGENT_ID_KELOTANE result = REAGENT_ID_KELOTANE required_reagents = list(REAGENT_ID_SILICON = 1, REAGENT_ID_CARBON = 1) + inhibitors = list(REAGENT_ID_WATER = 1) result_amount = 2 log_is_important = 1 @@ -494,6 +496,7 @@ id = REAGENT_ID_SODIUMCHLORIDE result = REAGENT_ID_SODIUMCHLORIDE required_reagents = list(REAGENT_ID_SODIUM = 1, REAGENT_ID_CHLORINE = 1) + inhibitors = list(REAGENT_ID_COPPER = 1) result_amount = 2 /decl/chemical_reaction/instant/condensedcapsaicin @@ -524,6 +527,7 @@ id = REAGENT_ID_LEXORIN result = REAGENT_ID_LEXORIN required_reagents = list(REAGENT_ID_PHORON = 1, REAGENT_ID_HYDROGEN = 1, REAGENT_ID_NITROGEN = 1) + inhibitors = list(REAGENT_ID_COPPER = 1) result_amount = 3 /decl/chemical_reaction/instant/methylphenidate @@ -1217,7 +1221,7 @@ id = REAGENT_ID_HYDROPHORON result = REAGENT_ID_HYDROPHORON required_reagents = list(REAGENT_ID_HYDROGEN = 1, REAGENT_ID_PHORON = 1) - inhibitors = list(REAGENT_ID_NITROGEN = 1) //So it doesn't mess with lexorin + inhibitors = list(REAGENT_ID_NITROGEN = 1, REAGENT_ID_COPPER = 1) //So it doesn't mess with lexorin result_amount = 2 /decl/chemical_reaction/instant/deuterium @@ -1287,3 +1291,201 @@ result = REAGENT_ID_ASUSTENANCE required_reagents = list(REAGENT_ID_NUTRIMENT = 1, REAGENT_ID_MUTAGEN = 1, REAGENT_ID_PHORON = 1) result_amount = 1 + +/decl/chemical_reaction/instant/titanium_oxidation + name = REAGENT_TITANIUMDIOX + id = "oxidize_titanium" + result = REAGENT_ID_TITANIUMDIOX + required_reagents = list(REAGENT_ID_TITANIUM = 1, REAGENT_ID_OXYGEN = 2) + result_amount = 1 + +/* Metallic paints */ +/decl/chemical_reaction/instant/metal_paint + name = "Metallic white paint" + id = "metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINK = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/metal_paint/send_data() + return "#b2d1da" + +/decl/chemical_reaction/instant/red_metal_paint + name = "Metallic red paint" + id = "red_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKRED = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/red_metal_paint/send_data() + return "#ff7a7a" + +/decl/chemical_reaction/instant/orange_metal_paint + name = "Metallic orange paint" + id = "orange_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKORANGE = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/orange_metal_paint/send_data() + return "#ffd690" + +/decl/chemical_reaction/instant/yellow_metal_paint + name = "Metallic yellow paint" + id = "yellow_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKYELLOW = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/yellow_metal_paint/send_data() + return "#ffffab" + +/decl/chemical_reaction/instant/green_metal_paint + name = "Metallic green paint" + id = "green_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKGREEN = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/green_metal_paint/send_data() + return "#69d76b" + +/decl/chemical_reaction/instant/blue_metal_paint + name = "Metallic blue paint" + id = "blue_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKBLUE = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/blue_metal_paint/send_data() + return "#81aff5" + +/decl/chemical_reaction/instant/purple_metal_paint + name = "Metallic purple paint" + id = "purple_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKPURPLE = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/purple_metal_paint/send_data() + return "#e77acc" + +/decl/chemical_reaction/instant/brown_metal_paint + name = "Metallic brown paint" + id = "brown_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_MARKERINKBROWN = 1) + result_amount = 5 + +/decl/chemical_reaction/instant/brown_metal_paint/send_data() + return "#827655" + +/decl/chemical_reaction/instant/orange_juice_metal_paint + name = "Metallic orange juice paint" + id = "orange_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_ORANGEJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/orange_juice_metal_paint/send_data() + return "#e2a254" + +/decl/chemical_reaction/instant/tomato_juice_metal_paint + name = "Metallic tomato juice paint" + id = "tomato_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_TOMATOJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/tomato_juice_metal_paint/send_data() + return "#934e49" + +/decl/chemical_reaction/instant/lime_juice_metal_paint + name = "Metallic lime juice paint" + id = "lime_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_LIMEJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/lime_juice_metal_paint/send_data() + return "#556c51" + +/decl/chemical_reaction/instant/carrot_juice_metal_paint + name = "Metallic carrot juice paint" + id = "carrot_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_CARROTJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/carrot_juice_metal_paint/send_data() + return "#a06a4b" + +/decl/chemical_reaction/instant/berry_juice_metal_paint + name = "Metallic berry juice paint" + id = "berry_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_BERRYJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/berry_juice_metal_paint/send_data() + return "#ae5892" + +/decl/chemical_reaction/instant/grape_juice_metal_paint + name = "Metallic grape juice paint" + id = "grape_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_GRAPEJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/grape_juice_metal_paint/send_data() + return "#925e5e" + +/decl/chemical_reaction/instant/poisonberry_juice_metal_paint + name = "Metallic poison berry juice paint" + id = "poisonberry_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_POISONBERRYJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/poisonberry_juice_metal_paint/send_data() + return "#683c4d" + +/decl/chemical_reaction/instant/watermelon_juice_metal_paint + name = "Metallic watermelon juice paint" + id = "watermelon_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_WATERMELONJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/watermelon_juice_metal_paint/send_data() + return "#a47a7a" + +/decl/chemical_reaction/instant/lemon_juice_metal_paint + name = "Metallic lemon juice paint" + id = "lemon_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_LEMONJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/lemon_juice_metal_paint/send_data() + return "#8f8f5c" + +/decl/chemical_reaction/instant/banana_juice_metal_paint + name = "Metallic banana juice paint" + id = "banana_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_BANANA = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/banana_juice_metal_paint/send_data() + return "#9c9129" + +/decl/chemical_reaction/instant/potato_juice_metal_paint + name = "Metallic potato juice paint" + id = "potato_juice_metal_paint" + result = REAGENT_ID_PAINT + required_reagents = list(REAGENT_ID_TITANIUMDIOX = 1, REAGENT_ID_WATER = 3, REAGENT_ID_POTATOJUICE = 5) + result_amount = 5 + +/decl/chemical_reaction/instant/potato_juice_metal_paint/send_data() + return "#2e2a21" diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm index c3762d6e05..c4428c6e35 100644 --- a/code/modules/reagents/reagents/_reagents.dm +++ b/code/modules/reagents/reagents/_reagents.dm @@ -46,6 +46,8 @@ var/from_belly = FALSE var/wiki_flag = 0 // Bitflags for secret/food/drink reagent sorting + var/supply_conversion_value = null + var/industrial_use = null // unique description for export off station /datum/reagent/proc/remove_self(var/amount) // Shortcut if(holder) diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm index df06525d1d..f2f53137c1 100644 --- a/code/modules/reagents/reagents/core.dm +++ b/code/modules/reagents/reagents/core.dm @@ -15,6 +15,10 @@ glass_name = "tomato juice" glass_desc = "Are you sure this is tomato juice?" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD + + /datum/reagent/blood/initialize_data(var/newdata) ..() if(data && data["blood_colour"]) @@ -210,6 +214,9 @@ color = "#0050F0" mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_MEDSCI + /datum/reagent/antibodies/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(src.data) M.antibodies |= src.data[REAGENT_ID_ANTIBODIES] @@ -229,6 +236,9 @@ glass_name = REAGENT_ID_WATER glass_desc = "The father of all refreshments." + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_RAW + /datum/reagent/water/touch_turf(var/turf/simulated/T) if(!istype(T)) return @@ -326,6 +336,9 @@ glass_name = "welder fuel" glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption." + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_RAW + /datum/reagent/fuel/touch_turf(var/turf/T, var/amount) ..() new /obj/effect/decal/cleanable/liquid_fuel(T, amount, FALSE) diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm index 7c5ee11355..d6ef4d4cb8 100644 --- a/code/modules/reagents/reagents/dispenser.dm +++ b/code/modules/reagents/reagents/dispenser.dm @@ -6,6 +6,8 @@ taste_mult = 1.1 reagent_state = SOLID color = "#A8A8A8" + supply_conversion_value = 1 // has sheet value + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/calcium name = REAGENT_CALCIUM @@ -15,6 +17,8 @@ taste_mult = 1.3 reagent_state = SOLID color = "#e9e6e4" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW //VOREStation Edit /datum/reagent/calcium/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) @@ -37,6 +41,8 @@ reagent_state = SOLID color = "#1C1300" ingest_met = REM * 5 + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/carbon/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -65,6 +71,8 @@ taste_description = "pool water" reagent_state = GAS color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/chlorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.take_organ_damage(1*REM, 0) @@ -78,6 +86,8 @@ description = "A highly ductile metal." taste_description = "pennies" color = "#6E3B08" + supply_conversion_value = 0.5 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/ethanol name = REAGENT_ETHANOL //Parent class for all alcoholic reagents. @@ -105,6 +115,8 @@ affects_robots = 1 //kiss my shiny metal ass wiki_flag = WIKI_DRINK + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount) ..() @@ -290,6 +302,8 @@ taste_description = "acid" reagent_state = GAS color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/fluorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustToxLoss(removed) @@ -304,6 +318,8 @@ taste_mult = 0 //no taste reagent_state = GAS color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/iron name = REAGENT_IRON @@ -312,6 +328,8 @@ taste_description = "metal" reagent_state = SOLID color = "#353535" + supply_conversion_value = 1 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/lithium name = REAGENT_LITHIUM @@ -320,6 +338,8 @@ taste_description = "metal" reagent_state = SOLID color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/lithium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -335,6 +355,8 @@ taste_mult = 0 //mercury apparently is tasteless. IDK reagent_state = LIQUID color = "#484848" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/mercury/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -351,6 +373,8 @@ taste_mult = 0 //no taste reagent_state = GAS color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/oxygen name = REAGENT_OXYGEN @@ -359,6 +383,8 @@ taste_mult = 0 reagent_state = GAS color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/oxygen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_VOX) @@ -371,6 +397,8 @@ taste_description = "vinegar" reagent_state = SOLID color = "#832828" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/potassium name = REAGENT_POTASSIUM @@ -379,6 +407,8 @@ taste_description = "sweetness" //potassium is bitter in higher doses but sweet in lower ones. reagent_state = SOLID color = "#A0A0A0" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/radium name = REAGENT_RADIUM @@ -387,6 +417,8 @@ taste_mult = 0 //Apparently radium is tasteless reagent_state = SOLID color = "#C7C7C7" + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/radium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(issmall(M)) removed *= 2 @@ -408,6 +440,8 @@ taste_mult = 0 //Apparently radium is tasteless reagent_state = SOLID color = "#C7C7C7" + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/radium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(issmall(M)) removed *= 2 @@ -429,6 +463,8 @@ var/power = 5 var/meltdose = 10 // How much is needed to melt affects_robots = TRUE //CHOMPedit, it's acid! Still eats metal! + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/acid/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_GREY) //ywedit @@ -558,6 +594,8 @@ taste_mult = 0 reagent_state = SOLID color = "#A8A8A8" + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/sodium name = REAGENT_SODIUM @@ -566,6 +604,8 @@ taste_description = "salty metal" reagent_state = SOLID color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/sugar name = REAGENT_SUGAR @@ -580,6 +620,9 @@ glass_desc = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." glass_icon = DRINK_ICON_NOISY + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_FOOD + /datum/reagent/sugar/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjust_nutrition(removed * 3) @@ -608,6 +651,8 @@ taste_description = "old eggs" reagent_state = SOLID color = "#BF8C00" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/tungsten name = REAGENT_TUNGSTEN @@ -617,3 +662,38 @@ taste_mult = 0 //no taste reagent_state = SOLID color = "#DCDCDC" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR + +/datum/reagent/titanium_dioxide + name = REAGENT_TITANIUMDIOX + id = REAGENT_ID_TITANIUMDIOX + description = "A crumbly white powder, often used in dyes." + taste_description = "metal" + taste_mult = 0 //no taste + reagent_state = SOLID + color = "#cadcef" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_COSMETIC + +/datum/reagent/titanium + name = REAGENT_TITANIUM + id = REAGENT_ID_TITANIUM + description = "A chemical element, lightweight and biologically inert." + taste_description = "metal" + taste_mult = 0 //no taste + reagent_state = SOLID + color = "#cadcef" + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_INDUSTRY + +/datum/reagent/tin + name = REAGENT_TIN + id = REAGENT_ID_TIN + description = "A chemical element, soft and highly flexible." + taste_description = "metal" + taste_mult = 0 //no taste + reagent_state = SOLID + color = "#efe9ca" + supply_conversion_value = 0.5 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR diff --git a/code/modules/reagents/reagents/drugs.dm b/code/modules/reagents/reagents/drugs.dm index 743a8ab226..29340bb337 100644 --- a/code/modules/reagents/reagents/drugs.dm +++ b/code/modules/reagents/reagents/drugs.dm @@ -23,6 +23,9 @@ mrate_static = TRUE overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_ILLDRUG + /datum/reagent/drugs/affect_blood(mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return @@ -55,6 +58,8 @@ "Colors seem... flatter.", "Everything feels a little dull, now.") wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED // bonus + industrial_use = REFINERYEXPORT_REASON_ILLDRUG /datum/reagent/drugs/bliss/affect_blood(mob/living/carbon/M, var/alien, var/removed) ..() @@ -99,6 +104,8 @@ "Reality seems like a real pain in the ass to deal with right now.", "Things feel really colourless to you all of a sudden.", "You feel the urge to lie down and nap.") + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED // bonus + industrial_use = REFINERYEXPORT_REASON_ILLDRUG /datum/reagent/drugs/ambrosia_extract/affect_blood(mob/living/carbon/M, var/alien, var/removed) ..() @@ -131,6 +138,8 @@ "Nothing really makes sense right now.", "It feels like you've melded with the world around you...") sober_message_list = list("Everything feels... flat.", "You feel almost TOO grounded in your surroundings.") + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED // bonus + industrial_use = REFINERYEXPORT_REASON_ILLDRUG /datum/reagent/drugs/psilocybin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -184,6 +193,8 @@ "Nothing really makes sense right now.", "It feels like you've melded with the world around you...") sober_message_list = list("Everything feels... flat.", "You feel almost TOO grounded in your surroundings.") + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_ILLDRUG /datum/reagent/drugs/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -209,6 +220,8 @@ taste_description = "sour staleness" color = "#181818" high_messages = FALSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_RECDRUG /datum/reagent/drugs/nicotine/handle_addiction(var/mob/living/carbon/M, var/alien) // A copy of the base with withdrawl, but with much less effects, such as vomiting. @@ -254,6 +267,8 @@ color = "#BF80BF" high_message_list = list("You feel focused.", "Your attention is undivided.") sober_message_list = list("It becomes harder to focus...", "You feel distractible.") + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/drugs/citalopram name = REAGENT_CITALOPRAM @@ -263,6 +278,8 @@ color = "#FF80FF" high_message_list = list("Everything feels a bit more steady.", "Your mind feels stable.") sober_message_list = list("You feel a little tired.", "You feel a little more listless...") + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/drugs/citalopram/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -277,6 +294,8 @@ color = "#FF80BF" high_message_list = list("Everything feels good, stable.", "You feel grounded.") sober_message_list = list("The stability is gone...", "Everything is much less stable.") + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/drugs/paroxetine/affect_blood(mob/living/carbon/M, var/alien, var/removed) ..() @@ -295,3 +314,5 @@ color = "#e6efe3" high_message_list = list("You feel sluggish...", "You feel calm and collected.") sober_message_list = list("You feel so much more antsy...", "Your concentration wavers.") + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 1821ef9c4f..65431e8c92 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -14,6 +14,9 @@ affects_robots = 1 //VOREStation Edit wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_FOOD + /datum/reagent/nutriment/mix_data(var/list/newdata, var/newamount) if(!islist(newdata) || !newdata.len) @@ -660,6 +663,8 @@ reagent_state = LIQUID color = "#BBEDA4" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DIET /datum/reagent/lipozine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjust_nutrition(-10 * removed) @@ -676,6 +681,8 @@ overdose = REAGENTS_OVERDOSE ingest_met = REM cup_prefix = "salty" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/sodiumchloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -697,6 +704,8 @@ color = "#000000" cup_prefix = "peppery" wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/enzyme name = REAGENT_ENZYME @@ -708,6 +717,8 @@ color = "#365E30" overdose = REAGENTS_OVERDOSE wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/spacespice name = REAGENT_SPACESPICE @@ -717,6 +728,8 @@ color = "#e08702" cup_prefix = "spicy" wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/browniemix name = REAGENT_BROWNIEMIX @@ -726,6 +739,8 @@ color = "#441a03" allergen_type = ALLERGEN_CHOCOLATE wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/cakebatter name = REAGENT_CAKEBATTER @@ -734,6 +749,8 @@ reagent_state = LIQUID color = "#F0EDDA" wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/frostoil name = REAGENT_FROSTOIL @@ -745,6 +762,8 @@ ingest_met = REM color = "#B31008" wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/frostoil/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -783,6 +802,8 @@ reagent_state = LIQUID color = "#B31008" metabolism = REM * 0.5 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/capsaicin name = REAGENT_CAPSAICIN @@ -795,6 +816,8 @@ color = "#B31008" cup_prefix = "hot" wiki_flag = WIKI_FOOD + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/capsaicin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -839,6 +862,8 @@ ingest_met = REM color = "#B31008" cup_prefix = "dangerously hot" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/condensedcapsaicin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -973,7 +998,7 @@ /* Drinks */ /datum/reagent/drink - name = REAGENT_DRINK + name = REAGENT_DEVELOPER_WARNING // Unit test ignore id = REAGENT_ID_DRINK description = "Uh, some kind of drink." ingest_met = REM @@ -987,6 +1012,8 @@ var/nutriment_factor = 0 //CHOMPStation addition var/water_based = TRUE wiki_flag = WIKI_DRINK + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/drink/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/strength_mod = 1 @@ -1188,6 +1215,8 @@ glass_name = "poison berry juice" glass_desc = "A glass of deadly juice." cup_prefix = "poison" + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/drink/juice/potato name = REAGENT_POTATOJUICE @@ -5069,6 +5098,9 @@ glass_name = REAGENT_ID_CINNAMONPOWDER glass_desc = "A glass of ground cinnamon. Dare you take the challenge?" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD + /datum/reagent/gelatin name = REAGENT_GELATIN id = REAGENT_ID_GELATIN @@ -5078,3 +5110,6 @@ glass_name = REAGENT_GELATIN glass_desc = "It's like flavourless slime." + + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_FOOD diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index 619ec36e6c..fad189a55e 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -9,6 +9,8 @@ reagent_state = LIQUID color = "#ff2424" strength = 10 + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/toxin/plantcolony name = REAGENT_PLANTCOLONY @@ -18,6 +20,8 @@ reagent_state = LIQUID color = "#7ce01f" strength = 10 + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/nutriment/grubshake name = REAGENT_GRUBSHAKE @@ -353,9 +357,6 @@ glass_name = REAGENT_SCSATW glass_desc = "The best accessory to daydrinking." -/datum/reagent/drink - name = REAGENT_DEVELOPER_WARNING // Unit test ignore - /datum/reagent/drink/choccymilk name = REAGENT_CHOCCYMILK id = REAGENT_ID_CHOCCYMILK diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm index 08db01741d..f662e1d229 100644 --- a/code/modules/reagents/reagents/medicine.dm +++ b/code/modules/reagents/reagents/medicine.dm @@ -10,6 +10,8 @@ overdose = REAGENTS_OVERDOSE * 2 metabolism = REM * 0.2 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/inaprovaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -29,6 +31,8 @@ scannable = 1 touch_met = REM * 0.3 can_overdose_touch = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/inaprovaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -51,6 +55,8 @@ overdose = REAGENTS_OVERDOSE overdose_mod = 0.25 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/bicaridine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -88,6 +94,8 @@ scannable = 1 touch_met = REM * 0.75 can_overdose_touch = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/bicaridine/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -114,6 +122,8 @@ overdose = REAGENTS_OVERDOSE * 0.8 metabolism = REM * 0.4 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/calciumcarbonate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) // Why would you inject this. if(alien != IS_DIONA) @@ -132,6 +142,8 @@ color = "#FFA800" overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/kelotane/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -152,6 +164,8 @@ color = "#FF8000" overdose = REAGENTS_OVERDOSE * 0.5 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/dermaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -172,6 +186,8 @@ scannable = 1 touch_met = REM * 0.75 can_overdose_touch = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/dermaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -196,6 +212,8 @@ reagent_state = LIQUID color = "#00A000" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/dylovene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -219,6 +237,8 @@ scannable = 1 overdose = REAGENTS_OVERDOSE * 0.5 overdose_mod = 0 // Not used, but it shouldn't deal toxin damage anyways. Carth heals toxins! + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/carthatoline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -255,6 +275,8 @@ overdose = REAGENTS_OVERDOSE scannable = 1 metabolism = REM * 0.25 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/dexalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_VOX) @@ -280,6 +302,8 @@ overdose = REAGENTS_OVERDOSE * 0.5 overdose_mod = 1.25 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/dexalinp/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_VOX) @@ -303,13 +327,14 @@ reagent_state = LIQUID color = "#8040FF" scannable = 1 - //YW ADDITIONS START - overdose = REAGENTS_OVERDOSE * 4 //120 overdose -/datum/reagent/tricordrazine/overdose(var/mob/living/carbon/M, var/alien) + overdose = REAGENTS_OVERDOSE * 4 //YW EDIT - TRICORD FUCKING KILLS YOU + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG + +/datum/reagent/tricordrazine/overdose(var/mob/living/carbon/M, var/alien) //YW EDIT START ..() M.druggy = max(M.druggy, 5) - M.Confuse(5) - //YW ADDITIONS END + M.Confuse(5) //YW EDIT END /datum/reagent/tricordrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -333,6 +358,8 @@ color = "#B060FF" scannable = 1 can_overdose_touch = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/tricorlidaze/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -370,6 +397,8 @@ metabolism = REM * 0.5 mrate_static = TRUE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/cryoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.bodytemperature < 170) @@ -395,6 +424,8 @@ metabolism = REM * 0.5 mrate_static = TRUE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/clonexadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.bodytemperature < 170) @@ -422,6 +453,8 @@ mrate_static = TRUE affects_dead = FALSE //Clarifying this here since the original intent was this ONLY works on people that have the bloodpump_corpse modifier. scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/mortiferin/on_mob_life(var/mob/living/carbon/M, var/alien, var/datum/reagents/metabolism/location) . = ..(M, alien, location) @@ -461,6 +494,8 @@ mrate_static = TRUE scannable = 1 affects_dead = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/necroxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -497,6 +532,8 @@ scannable = 1 metabolism = 0.02 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/paracetamol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_pain @@ -522,6 +559,8 @@ scannable = 1 metabolism = 0.02 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/tramadol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_pain @@ -546,6 +585,8 @@ scannable = 1 metabolism = 0.02 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/oxycodone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_pain @@ -573,6 +614,8 @@ metabolism = REM * 0.05 overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/synaptizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -602,6 +645,8 @@ color = "#FF3300" overdose = REAGENTS_OVERDOSE * 0.5 overdose_mod = 0.25 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_COMSTIM /datum/reagent/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_TAJARA) @@ -633,6 +678,8 @@ metabolism = REM * 0.25 overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/alkysine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -656,6 +703,8 @@ color = "#C8A5DC" overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/imidazoline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.eye_blurry = max(M.eye_blurry - 5, 0) @@ -681,6 +730,8 @@ overdose = 10 overdose_mod = 1.5 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/peridaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) @@ -714,6 +765,8 @@ overdose = REAGENTS_OVERDOSE * 0.5 overdose_mod = 1.5 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/osteodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -747,6 +800,8 @@ overdose_mod = 1.5 scannable = 1 var/repair_strength = 6 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/myelamine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -794,6 +849,8 @@ overdose = 10 overdose_mod = 1.75 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/respirodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/repair_strength = 1 * M.species.chem_strength_heal @@ -826,6 +883,8 @@ overdose = 10 overdose_mod = 1.75 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/gastirodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/repair_strength = 1 * M.species.chem_strength_heal @@ -858,6 +917,8 @@ overdose = 10 overdose_mod = 1.75 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/hepanephrodaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/repair_strength = 1 * M.species.chem_strength_heal @@ -892,6 +953,8 @@ overdose = 10 overdose_mod = 1.75 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/cordradaxon/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/repair_strength = 1 * M.species.chem_strength_heal @@ -921,6 +984,8 @@ overdose_mod = 1.5 scannable = 1 metabolism = REM * 0.06 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/immunosuprizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/strength_mod = 1 // * M.species.chem_strength_heal //Just removing the chem strength adjustment. It'd require division, which is best avoided. @@ -976,6 +1041,8 @@ overdose = 20 overdose_mod = 1.5 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/skrellimmuno/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/strength_mod = 0.5 * M.species.chem_strength_heal @@ -1016,6 +1083,8 @@ reagent_state = SOLID color = "#004000" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/ryetalyn/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) //Ryetalyn is for genetics damage curing not resetting mutations, breaks traitgenes @@ -1049,6 +1118,8 @@ reagent_state = SOLID color = "#605048" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_RECDRUG /datum/reagent/ethylredoxrazine/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1084,6 +1155,8 @@ metabolism = REM * 0.25 overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_SPECIALDRUG /datum/reagent/hyronalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1102,6 +1175,8 @@ overdose = REAGENTS_OVERDOSE overdose_mod = 1.25 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/arithrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1124,6 +1199,8 @@ overdose = REAGENTS_OVERDOSE scannable = 1 data = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/spaceacillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1153,6 +1230,8 @@ overdose_mod = 1.5 scannable = 1 data = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1222,6 +1301,8 @@ scannable = 1 data = 0 can_overdose_touch = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/spacomycaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_PAINKILLER, 10 * M.species.chem_strength_pain) @@ -1266,6 +1347,8 @@ reagent_state = LIQUID color = "#C8A5DC" touch_met = 5 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_CLEAN /datum/reagent/sterilizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_SLIME) @@ -1317,6 +1400,8 @@ color = "#C8A5DC" overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/leporazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1340,6 +1425,8 @@ overdose = REAGENTS_OVERDOSE overdose_mod = 2 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1389,6 +1476,8 @@ scannable = 1 affects_robots = TRUE wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/healing_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.heal_organ_damage(2 * removed, 2 * removed) @@ -1406,6 +1495,8 @@ metabolism = REM * 0.002 overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/earthsblood name = REAGENT_EARTHSBLOOD @@ -1415,6 +1506,8 @@ reagent_state = LIQUID color = "#ffb500" overdose = REAGENTS_OVERDOSE * 0.50 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/earthsblood/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -1438,6 +1531,8 @@ overdose = 15 overdose_mod = 1.2 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/acid/artificial_sustenance/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) // You need me... diff --git a/code/modules/reagents/reagents/medicine_ch.dm b/code/modules/reagents/reagents/medicine_ch.dm index b418aceb68..f258114917 100644 --- a/code/modules/reagents/reagents/medicine_ch.dm +++ b/code/modules/reagents/reagents/medicine_ch.dm @@ -11,6 +11,8 @@ overdose = REAGENTS_OVERDOSE * 100 metabolism = REM * 0.1 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/claridyl/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -63,6 +65,8 @@ color = "#00FFBE" overdose = REAGENTS_OVERDOSE * 1 metabolism = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/eden/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_SLIME || alien == IS_DIONA) @@ -92,6 +96,8 @@ metabolism = 0.05 description = "A well respected drug used for treatment of schizophrenia in specific." overdose = REAGENTS_OVERDOSE * 2 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG ///SAP REAGENTS//// //This is all a direct port from aeiou. @@ -106,6 +112,8 @@ overdose = 8 scannable = 1 metabolism = 0.03 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/hannoa/overdose(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -149,6 +157,8 @@ overdose = 8 //This many units starts killing you. scannable = 1 // Mechs can scan this ye metabolism = 0.03 //Slow metabolism. This value was plucked out of nowhere. Can be changed. + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/bullvalene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_SLIME || alien == IS_DIONA) @@ -169,6 +179,8 @@ reagent_state = LIQUID color = "#df9898" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/serazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 @@ -187,6 +199,8 @@ color = "#b37979" overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/alizene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 diff --git a/code/modules/reagents/reagents/medicine_vr.dm b/code/modules/reagents/reagents/medicine_vr.dm index f30031fde7..2fdfc6e1f5 100644 --- a/code/modules/reagents/reagents/medicine_vr.dm +++ b/code/modules/reagents/reagents/medicine_vr.dm @@ -6,6 +6,8 @@ reagent_state = LIQUID color = "#d5e2e5" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/adranol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -28,6 +30,8 @@ overdose = 20 //High OD. This is to make numbing bites have somewhat of a downside if you get bit too much. Have to go to medical for dialysis. scannable = 0 //Let's not have medical mechs able to make an extremely strong organic painkiller wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/numbing_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_PAINKILLER, 200) @@ -70,6 +74,8 @@ color = "#750404" overdose = REAGENTS_OVERDOSE * 0.5 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/vermicetol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal //YW EDIT @@ -90,6 +96,9 @@ overdose = 5 scannable = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_DRUG + /datum/reagent/sleevingcure/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.remove_a_modifier_of_type(/datum/modifier/resleeving_sickness) M.remove_a_modifier_of_type(/datum/modifier/faux_resleeving_sickness) @@ -107,6 +116,8 @@ metabolism = REM * 0.25//20 ticks to do things per unit injected. This means injecting 30u will give you 10 minutes to do what you need. overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/prussian_blue/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -122,6 +133,8 @@ reagent_state = LIQUID color = "#47AD6D" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DIET /datum/reagent/lipozilase/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjust_nutrition(-20 * removed) @@ -136,6 +149,8 @@ reagent_state = LIQUID color = "#61731C" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_DIET /datum/reagent/lipostipo/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjust_nutrition(-20 * removed) @@ -202,6 +217,8 @@ "dragon" = /mob/living/simple_mob/vore/bigdragon/friendly, "leopardmander" = /mob/living/simple_mob/vore/leopardmander ) + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED // bonus + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/polymorph/affect_blood(var/mob/living/carbon/target, var/removed) var/mob/living/M = target @@ -272,6 +289,8 @@ reagent_state = LIQUID color = "#ffffff" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_COSMETIC /datum/reagent/glamour/affect_blood(var/mob/living/carbon/target, var/removed) add_verb(target, /mob/living/carbon/human/proc/enter_cocoon) diff --git a/code/modules/reagents/reagents/modifiers.dm b/code/modules/reagents/reagents/modifiers.dm index 5b8f0614cb..948e19d79e 100644 --- a/code/modules/reagents/reagents/modifiers.dm +++ b/code/modules/reagents/reagents/modifiers.dm @@ -15,6 +15,9 @@ var/modifier_duration = 3 SECONDS // How long, per unit dose, will this last? // 2 SECONDS is the resolution of life code, and the modifier will expire before chemical processing tries to re-add it + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_WEAPONS + /datum/reagent/modapplying/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return @@ -31,6 +34,9 @@ modifier_to_add = /datum/modifier/cryogelled modifier_duration = 3 SECONDS + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG + /datum/reagent/modapplying/cryofluid/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..(M, alien, removed) M.bodytemperature -= removed * 20 @@ -70,3 +76,6 @@ modifier_to_add = /datum/modifier/clone_stabilizer modifier_duration = 30 SECONDS + + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_PHORON diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm index 9054514397..3745632a62 100644 --- a/code/modules/reagents/reagents/other.dm +++ b/code/modules/reagents/reagents/other.dm @@ -8,6 +8,8 @@ reagent_state = LIQUID color = "#888888" overdose = 10 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_COSMETIC /datum/reagent/crayon_dust/red name = REAGENT_CRAYONDUSTRED @@ -57,6 +59,8 @@ reagent_state = LIQUID color = "#888888" overdose = 10 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_COSMETIC /datum/reagent/marker_ink/black name = REAGENT_MARKERINKBLACK @@ -112,6 +116,8 @@ color = "#808080" overdose = REAGENTS_OVERDOSE * 0.5 color_weight = 20 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_COSMETIC /datum/reagent/paint/touch_turf(var/turf/T) ..() @@ -178,6 +184,9 @@ glass_desc = "It's magic. We don't have to explain it." wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = "how did you get this?" + /datum/reagent/adminordrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) affect_blood(M, alien, removed) @@ -239,6 +248,8 @@ taste_description = "metal" reagent_state = SOLID color = "#F7C430" + supply_conversion_value = 2 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/silver name = REAGENT_SILVER @@ -247,6 +258,8 @@ taste_description = "metal" reagent_state = SOLID color = "#D0D0D0" + supply_conversion_value = 1 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/platinum name = REAGENT_PLATINUM @@ -255,6 +268,8 @@ taste_description = "metal" reagent_state = SOLID color = "#777777" + supply_conversion_value = 5 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/uranium name = REAGENT_URANIUM @@ -263,6 +278,8 @@ taste_description = "metal" reagent_state = SOLID color = "#B8B8C0" + supply_conversion_value = 2 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/uranium/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) affect_ingest(M, alien, removed) @@ -283,16 +300,22 @@ name = REAGENT_DEUTERIUM id = REAGENT_ID_DEUTERIUM description = "A isotope of hydrogen. It has one extra neutron, and shares all chemical characteristics with hydrogen." + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/hydrogen/tritium name = REAGENT_TRITIUM id = REAGENT_ID_TRITIUM description = "A radioactive isotope of hydrogen. It has two extra neutrons, and shares all other chemical characteristics with hydrogen." + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/lithium/lithium6 name = REAGENT_LITHIUM6 id = REAGENT_ID_LITHIUM6 description = "An isotope of lithium. It has 3 neutrons, but shares all chemical characteristics with regular lithium." + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/helium/helium3 name = REAGENT_HELIUM3 @@ -301,12 +324,16 @@ taste_mult = 0 reagent_state = GAS color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/boron/boron11 name = REAGENT_BORON11 id = REAGENT_ID_BORON11 description = "An isotope of boron. It has 6 neutrons." taste_description = "metallic" // Apparently noone on the internet knows what boron tastes like. Or at least they won't share + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/supermatter name = REAGENT_SUPERMATTER @@ -318,6 +345,8 @@ description = "The immense power of a supermatter crystal, in liquid form. You're not entirely sure how that's possible, but it's probably best handled with care." taste_description = "taffy" // 0. The supermatter is tasty, tasty taffy. wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_MATSCI // Same as if you boop it wrong. It touches you, you die /datum/reagent/supermatter/affect_touch(mob/living/carbon/M, alien, removed) @@ -341,6 +370,8 @@ reagent_state = LIQUID color = "#C8A5DC" mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/adrenaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -361,6 +392,9 @@ glass_desc = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_RAW + /datum/reagent/water/holywater/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(ishuman(M)) // Any location @@ -381,6 +415,8 @@ taste_mult = 2 reagent_state = GAS color = "#404030" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/diethylamine name = REAGENT_DIETHYLAMINE @@ -389,6 +425,8 @@ taste_description = REAGENT_ID_IRON reagent_state = LIQUID color = "#604030" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/lye name = REAGENT_LYE @@ -397,6 +435,8 @@ taste_description = "acid" reagent_state = LIQUID color = "#FFFFD6" // very very light yellow" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/fluorosurfactant // Foam precursor name = REAGENT_FLUOROSURFACTANT @@ -405,6 +445,8 @@ taste_description = "metal" reagent_state = LIQUID color = "#9E6B38" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/foaming_agent // Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = REAGENT_FOAMINGAGENT @@ -413,6 +455,8 @@ taste_description = "metal" reagent_state = SOLID color = "#664B63" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/thermite name = REAGENT_THERMITE @@ -422,6 +466,8 @@ reagent_state = SOLID color = "#673910" touch_met = 50 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/thermite/touch_turf(var/turf/T) ..() @@ -449,6 +495,8 @@ reagent_state = LIQUID color = "#A5F0EE" touch_met = 50 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_CLEAN /datum/reagent/space_cleaner/touch_mob(var/mob/M) ..() @@ -538,6 +586,8 @@ taste_description = "slime" reagent_state = LIQUID color = "#009CA8" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_LUBE /datum/reagent/lube/touch_turf(var/turf/simulated/T) ..() @@ -553,6 +603,8 @@ taste_description = "plastic" reagent_state = LIQUID color = "#C7FFFF" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/silicate/touch_obj(var/obj/O) ..() @@ -569,6 +621,8 @@ taste_description = "sweetness" reagent_state = LIQUID color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/nitroglycerin name = REAGENT_NITROGLYCERIN @@ -577,6 +631,8 @@ taste_description = "oil" reagent_state = LIQUID color = "#808080" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/coolant name = REAGENT_COOLANT @@ -588,6 +644,8 @@ color = "#C8A5DC" affects_robots = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_INDUSTRY /datum/reagent/coolant/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.isSynthetic() && ishuman(M)) @@ -611,6 +669,8 @@ description = "An extremely powerful bonding agent." taste_description = "a special education class" color = "#FFFFCC" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/woodpulp name = REAGENT_WOODPULP @@ -619,6 +679,8 @@ taste_description = "wood" reagent_state = LIQUID color = "#B97A57" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/luminol name = REAGENT_LUMINOL @@ -627,6 +689,8 @@ taste_description = "metal" reagent_state = LIQUID color = "#F2F3F4" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/luminol/touch_obj(var/obj/O) ..() @@ -643,6 +707,8 @@ taste_description = "salty meat" reagent_state = LIQUID color = "#DF9FBF" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_CLONEDRUG /datum/reagent/mineralfluid name = REAGENT_MINERALIZEDFLUID @@ -651,6 +717,8 @@ taste_description = "salt" reagent_state = LIQUID color = "#ff205255" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI // The opposite to healing nanites, exists to make unidentified hypos implied to have nanites not be 100% safe. /datum/reagent/defective_nanites @@ -663,6 +731,8 @@ metabolism = REM * 3 // Broken nanomachines go a bit slower. scannable = 1 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/defective_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.take_organ_damage(2 * removed, 2 * removed) @@ -678,6 +748,8 @@ reagent_state = LIQUID color = "#62764E" nutriment_factor = 15 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD //YW Edit Start /datum/reagent/nutriment/paper //Paper is made from cellulose. You can eat it. It doesn't fill you up very much at all. @@ -697,6 +769,12 @@ reagent_state = LIQUID color = "#b51d05" taste_description = "carpet" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR + +/datum/reagent/carpet + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/carpet/black name = REAGENT_LIQUIDCARPETB @@ -761,3 +839,5 @@ taste_description = "a mixture of thick, sweet, salty, salty and spicy flavours that all blend together to not be very nice at all" reagent_state = LIQUID color = "#e8e2b0" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR diff --git a/code/modules/reagents/reagents/other_ch.dm b/code/modules/reagents/reagents/other_ch.dm index af3fddbc79..a8d83fc23e 100644 --- a/code/modules/reagents/reagents/other_ch.dm +++ b/code/modules/reagents/reagents/other_ch.dm @@ -17,6 +17,8 @@ var/spiders_min = 6 var/spiders_max = 24 var/spider_type = /obj/effect/spider/spiderling + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/liquidspideregg/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(prob(1)) @@ -63,6 +65,8 @@ metabolism = 0.01 strength = 10//Don't drink it mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/purplesap name = REAGENT_ID_PURPLESAP @@ -70,6 +74,8 @@ description = "Purple liquid. It is very sticky and smells of ammonia." color = "#7a48a0" taste_description = "Ammonia" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/orangesap name = REAGENT_ORANGESAP @@ -77,6 +83,8 @@ description = "Orange liquid. It wobbles around a bit like jelly." color = "#e0962f" taste_description = "Ammonia" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW //YW stuff @@ -88,6 +96,8 @@ taste_mult = 0.4 metabolism = REM * 2.5 color = "#929292" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RAW /datum/reagent/phenethylamine name = REAGENT_PHENETHYLAMINE @@ -95,6 +105,8 @@ description = "Just looking at this makes you feel odd. Whether or not this would be good to consume is likely a gamble." color = "#463667" data = list("count"=1) + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_RECDRUG /datum/reagent/phenethylamine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(data) diff --git a/code/modules/reagents/reagents/other_vr.dm b/code/modules/reagents/reagents/other_vr.dm index a52493aa2f..f1cfa6ec97 100644 --- a/code/modules/reagents/reagents/other_vr.dm +++ b/code/modules/reagents/reagents/other_vr.dm @@ -4,6 +4,8 @@ description = "A corruptive toxin produced by slimes. Turns the subject of the chemical into a Promethean." reagent_state = LIQUID color = "#13BC5E" + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/advmutationtoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!(M.allow_spontaneous_tf)) @@ -41,6 +43,9 @@ affects_robots = TRUE wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_MATSCI + /datum/reagent/nif_repair_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -57,6 +62,8 @@ reagent_state = LIQUID color = "#A6FAFF" taste_description = "the inside of a fire extinguisher" + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_INDUSTRY /datum/reagent/firefighting_foam/touch_turf(var/turf/T, reac_volume) if(reac_volume >= 1) @@ -107,6 +114,8 @@ scannable = 0 metabolism = REM * 0.5 affects_robots = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/liquid_protean/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -134,6 +143,8 @@ color = "#E4EC2F" metabolism = 2.50 var/power = 9 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/grubshock/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.take_organ_damage(0, removed * power * 0.2) diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm index e26fc88ad4..4c0157dcf3 100644 --- a/code/modules/reagents/reagents/toxins.dm +++ b/code/modules/reagents/reagents/toxins.dm @@ -12,6 +12,8 @@ filtered_organs = list(O_LIVER, O_KIDNEYS) var/strength = 4 // How much damage it deals per unit var/skin_danger = 0.2 // The multiplier for how effective the toxin is when making skin contact. + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/poison_strength = strength * M.species.chem_strength_tox @@ -36,6 +38,8 @@ reagent_state = LIQUID color = "#CF3600" strength = 5 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/amatoxin name = REAGENT_AMATOXIN @@ -45,6 +49,8 @@ reagent_state = LIQUID color = "#792300" strength = 10 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/amatoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) // Trojan horse. Waits until most of the toxin has gone through the body before dealing the bulk of it in one big strike. @@ -59,6 +65,8 @@ reagent_state = LIQUID color = "#003333" strength = 10 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/carpotoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -74,6 +82,8 @@ strength = 8 skin_danger = 0.4 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/toxin/neurotoxic_protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_CHIMERA) @@ -95,6 +105,8 @@ description = "An exceptionally flammable molecule formed from deuterium synthesis." strength = 80 var/fire_mult = 30 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/hydrophoron/touch_mob(var/mob/living/L, var/amount) ..() @@ -131,6 +143,8 @@ description = "Elemental Lead." color = "#273956" strength = 4 + supply_conversion_value = 0.5 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/spidertoxin name = REAGENT_SPIDERTOXIN @@ -138,6 +152,8 @@ description = "A liquifying toxin produced by giant spiders." color = "#2CE893" strength = 5 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/toxin/warningtoxin name = REAGENT_WARNINGTOXIN @@ -164,6 +180,8 @@ strength = 30 touch_met = 5 skin_danger = 1 + supply_conversion_value = 5 SHEET_TO_REAGENT_EQUIVILENT // has sheet value + industrial_use = REFINERYEXPORT_REASON_PHORON /datum/reagent/toxin/phoron/touch_mob(var/mob/living/L, var/amount) ..() @@ -204,6 +222,8 @@ color = "#CF3600" strength = 15 metabolism = REM * 0.5 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/cyanide/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -218,6 +238,8 @@ reagent_state = SOLID strength = 5 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/toxin/mold/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -233,6 +255,8 @@ strength = 5 filtered_organs = list(O_SPLEEN) wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/toxin/expired_medicine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -254,6 +278,8 @@ overdose = 10 overdose_mod = 0.5 strength = 3 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/toxin/stimm/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_TAJARA) @@ -284,6 +310,8 @@ strength = 0 overdose = REAGENTS_OVERDOSE filtered_organs = list(O_SPLEEN, O_KIDNEYS) + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/toxin/potassium_chloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -310,6 +338,8 @@ strength = 10 overdose = 20 filtered_organs = list(O_SPLEEN, O_KIDNEYS) + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/toxin/potassium_chlorophoride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -333,6 +363,8 @@ metabolism = REM strength = 3 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/toxin/zombiepowder/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -359,6 +391,8 @@ metabolism = REM * 0.75 strength = 2 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_MASSINDUSTRY + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/toxin/lichpowder/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -388,6 +422,8 @@ reagent_state = LIQUID strength = 0.5 // It's not THAT poisonous. color = "#664330" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/toxin/fertilizer/eznutrient name = REAGENT_EZNUTRIENT @@ -426,6 +462,8 @@ reagent_state = LIQUID color = "#49002E" strength = 4 + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/plantbgone/touch_turf(var/turf/T) ..() @@ -462,6 +500,8 @@ color = "#C6E2FF" strength = 2 overdose = 20 + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_PRECURSOR /datum/reagent/toxin/sifslurry/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) // Symbiotic bacteria. @@ -492,6 +532,8 @@ color = "#8E18A9" power = 10 meltdose = 4 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_INDUSTRY /datum/reagent/acid/digestive name = REAGENT_STOMACID @@ -503,6 +545,8 @@ power = 2 meltdose = 30 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/acid/diet_digestive name = REAGENT_DIETSTOMACID @@ -514,6 +558,8 @@ power = 0.4 meltdose = 150 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/thermite/venom name = REAGENT_THERMITEV @@ -524,6 +570,8 @@ color = "#673910" touch_met = 50 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/thermite/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustFireLoss(3 * removed) @@ -546,6 +594,8 @@ color = "#B31008" filtered_organs = list(O_SPLEEN) wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/condensedcapsaicin/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -569,6 +619,8 @@ reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/lexorin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -592,6 +644,8 @@ taste_mult = 0.9 reagent_state = LIQUID color = "#13BC5E" + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/mutagen/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) if(prob(33)) @@ -658,6 +712,8 @@ reagent_state = LIQUID color = "#801E28" wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/slimejelly/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -685,6 +741,8 @@ metabolism = REM * 0.5 ingest_met = REM * 1.5 overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/soporific/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -734,6 +792,8 @@ ingest_met = REM * 1.5 overdose = REAGENTS_OVERDOSE * 0.5 overdose_mod = 2 //For that good, lethal feeling // Reduced with overdose changes. Slightly stronger than before + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/chloralhydrate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -799,6 +859,8 @@ metabolism = REM * 0.25 overdose = REAGENTS_OVERDOSE wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/serotrotium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -813,6 +875,8 @@ description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans. This appears to be a biologically produced form, resulting in a specifically toxic nature." taste_description = "chalky bitterness" filtered_organs = list(O_SPLEEN) + supply_conversion_value = REFINERYEXPORT_VALUE_UNWANTED + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/serotrotium/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -832,6 +896,8 @@ color = "#000055" metabolism = REM * 0.5 overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/cryptobiolin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -855,6 +921,8 @@ color = "#C8A5DC" overdose = REAGENTS_OVERDOSE filtered_organs = list(O_SPLEEN) + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/impedrezene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -876,6 +944,8 @@ color = "#B31008" metabolism = REM * 4 //0.8 per second...This is an 'immediate effect' drug that you hit someone with and they have effects for a prolonged period after. overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/mindbreaker/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -902,6 +972,8 @@ reagent_state = LIQUID color = "#13BC5E" wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/slimetoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.isSynthetic()) @@ -929,6 +1001,8 @@ reagent_state = LIQUID color = "#FF69B4" wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MATSCI /datum/reagent/aslimetoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.isSynthetic()) @@ -963,6 +1037,8 @@ metabolism = REM * 4 // Nanomachines. Fast. affects_robots = TRUE wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/shredding_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustBruteLoss(4 * removed) @@ -978,6 +1054,8 @@ metabolism = REM * 4 affects_robots = TRUE wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/irradiated_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) SSradiation.radiate(get_turf(M), 20) // Irradiate people around you. @@ -994,6 +1072,8 @@ filtered_organs = list(O_SPLEEN) affects_robots = TRUE wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time. @@ -1007,6 +1087,8 @@ color = "#1E4600" taste_mult = 0 wiki_flag = WIKI_SPOILER + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD /datum/reagent/salmonella/on_mob_life(mob/living/carbon/M) M.ForceContractDisease(new /datum/disease/food_poisoning(0)) diff --git a/code/modules/reagents/reagents/virology.dm b/code/modules/reagents/reagents/virology.dm index a90b3a414f..cfe06297dc 100644 --- a/code/modules/reagents/reagents/virology.dm +++ b/code/modules/reagents/reagents/virology.dm @@ -4,6 +4,8 @@ description = "Liquid vaccine against some type of virus." color = "#C81040" taste_description = "antibodies" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/vaccine/affect_blood(mob/living/carbon/M, alien, removed) if(islist(data)) diff --git a/code/modules/reagents/reagents/vore_ch.dm b/code/modules/reagents/reagents/vore_ch.dm index b300be2b67..d877dea769 100644 --- a/code/modules/reagents/reagents/vore_ch.dm +++ b/code/modules/reagents/reagents/vore_ch.dm @@ -8,6 +8,9 @@ reagent_state = LIQUID color = "#FF9999" scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_DRUG + /datum/reagent/aphrodisiac/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!M) return @@ -22,6 +25,8 @@ reagent_state = LIQUID color = "#10881A" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_RARE + industrial_use = REFINERYEXPORT_REASON_ILLDRUG /datum/reagent/sorbitol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.make_dizzy(1) diff --git a/code/modules/reagents/reagents/vore_vr.dm b/code/modules/reagents/reagents/vore_vr.dm index b4098f03c0..b5c1ea5acc 100644 --- a/code/modules/reagents/reagents/vore_vr.dm +++ b/code/modules/reagents/reagents/vore_vr.dm @@ -11,6 +11,8 @@ color = "#FFFF00" // rgb: 255, 255, 0 metabolism = 0.01 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_GODTIER + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/new_size = clamp((M.size_multiplier + 0.01), RESIZE_MINIMUM_DORMS, RESIZE_MAXIMUM_DORMS) @@ -25,6 +27,8 @@ color = "#800080" metabolism = 0.01 mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_GODTIER + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/new_size = clamp((M.size_multiplier - 0.01), RESIZE_MINIMUM_DORMS, RESIZE_MAXIMUM_DORMS) @@ -40,6 +44,8 @@ color = "#00FFFF" metabolism = 0.01 //One unit will be just enough to bring someone from 200% to 100% mrate_static = TRUE + supply_conversion_value = REFINERYEXPORT_VALUE_GODTIER + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/normalcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.size_multiplier > RESIZE_NORMAL) @@ -56,6 +62,8 @@ reagent_state = LIQUID color = "#1E90FF" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PEAK + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/sizeoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.make_dizzy(1) @@ -73,6 +81,8 @@ reagent_state = LIQUID color = "#0E900E" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/ickypak/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.make_dizzy(1) @@ -95,6 +105,8 @@ reagent_state = LIQUID color = "#EF77E5" overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/unsorbitol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.make_dizzy(1) @@ -126,12 +138,17 @@ description = "A base medical concoction, capable of rapidly altering genetic and physical structure of the body. Requires extra processing to allow for a targeted transformation." reagent_state = LIQUID color = "#AAAAAA" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI + /datum/reagent/androrovir name = REAGENT_ANDROROVIR id = REAGENT_ID_ANDROROVIR description = "A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems to realign the target's gender to be male." reagent_state = LIQUID color = "#00BBFF" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/androrovir/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!(M.allow_spontaneous_tf)) @@ -153,6 +170,8 @@ description = "A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems to realign the target's gender to be female." reagent_state = LIQUID color = "#FF00AA" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/gynorovir/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!(M.allow_spontaneous_tf)) @@ -174,6 +193,8 @@ description = "A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems to realign the target's gender to be mixed." reagent_state = LIQUID color = "#6600FF" + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/androgynorovir/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!(M.allow_spontaneous_tf)) @@ -227,6 +248,8 @@ metabolism = REM * 0.25 overdose = REAGENTS_OVERDOSE scannable = 0 //YOU ARE NOT SCANNING THE FUNNY PARALYSIS TOXIN. NO. BAD. STAY AWAY. + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/paralysis_toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.weakened < 50 || M.stunned <50 ) //Let's not leave them PERMA stuck, after all. //CHOMPedit, stun accounting for crawl @@ -244,6 +267,8 @@ mrate_static = TRUE overdose = 100 //There is no OD. You already are taking the worst of it. scannable = 0 //Let's not have medical mechs able to make an extremely strong 'I hit you you fall down in agony' chem. + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_WEAPONS /datum/reagent/pain_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_PAINKILLER, -200) diff --git a/code/modules/refinery/core/industrial_reagent_filter.dm b/code/modules/refinery/core/industrial_reagent_filter.dm new file mode 100644 index 0000000000..93a05338d5 --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_filter.dm @@ -0,0 +1,133 @@ +/obj/machinery/reagent_refinery/filter + name = "Industrial Chemical Filter" + desc = "Identifies and extracts specific chemicals." + icon_state = "filter_l" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 5 + active_power_usage = 50 + circuit = /obj/item/circuitboard/industrial_reagent_pump + VAR_PROTECTED/filter_side = -1 // L + VAR_PRIVATE/filter_reagent_id = "" + + possible_transfer_amounts = list(0,1,2,5,10,15,20,25,30,40,60) + default_max_vol = 60 // smoll to match pipes + +/obj/machinery/reagent_refinery/filter/alt + filter_side = 1 // R + icon_state = "filter_r" + +/obj/machinery/reagent_refinery/filter/Initialize(mapload) + . = ..() + default_apply_parts() + // Update neighbours and self for state + update_neighbours() + update_icon() + AddElement(/datum/element/climbable) + +/obj/machinery/reagent_refinery/filter/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + // extract and filter side products + if(filter_reagent_id == "") + return // MUST BE SET + if(amount_per_transfer_from_this <= 0) + return + if(filter_reagent_id != "-1" || filter_reagent_id == "-2") // disabled check, and "all" check + var/check_dir = 0 + if(filter_side == 1) + check_dir = turn(src.dir, 270) + else + check_dir = turn(src.dir, 90) + var/obj/machinery/reagent_refinery/filter_target = locate(/obj/machinery/reagent_refinery) in get_step(get_turf(src),check_dir) + if(filter_target && reagents.total_volume > 0) + transfer_tank( reagents, filter_target, check_dir, filter_reagent_id == "-2" ? "" : filter_reagent_id) + // dump reagents to next refinery machine if all of the target reagent has been filtered out + if(filter_reagent_id != "-2") // "all" filter option pushes it all out the side path + var/obj/machinery/reagent_refinery/target = locate(/obj/machinery/reagent_refinery) in get_step(get_turf(src),dir) + if(target && reagents.total_volume > 0) + transfer_tank( reagents, target, dir) + +/obj/machinery/reagent_refinery/filter/update_icon() + cut_overlays() + icon_state = "filter_[filter_side == 1 ? "r" : "l"]" + + if(reagents && reagents.total_volume > 0) + var/image/filling = image(icon, loc, "[icon_state]_r",dir = dir) + filling.color = reagents.get_color() + add_overlay(filling) + +/obj/machinery/reagent_refinery/filter/attack_hand(mob/user) + set_filter() + +/obj/machinery/reagent_refinery/filter/proc/get_filter_side() + return filter_side + +/obj/machinery/reagent_refinery/filter/verb/set_filter() + PRIVATE_PROC(TRUE) + set name = "Set Filter Chemical" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained()) + return + + // Get a list of reagents currently inside! + var/list/tgui_list = list("Disabled" = "","Bypass" = "-1","All" = "-2") + for(var/datum/reagent/R in reagents.reagent_list) + if(R) + tgui_list[R.name] = R.id + + var/filter = "disabled" + if(filter_reagent_id == "-1") + filter = "filtering out nothing" + else if(filter_reagent_id == "-2") + filter = "filtering out everything" + else if(filter_reagent_id != "") + var/datum/reagent/R = SSchemistry.chemical_reagents[filter_reagent_id] + filter = "filtering [R.name]" + var/select = tgui_input_list(usr, "Select chemical to filter. It is currently [filter].", "Chemical Select", tgui_list) + + if (usr.stat || usr.restrained()) + return + + // Select if possible + if(select && select != "") + filter_reagent_id = tgui_list[select] + +/obj/machinery/reagent_refinery/filter/verb/flip_filter() + PRIVATE_PROC(TRUE) + set name = "Flip Filter Direction" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained() || anchored) + return + + filter_side *= -1 + update_icon() + +/obj/machinery/reagent_refinery/filter/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // pumps, furnaces and filters can only be FED in a straight line + if(source_forward_dir != dir) + return 0 + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/filter/examine(mob/user, infix, suffix) + . = ..() + var/filter = "disabled" + if(filter_reagent_id == "-1") + filter = "filtering out nothing" + else if(filter_reagent_id == "-2") + filter = "filtering out everything" + else if(filter_reagent_id != "") + var/datum/reagent/R = SSchemistry.chemical_reagents[filter_reagent_id] + filter = "filtering [R.name]" + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is currently [filter]. At a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_INPUT|REFINERY_TUTORIAL_FILTER, .) diff --git a/code/modules/refinery/core/industrial_reagent_furnace.dm b/code/modules/refinery/core/industrial_reagent_furnace.dm new file mode 100644 index 0000000000..e16ad03476 --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_furnace.dm @@ -0,0 +1,211 @@ +/obj/machinery/reagent_refinery/furnace + name = "Industrial Chemical Furnace" + desc = "Extracts specific chemicals, compressing and heating them until they solidify." + icon_state = "furnace_l" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 5 + active_power_usage = 500 + circuit = /obj/item/circuitboard/industrial_reagent_furnace + VAR_PROTECTED/filter_side = -1 // L + VAR_PRIVATE/filter_reagent_id = "" + + default_max_vol = 60 + VAR_PRIVATE/obj/item/reagent_containers/beaker = null // Safer than retooling all of reagent code to support a second reagent var inside this one object + +/obj/machinery/reagent_refinery/furnace/alt + filter_side = 1 // R + icon_state = "furnace_r" + +/obj/machinery/reagent_refinery/furnace/Initialize(mapload) + . = ..() + default_apply_parts() + beaker = new /obj/item/reagent_containers/glass/beaker/bluespace(src) // Get it all out as fast as possible + // Can't be set on these + src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT + // Update neighbours and self for state + update_neighbours() + update_icon() + AddElement(/datum/element/climbable) + +/obj/machinery/reagent_refinery/furnace/Destroy() + . = ..() + qdel_null(beaker) + +/obj/machinery/reagent_refinery/furnace/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + // extract and filter side products + if(filter_reagent_id == "") + return // MUST BE SET + if(amount_per_transfer_from_this <= 0) + return + if(filter_reagent_id != "-1") // disabled check, and "all" check + var/check_dir = 0 + if(filter_side == 1) + check_dir = turn(src.dir, 270) + else + check_dir = turn(src.dir, 90) + var/turf/spawn_t = get_step(get_turf(src),check_dir) + + // Suck out the reagent we're looking for into temporary holding + if(reagents.total_volume > 0) + for(var/datum/reagent/R in reagents.reagent_list) + if(R && R.id == filter_reagent_id) + reagents.trans_id_to(beaker, R.id, R.volume) + + // while loop is sane here because the beaker should always be cleaned when changing filter type, + // and it should never end up mixed with more than 1 type of reagent + // For sanity, and if admemes break something, I will do a clearing anyway.... + if(beaker.reagents.reagent_list.len > 1) + beaker.reagents.clear_reagents() // Highlander rules + var/played_sound = FALSE + while(beaker.reagents.total_volume >= REAGENTS_PER_SHEET) // at least enough reagents to bother checking + var/datum/reagent/R = beaker.reagents.reagent_list[1] + var/mat_id = GLOB.reagent_sheets[R.id] + beaker.reagents.remove_reagent(R.id,REAGENTS_PER_SHEET) + switch(mat_id) + if(REFINERY_SINTERING_SMOKE) + // Smoke em out sometimes + if(prob(30)) + if(!played_sound) + playsound(src, 'sound/items/electronic_assembly_emptying.ogg', 50, 1) + playsound(src, 'sound/effects/smoke.ogg', 20, 1) + played_sound = TRUE + visible_message(span_notice("\The [src] vomits a gout of smoke!")) + var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad + smoke.attach(src) + smoke.set_up(10, 0, get_turf(src), 300) + smoke.start() + if(REFINERY_SINTERING_EXPLODE) + // Detonate + if(!played_sound) + visible_message(span_danger("\The [src] catches fire and violently explodes!")) + played_sound = TRUE + explosion(loc, 0, 1, 2, 4) + visible_message("\The [src.name] detonates!") + if(REFINERY_SINTERING_SPIDERS) + // Spawns some spiders + if(!played_sound) + playsound(src, 'sound/items/fulext_deploy.wav', 40, 1) + played_sound = TRUE + var/i = rand(1,3) + while(i-- > 0) + new /obj/effect/spider/spiderling/non_growing(spawn_t) + if(prob(20)) + i = rand(1,2) + while(i-- > 0) + new /obj/effect/spider/spiderling/varied(spawn_t) + else + var/datum/material/printing = get_material_by_name(mat_id) + if(printing) + // Place a sheet + if(!played_sound) + playsound(src, 'sound/items/electronic_assembly_emptying.ogg', 50, 1) + played_sound = TRUE + var/obj/item/stack/material/S = printing.place_sheet(src, 1) // One at a time + S.forceMove(spawn_t) // autostack + if(!istype(S)) + warning("[src] tried to eject material '[printing]', which didn't generate a proper stack when asked!") + // dump reagents to next refinery machine if all of the target reagent has been filtered out + var/obj/machinery/reagent_refinery/target = locate(/obj/machinery/reagent_refinery) in get_step(get_turf(src),dir) + if(target && reagents.total_volume > 0) + transfer_tank( reagents, target, dir) + +/obj/machinery/reagent_refinery/furnace/update_icon() + cut_overlays() + icon_state = "furnace_[filter_side == 1 ? "r" : "l"]" + + if(reagents && reagents.total_volume > 0) + var/image/filling = image(icon, loc, "[icon_state]_r",dir = dir) + filling.color = reagents.get_color() + add_overlay(filling) + else if(beaker && beaker.reagents && beaker.reagents.total_volume > 0) + var/image/filling = image(icon, loc, "[icon_state]_r",dir = dir) + filling.color = beaker.reagents.get_color() + add_overlay(filling) + +/obj/machinery/reagent_refinery/furnace/attack_hand(mob/user) + set_filter() + +/obj/machinery/reagent_refinery/furnace/verb/set_filter() + PRIVATE_PROC(TRUE) + set name = "Set Sintering Chemical" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained()) + return + + // Get a list of reagents currently inside! + var/list/tgui_list = list("Disabled" = "","Bypass" = "-1") + for(var/datum/reagent/R in reagents.reagent_list) + if(R) + var/mat_id = GLOB.reagent_sheets[R.id] + if(!mat_id) // No reaction + continue + var/id_string = "[R.name] - ???" + switch(mat_id) + if(REFINERY_SINTERING_SMOKE) + id_string = "[R.name] - DANGER" + if(REFINERY_SINTERING_EXPLODE) + id_string = "[R.name] - DANGER" + if(REFINERY_SINTERING_SPIDERS) + id_string = "[R.name] - DANGER" + else + var/datum/material/C = get_material_by_name(mat_id) + if(C) + id_string = "[R.name] - [C.display_name] [C.sheet_plural_name]" + tgui_list[id_string] = R.id + + var/filter = "disabled" + if(filter_reagent_id == "-1") + filter = "sintering out nothing" + else if(filter_reagent_id != "") + var/datum/reagent/R = SSchemistry.chemical_reagents[filter_reagent_id] + filter = "sintering [R.name]" + var/select = tgui_input_list(usr, "Select chemical to sinter. It is currently [filter].", "Chemical Select", tgui_list) + + if (usr.stat || usr.restrained()) + return + + // Select if possible + if(select && select != "") + filter_reagent_id = tgui_list[select] + beaker.reagents.clear_reagents() + update_icon() + +/obj/machinery/reagent_refinery/furnace/verb/flip_furnace() + set name = "Flip Furnace Direction" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained() || anchored) + return + + filter_side *= -1 + update_icon() + +/obj/machinery/reagent_refinery/furnace/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // pumps, furnaces and filters can only be FED in a straight line + if(source_forward_dir != dir) + return 0 + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/furnace/examine(mob/user, infix, suffix) + . = ..() + var/filter = "disabled" + if(filter_reagent_id == "-1") + filter = "sintering out nothing" + else if(filter_reagent_id != "") + var/datum/reagent/R = SSchemistry.chemical_reagents[filter_reagent_id] + filter = "sintering [R.name]" + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is currently [filter]." + . += "The sintering mold is [ (beaker.reagents.total_volume / REAGENTS_PER_SHEET) * 100 ]% full." + tutorial(REFINERY_TUTORIAL_INPUT, .) diff --git a/code/modules/refinery/core/industrial_reagent_grinder.dm b/code/modules/refinery/core/industrial_reagent_grinder.dm new file mode 100644 index 0000000000..032bd251de --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_grinder.dm @@ -0,0 +1,136 @@ +/obj/machinery/reagent_refinery/grinder + name = "Industrial Chemical Grinder" + desc = "Grinds anything and everything into chemical slurry." + icon_state = "grinder_off" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 5 + active_power_usage = 300 + circuit = /obj/item/circuitboard/industrial_reagent_grinder + VAR_PRIVATE/limit = 50 + VAR_PRIVATE/list/holdingitems = list() + +/obj/machinery/reagent_refinery/grinder/Initialize(mapload) + . = ..() + default_apply_parts() + // Can't be set on these + src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT + // Update neighbours and self for state + update_neighbours() + update_icon() + +/obj/machinery/reagent_refinery/grinder/Destroy() + for(var/obj/O in holdingitems) + O.forceMove(get_turf(src)) + holdingitems.Cut() + . = ..() + +/obj/machinery/reagent_refinery/grinder/attackby(var/obj/item/O as obj, var/mob/user as mob) + . = ..() + if(.) + return + + // Insert grindables if not handled by parent proc + if(holdingitems && holdingitems.len >= limit) + to_chat(user, "The machine cannot hold anymore items.") + return TRUE + + // Botany/Chemistry gameplay + if(istype(O,/obj/item/storage/bag)) + var/obj/item/storage/bag/bag = O + var/failed = 1 + for(var/obj/item/G in O.contents) + if(!G.reagents || !G.reagents.total_volume) + continue + failed = 0 + bag.remove_from_storage(G, src) + holdingitems += G + if(holdingitems && holdingitems.len >= limit) + break + + if(failed) + to_chat(user, "Nothing in \the [O] is usable.") + return 1 + + if(!O.contents.len) + to_chat(user, "You empty \the [O] into \the [src].") + else + to_chat(user, "You fill \the [src] from \the [O].") + return FALSE + + // Borgos! + if(istype(O,/obj/item/gripper)) + var/obj/item/gripper/B = O //B, for Borg. + if(!B.wrapped) + to_chat(user, "\The [B] is not holding anything.") + return FALSE + else + var/B_held = B.wrapped + to_chat(user, "You use \the [B] to load \the [src] with \the [B_held].") + return FALSE + + // Needs to be sheet, ore, or grindable reagent containing things + 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 + + user.drop_from_inventory(O,src) + holdingitems += O + update_icon() + return TRUE + +/obj/machinery/reagent_refinery/grinder/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + 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) + playsound(src, 'sound/items/electronic_assembly_emptying.ogg', 50, 1) + playsound(src, 'sound/effects/metalscrape2.ogg', 50, 1) + if(holdingitems.len == 0) + update_icon() + + refinery_transfer() + +/obj/machinery/reagent_refinery/grinder/update_icon() + cut_overlays() + var/image/pipe = image(icon, icon_state = "grinder_cons", dir = dir) + add_overlay(pipe) + if(stat & (NOPOWER|BROKEN) || !anchored) + icon_state = "grinder_off" + else + icon_state = "grinder_on" + 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 + if(!AM || QDELETED(AM)) + return + if(holdingitems.len >= limit) + return + if(ismob(AM)) // No mob bumping YET + return + if(!GLOB.sheet_reagents[AM.type] && !GLOB.ore_reagents[AM.type] && (!AM.reagents || !AM.reagents.total_volume)) + return + + AM.forceMove(src) + holdingitems += AM + +/obj/machinery/reagent_refinery/grinder/examine(mob/user, infix, suffix) + . = ..() + . += "The intake cache shows [holdingitems.len] / [limit] grindable items." + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_NOINPUT, .) + +/obj/machinery/reagent_refinery/grinder/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // Grinder forbids input + return 0 diff --git a/code/modules/refinery/core/industrial_reagent_hub.dm b/code/modules/refinery/core/industrial_reagent_hub.dm new file mode 100644 index 0000000000..e5539c9cc5 --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_hub.dm @@ -0,0 +1,85 @@ +/obj/machinery/reagent_refinery/hub + name = "Industrial Chemical Hub" + desc = "A platform for loading and unloading cargo tug tankers." + icon_state = "hub" + density = FALSE + anchored = TRUE + use_power = USE_POWER_OFF // Does not require power for pipes + idle_power_usage = 0 + active_power_usage = 0 + circuit = /obj/item/circuitboard/industrial_reagent_hub + default_max_vol = 0 + VAR_PRIVATE/wait_delay = 4 SECONDS + +/obj/machinery/reagent_refinery/hub/Initialize(mapload) + . = ..() + default_apply_parts() + // Update neighbours and self for state + update_neighbours() + update_icon() + +/obj/machinery/reagent_refinery/hub/process() + if(!anchored) + return + + if(stat & (BROKEN)) + return + + if (amount_per_transfer_from_this <= 0) + return + + var/obj/machinery/reagent_refinery/target = locate(/obj/machinery/reagent_refinery) in get_step(loc,dir) + if(target && target.dir != GLOB.reverse_dir[dir]) + var/obj/vehicle/train/trolley_tank/tanker = locate(/obj/vehicle/train/trolley_tank) in loc + if(tanker && tanker.reagents.total_volume > 0 && world.time > tanker.l_move_time + wait_delay) + // dump reagents to next refinery machine + transfer_tank( tanker.reagents, target, dir) + +/obj/machinery/reagent_refinery/hub/update_icon() + cut_overlays() + var/turf/T = get_step(get_turf(src),dir) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + var/intake = FALSE + if(other && other.anchored)// Waste processors do not connect to anything as outgoing + if(!istype(other,/obj/machinery/reagent_refinery/waste_processor)) + // weird handling for side connections... Otherwise, anything pointing into use gets connected back! + if(istype(other,/obj/machinery/reagent_refinery/filter)) + var/obj/machinery/reagent_refinery/filter/filt = other + var/check_dir = 0 + if(filt.get_filter_side() == 1) + check_dir = turn(filt.dir, 270) + else + check_dir = turn(filt.dir, 90) + if(check_dir == GLOB.reverse_dir[dir]) + intake = TRUE + if(other.dir == GLOB.reverse_dir[dir]) + intake = TRUE + // Get main dir pipe + if(intake) + var/image/pipe = image(icon, icon_state = "hub_intakes", dir = dir) + add_overlay(pipe) + else + var/image/pipe = image(icon, icon_state = "hub_cons", dir = dir) + add_overlay(pipe) + +/obj/machinery/reagent_refinery/hub/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + if(istype(origin_machine,/obj/machinery/reagent_refinery/hub)) // Hubs cannot send into other hubs + return 0 + if(dir != GLOB.reverse_dir[source_forward_dir] ) // The hub must be facing into its source to accept input, unlike others + return 0 + var/obj/vehicle/train/trolley_tank/tanker = locate(/obj/vehicle/train/trolley_tank) in get_turf(src) + if(!tanker) + return 0 + if(world.time < tanker.l_move_time + wait_delay) // await cooldown to avoid spamming moving tanks + return 0 + // Don't call parent, we're transfering into the holding tank instead + if(filter_id == "") + return RT.trans_to_obj(tanker, amount_per_transfer_from_this) + else + // Split out reagent... + return RT.trans_id_to(tanker, filter_id, amount_per_transfer_from_this) + +/obj/machinery/reagent_refinery/hub/examine(mob/user, infix, suffix) + . = ..() + . += "It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_HUB|REFINERY_TUTORIAL_NOPOWER, .) diff --git a/code/modules/refinery/core/industrial_reagent_machines.dm b/code/modules/refinery/core/industrial_reagent_machines.dm new file mode 100644 index 0000000000..5da9e471bd --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_machines.dm @@ -0,0 +1,170 @@ +/obj/machinery/reagent_refinery + icon = 'icons/obj/machines/refinery_machines.dmi' + VAR_PROTECTED/default_max_vol = 120 + VAR_PROTECTED/amount_per_transfer_from_this = 120 + VAR_PROTECTED/possible_transfer_amounts = REFINERY_DEFAULT_TRANSFER_AMOUNTS + VAR_PROTECTED/reagent_type = /datum/reagents + +/obj/machinery/reagent_refinery/Initialize(mapload) + . = ..() + // reagent control + if(default_max_vol > 0) + create_reagents(default_max_vol, reagent_type) + // Update neighbours and self for state + update_neighbours() + update_icon() + +/obj/machinery/reagent_refinery/Destroy() + reagent_flush() + . = ..() + +/obj/machinery/reagent_refinery/dismantle() + reagent_flush() + . = ..() + +/obj/machinery/reagent_refinery/set_dir(newdir) + . = ..() + update_icon() + +/obj/machinery/reagent_refinery/on_reagent_change(changetype) + update_icon() + +/// Splashes reagents all over the floor, called from destroy and dismantle. +/obj/machinery/reagent_refinery/proc/reagent_flush() + if(reagents && reagents.total_volume > 30) + visible_message(span_danger("\The [src] splashes everywhere as it is disassembled!")) + reagents.splash_area(get_turf(src),2) + +/obj/machinery/reagent_refinery/attackby(var/obj/item/O as obj, var/mob/user as mob) + if (istype(O, /obj/item/multitool)) // Solar grubs + return ..() + if(O.has_tool_quality(TOOL_WRENCH)) + if(!anchored) + for(var/obj/machinery/reagent_refinery/R in loc.contents) + if(R != src) + to_chat(usr,span_warning("You cannot anchor \the [src] until \The [R] is moved out of the way!")) + return + playsound(src, O.usesound, 75, 1) + anchored = !anchored + user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \ + "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.", \ + "You hear a ratchet.") + update_neighbours() + update_icon() + return + if(reagents && (istype(O,/obj/item/reagent_containers/glass) || \ + istype(O,/obj/item/reagent_containers/food/drinks/glass2) || \ + istype(O,/obj/item/reagent_containers/food/drinks/shaker))) + // Transfer FROM internal beaker to this. + if (reagents.total_volume <= 0) + to_chat(usr,"\The [src] is empty. There is nothing to drain into \the [O].") + return + // Fill up the whole volume if we can, DUMP IT OUT + var/obj/item/reagent_containers/C = O + reagents.trans_to_obj(C, reagents.total_volume) + playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1) + to_chat(usr,"You drain \the [src] into \the [C].") + return + if(default_deconstruction_screwdriver(user, O)) + return + if(default_deconstruction_crowbar(user, O)) + return + . = ..() + +/// Updates the icons of all neighbour machines, used when connecting. +/obj/machinery/reagent_refinery/proc/update_neighbours() + // Update icons and neighbour icons to avoid loss of sanity + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(get_turf(src),direction) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + if(other && other.anchored) + other.update_icon() + +/// Changes the transfer rate of reagents from this machine to the next +/obj/machinery/reagent_refinery/verb/set_APTFT() //set amount_per_transfer_from_this + PROTECTED_PROC(TRUE) + set name = "Set transfer amount" + set category = "Object" + set src in view(1) + var/N = tgui_input_list(usr, "Amount per transfer from this:","[src]", possible_transfer_amounts) + if(N && Adjacent(usr)) + amount_per_transfer_from_this = N + update_icon() + +/// Transfers reagents from us to the next machine. Calls handle_transfer() on any target machines to check if they can accept reagents. +/obj/machinery/reagent_refinery/proc/transfer_tank( var/datum/reagents/RT, var/obj/machinery/reagent_refinery/target, var/source_forward_dir, var/filter_id = "") + PROTECTED_PROC(TRUE) + if(RT.total_volume <= 0 || !anchored || !target.anchored) + return 0 + if(active_power_usage > 0 && !can_use_power_oneoff(active_power_usage)) + return 0 + if(!istype(target,/obj/machinery/reagent_refinery)) // cannot transfer into grinders anyway, so it's fine to do it this way. + return 0 + var/transfered = target.handle_transfer(src,RT,source_forward_dir,filter_id) + if(transfered > 0 && active_power_usage > 0) + use_power_oneoff(active_power_usage) + return transfered + +/// Handles reagent recieving from transfer_tank(), returns how much reagent was transfered if successful. Overriden to prevent access from certain sides or for filtering. +/obj/machinery/reagent_refinery/proc/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") // Handle transfers in an override, instead of one monster function that typechecks like transfer_tank() used to be + // Transfer to target in amounts every process tick! + if(filter_id == "") + var/amount = RT.trans_to_obj(src, amount_per_transfer_from_this) + return amount + // Split out reagent... + return RT.trans_id_to(src, filter_id, amount_per_transfer_from_this, TRUE) + +/obj/machinery/reagent_refinery/proc/refinery_transfer() + if(amount_per_transfer_from_this <= 0 || reagents.total_volume <= 0) + return 0 + + // dump reagents to next refinery machine + var/obj/machinery/reagent_refinery/target = locate(/obj/machinery/reagent_refinery) in get_step(get_turf(src),dir) + if(!target) + return 0 + + return transfer_tank( reagents, target, dir) + +/obj/machinery/reagent_refinery/verb/rotate_clockwise() + set name = "Rotate Machine Clockwise" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained() || anchored) + return + + src.set_dir(turn(src.dir, 270)) + update_icon() + +/obj/machinery/reagent_refinery/verb/rotate_counterclockwise() + set name = "Rotate Machine Counterclockwise" + set category = "Object" + set src in view(1) + + if (usr.stat || usr.restrained() || anchored) + return + + src.set_dir(turn(src.dir, 90)) + update_icon() + +/obj/machinery/reagent_refinery/proc/tutorial(var/flags,var/list/examine_list) + // Specialty + if(flags & REFINERY_TUTORIAL_HUB) + examine_list += "A trolly tanker can be drained or filled depending on if this machine is attached to the input or output of another machine. " + // Input handling + if(flags & REFINERY_TUTORIAL_NOINPUT) + examine_list += "This machine does not accept any inputs, and only outputs. " + if(flags & REFINERY_TUTORIAL_ALLIN) + examine_list += "This machine accepts input from all sides. " + if(flags & REFINERY_TUTORIAL_SINGLEOUTPUT) + examine_list += "This machine accepts inputs on all sides, except for its output. " + if(flags & REFINERY_TUTORIAL_NOOUTPUT) + examine_list += "This machine does not have any outputs. " + // Pipe markings + if(flags & REFINERY_TUTORIAL_INPUT) + examine_list += "The red pipe marks the input. " + if(flags & REFINERY_TUTORIAL_FILTER) + examine_list += "The purple pipe marks the filtered output. " + // No power needed + if(flags & REFINERY_TUTORIAL_NOPOWER) + examine_list += "Does not require power. " diff --git a/code/modules/refinery/core/industrial_reagent_pipe.dm b/code/modules/refinery/core/industrial_reagent_pipe.dm new file mode 100644 index 0000000000..5af43dbe4a --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_pipe.dm @@ -0,0 +1,67 @@ +/obj/machinery/reagent_refinery/pipe + name = "Industrial Chemical Pipe" + desc = "A large pipe made for transporting industrial chemicals. It has a low-power passive pump. The red marks show where the flow is coming from. Does not require power." + icon_state = "pipe" + density = TRUE + anchored = TRUE + use_power = USE_POWER_OFF // Does not require power for pipes + idle_power_usage = 0 + active_power_usage = 0 + circuit = /obj/item/circuitboard/industrial_reagent_pipe + default_max_vol = 60 // smoll + +/obj/machinery/reagent_refinery/pipe/Initialize(mapload) + . = ..() + default_apply_parts() + // Can't be set on these + src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT + // Update neighbours and self for state + update_neighbours() + update_icon() + AddElement(/datum/element/climbable) + +/obj/machinery/reagent_refinery/pipe/process() + if(!anchored) + return + + if(stat & (BROKEN)) + return + + refinery_transfer() + +/obj/machinery/reagent_refinery/pipe/update_icon() + cut_overlays() + if(anchored) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(get_turf(src),direction) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + if(other && other.anchored) + // Waste processors do not connect to anything as outgoing + if(istype(other,/obj/machinery/reagent_refinery/waste_processor)) + continue + // weird handling for side connections... Otherwise, anything pointing into use gets connected back! + if(istype(other,/obj/machinery/reagent_refinery/filter)) + var/obj/machinery/reagent_refinery/filter/filt = other + var/check_dir = 0 + if(filt.get_filter_side() == 1) + check_dir = turn(filt.dir, 270) + else + check_dir = turn(filt.dir, 90) + if(check_dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "pipe_intakes", dir = direction) + add_overlay(intake) + continue + if(other.dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "pipe_intakes", dir = direction) + add_overlay(intake) + +/obj/machinery/reagent_refinery/pipe/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // no back/forth, filters don't use just their forward, they send the side too! + if(dir == GLOB.reverse_dir[source_forward_dir]) + return 0 + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/pipe/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u." + tutorial(REFINERY_TUTORIAL_SINGLEOUTPUT|REFINERY_TUTORIAL_NOPOWER, .) diff --git a/code/modules/refinery/core/industrial_reagent_pump.dm b/code/modules/refinery/core/industrial_reagent_pump.dm new file mode 100644 index 0000000000..612ff9a4cb --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_pump.dm @@ -0,0 +1,55 @@ +/obj/machinery/reagent_refinery/pump + name = "Industrial Chemical Pump" + desc = "Transports large amounts of chemicals between machines, it also has connections for various types of hoses." + icon_state = "pump" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 0 + active_power_usage = 50 + circuit = /obj/item/circuitboard/industrial_reagent_pump + +/obj/machinery/reagent_refinery/pump/Initialize(mapload) + . = ..() + default_apply_parts() + // Update neighbours and self for state + update_neighbours() + update_icon() + + AddComponent(/datum/component/hose_connector/input) + AddComponent(/datum/component/hose_connector/input) + AddComponent(/datum/component/hose_connector/input) + AddComponent(/datum/component/hose_connector/output) + + AddElement(/datum/element/climbable) + +/obj/machinery/reagent_refinery/pump/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + refinery_transfer() + +/obj/machinery/reagent_refinery/pump/update_icon() + cut_overlays() + if(reagents && reagents.total_volume >= 5) + var/image/filling = image(icon, loc, "pump_r",dir = dir) + filling.color = reagents.get_color() + add_overlay(filling) + +/obj/machinery/reagent_refinery/pump/attack_hand(mob/user) + set_APTFT() + +/obj/machinery/reagent_refinery/pump/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // pumps, furnaces and filters can only be FED in a straight line + if(source_forward_dir != dir) + return 0 + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/pump/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_INPUT, .) diff --git a/code/modules/refinery/core/industrial_reagent_reactor.dm b/code/modules/refinery/core/industrial_reagent_reactor.dm new file mode 100644 index 0000000000..ebb2502bb3 --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_reactor.dm @@ -0,0 +1,155 @@ +#define REACTOR_MODE_INTAKE 0 +#define REACTOR_MODE_OUTPUT 1 + +/obj/machinery/reagent_refinery/reactor + name = "Industrial Chemical Reactor" + desc = "A reinforced chamber for high temperature distillation. Can be connected to a pipe network to change the interior atmosphere. It outputs chemicals on a timer, to allow for distillation." + icon_state = "reactor" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 0 + active_power_usage = 500 + circuit = /obj/item/circuitboard/industrial_reagent_reactor + default_max_vol = REAGENT_VAT_VOLUME + reagent_type = /datum/reagents/distilling + + VAR_PRIVATE/obj/machinery/portable_atmospherics/canister/internal_tank + VAR_PRIVATE/toggle_mode = REACTOR_MODE_INTAKE + VAR_PRIVATE/next_mode_toggle = 0 + + VAR_PRIVATE/dis_time = 30 + VAR_PRIVATE/drain_time = 10 + +/obj/machinery/reagent_refinery/reactor/Initialize(mapload) + . = ..() + default_apply_parts() + internal_tank = new /obj/machinery/portable_atmospherics/canister/empty() + update_gas_network() + next_mode_toggle = world.time + dis_time SECONDS + // Update neighbours and self for state + update_neighbours() + update_icon() + AddElement(/datum/element/climbable) + +/obj/machinery/reagent_refinery/reactor/Destroy() + . = ..() + qdel_null(internal_tank) + +/obj/machinery/reagent_refinery/reactor/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + if(next_mode_toggle < world.time) + if(toggle_mode == REACTOR_MODE_INTAKE) + if(reagents && reagents.total_volume > 0 && amount_per_transfer_from_this > 0) + toggle_mode = REACTOR_MODE_OUTPUT // Only drain if anything in it! + next_mode_toggle = world.time + drain_time SECONDS + else + toggle_mode = REACTOR_MODE_INTAKE + next_mode_toggle = world.time + dis_time SECONDS + update_icon() + + if(amount_per_transfer_from_this <= 0 || reagents.total_volume <= 0) + return + + if(toggle_mode == REACTOR_MODE_INTAKE) + // perform reactions + reagents.handle_reactions() + else + // dump reagents to next refinery machine + var/obj/machinery/reagent_refinery/target = locate(/obj/machinery/reagent_refinery) in get_step(loc,dir) + if(target) + transfer_tank( reagents, target, dir) + +/obj/machinery/reagent_refinery/reactor/update_icon() + cut_overlays() + // Get main dir pipe + var/image/pipe = image(icon, icon_state = "reactor_cons", dir = dir) + add_overlay(pipe) + if(anchored) + if(!(stat & (NOPOWER|BROKEN))) + var/image/dot = image(icon, icon_state = "vat_dot_[ toggle_mode > REACTOR_MODE_INTAKE ? "on" : "off" ]") // Show refinery output mode + add_overlay(dot) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(get_turf(src),direction) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + if(other && other.anchored) + // Waste processors do not connect to anything as outgoing + if(istype(other,/obj/machinery/reagent_refinery/waste_processor)) + continue + // weird handling for side connections... Otherwise, anything pointing into use gets connected back! + if(istype(other,/obj/machinery/reagent_refinery/filter)) + var/obj/machinery/reagent_refinery/filter/filt = other + var/check_dir = 0 + if(filt.get_filter_side() == 1) + check_dir = turn(filt.dir, 270) + else + check_dir = turn(filt.dir, 90) + if(check_dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "reactor_intakes", dir = direction) + add_overlay(intake) + continue + if(other.dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "reactor_intakes", dir = direction) + add_overlay(intake) + +/obj/machinery/reagent_refinery/reactor/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // no back/forth, filters don't use just their forward, they send the side too! + if(dir == GLOB.reverse_dir[source_forward_dir]) + return 0 + // locked until distilling mode + if(toggle_mode == REACTOR_MODE_OUTPUT) + return 0 + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/reactor/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + var/datum/gas_mixture/GM = internal_tank.return_air() + . += "The internal temperature is [GM.temperature]k at [GM.return_pressure()]kpa. It is currently in a [toggle_mode ? "pumping cycle, outputting stored chemicals" : "distilling cycle, accepting input chemicals"]." + tutorial(REFINERY_TUTORIAL_SINGLEOUTPUT, .) + +/obj/machinery/reagent_refinery/reactor/attackby(var/obj/item/O as obj, var/mob/user as mob) + . = ..() + if(O.has_tool_quality(TOOL_WRENCH)) + update_gas_network() // Handles anchoring + toggle_mode = REACTOR_MODE_INTAKE + next_mode_toggle = world.time + dis_time SECONDS + +/obj/machinery/reagent_refinery/reactor/proc/update_gas_network() + if(!internal_tank) + return + // think of this as we JUST anchored/deanchored + var/obj/machinery/atmospherics/portables_connector/pad = locate() in get_turf(src) + if(pad && !pad.connected_device) + if(anchored) + // Perform the connection, forcibly... we're ignoring adjacency checks with this + internal_tank.connected_port = pad + pad.connected_device = internal_tank + pad.on = 1 //Activate port updates + // Actually enforce the air sharing + var/datum/pipe_network/network = pad.return_network(internal_tank) + if(network && !network.gases.Find(internal_tank.air_contents)) + network.gases += internal_tank.air_contents + network.update = 1 + // Sfx + playsound(src, 'sound/mecha/gasconnected.ogg', 50, 1) + else + internal_tank.disconnect() + playsound(src, 'sound/mecha/gasdisconnected.ogg', 50, 1) + else if(internal_tank.connected_port) + internal_tank.disconnect() // How did we get here? qdelled pad? + playsound(src, 'sound/mecha/gasdisconnected.ogg', 50, 1) + +/obj/machinery/reagent_refinery/reactor/return_air() + if(internal_tank) + return internal_tank.return_air() + . = ..() + +#undef REACTOR_MODE_INTAKE +#undef REACTOR_MODE_OUTPUT diff --git a/code/modules/refinery/core/industrial_reagent_vat.dm b/code/modules/refinery/core/industrial_reagent_vat.dm new file mode 100644 index 0000000000..814571f0b1 --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_vat.dm @@ -0,0 +1,109 @@ +/obj/machinery/reagent_refinery/vat + name = "Industrial Chemical Vat" + desc = "A large mixing vat for huge quantities of chemicals. Don't fall in!" + icon_state = "vat" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 0 + active_power_usage = 50 + circuit = /obj/item/circuitboard/industrial_reagent_vat + // Chemical bath funtimes! + can_buckle = TRUE + buckle_lying = TRUE + default_max_vol = REAGENT_VAT_VOLUME + +/obj/machinery/reagent_refinery/vat/Initialize(mapload) + . = ..() + default_apply_parts() + // Can't be set on these + src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT + +/obj/machinery/reagent_refinery/vat/process() + if(buckled_mobs && buckled_mobs.len && reagents.total_volume > 0) + for(var/mob/living/L in buckled_mobs) + reagents.trans_to(L, 1) // Soak in the juices + + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + refinery_transfer() + +/obj/machinery/reagent_refinery/vat/update_icon() + cut_overlays() + // GOOBY! + if(reagents && reagents.total_volume >= 5) + var/percent = (reagents.total_volume / reagents.maximum_volume) * 100 + switch(percent) + if(5 to 20) percent = 2 + if(20 to 40) percent = 4 + if(40 to 60) percent = 6 + if(60 to 80) percent = 8 + if(80 to INFINITY) percent = 10 + var/image/filling = image(icon, loc, "vat_r_[percent]",dir = dir) + filling.color = reagents.get_color() + add_overlay(filling) + // Get main dir pipe + var/image/pipe = image(icon, icon_state = "vat_cons", dir = dir) + add_overlay(pipe) + if(anchored) + if(!(stat & (NOPOWER|BROKEN))) + var/image/dot = image(icon, icon_state = "vat_dot_[ amount_per_transfer_from_this > 0 ? "on" : "off" ]") + add_overlay(dot) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(get_turf(src),direction) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + if(other && other.anchored) + // Waste processors do not connect to anything as outgoing + if(istype(other,/obj/machinery/reagent_refinery/waste_processor)) + continue + // weird handling for side connections... Otherwise, anything pointing into use gets connected back! + if(istype(other,/obj/machinery/reagent_refinery/filter)) + var/obj/machinery/reagent_refinery/filter/filt = other + var/check_dir = 0 + if(filt.get_filter_side() == 1) + check_dir = turn(filt.dir, 270) + else + check_dir = turn(filt.dir, 90) + if(check_dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "vat_intakes", dir = direction) + add_overlay(intake) + continue + if(other.dir == GLOB.reverse_dir[direction] && dir != direction) + var/image/intake = image(icon, icon_state = "vat_intakes", dir = direction) + add_overlay(intake) + +/obj/machinery/reagent_refinery/vat/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_SINGLEOUTPUT, .) + +/obj/machinery/reagent_refinery/vat/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // no back/forth, filters don't use just their forward, they send the side too! + if(dir == GLOB.reverse_dir[source_forward_dir]) + return 0 + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/vat/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove)) + return + if(istype(C,/obj/vehicle/train/trolley_tank)) + // Drain it! + C.reagents.trans_to_holder( src.reagents, src.reagents.maximum_volume) + visible_message("\The [user] drains \the [C] into \the [src].") + update_icon() + return + if(istype(C,/obj/item/reagent_containers/glass) || \ + istype(C,/obj/item/reagent_containers/food/drinks/glass2) || \ + istype(C,/obj/item/reagent_containers/food/drinks/shaker) || \ + istype(C,/obj/item/reagent_containers/chem_canister)) + // Drain it! + C.reagents.trans_to_holder( src.reagents, src.reagents.maximum_volume) + visible_message("\The [user] dumps \the [C] into \the [src].") + update_icon() + return + . = ..() diff --git a/code/modules/refinery/core/industrial_reagent_waste.dm b/code/modules/refinery/core/industrial_reagent_waste.dm new file mode 100644 index 0000000000..ed67d58afa --- /dev/null +++ b/code/modules/refinery/core/industrial_reagent_waste.dm @@ -0,0 +1,88 @@ +/obj/machinery/reagent_refinery/waste_processor + name = "Industrial Chemical Waste Processor" + desc = "A large chemical processing chamber. Chemicals inside are energized into plasma and collected as raw energy! Unfortunately the process is only 17% efficient, a net loss of power." + icon_state = "waste" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 0 + active_power_usage = 200 + circuit = /obj/item/circuitboard/industrial_reagent_waste_processor + default_max_vol = CARGOTANKER_VOLUME + +/obj/machinery/reagent_refinery/waste_processor/Initialize(mapload) + . = ..() + default_apply_parts() + // Can't be set on these + src.verbs -= /obj/machinery/reagent_refinery/verb/set_APTFT + AddElement(/datum/element/climbable) + +/obj/machinery/reagent_refinery/waste_processor/process() + if(!anchored) + return + + power_change() + if(stat & (NOPOWER|BROKEN)) + return + + if (reagents.total_volume <= 0) + return + + if (prob((reagents.total_volume / reagents.maximum_volume) * 100)) + flick("waste_burn",src) + use_power_oneoff(active_power_usage) + reagents.clear_reagents() + +/obj/machinery/reagent_refinery/waste_processor/update_icon() + cut_overlays() + if(anchored) + for(var/direction in GLOB.cardinal) + var/turf/T = get_step(get_turf(src),direction) + var/obj/machinery/other = locate(/obj/machinery/reagent_refinery) in T + if(other && other.anchored) + // Waste processors do not connect to anything as outgoing + if(istype(other,/obj/machinery/reagent_refinery/waste_processor)) + continue + // weird handling for side connections... Otherwise, anything pointing into use gets connected back! + if(istype(other,/obj/machinery/reagent_refinery/filter)) + var/obj/machinery/reagent_refinery/filter/filt = other + var/check_dir = 0 + if(filt.get_filter_side() == 1) + check_dir = turn(filt.dir, 270) + else + check_dir = turn(filt.dir, 90) + if(check_dir == GLOB.reverse_dir[direction]) + var/image/intake = image(icon, icon_state = "waste_intakes", dir = direction) + add_overlay(intake) + continue + if(other.dir == GLOB.reverse_dir[direction]) + var/image/intake = image(icon, icon_state = "waste_intakes", dir = direction) + add_overlay(intake) + +/obj/machinery/reagent_refinery/waste_processor/handle_transfer(var/atom/origin_machine, var/datum/reagents/RT, var/source_forward_dir, var/filter_id = "") + // Waste tanks accept from all sides + . = ..(origin_machine, RT, source_forward_dir, filter_id) + +/obj/machinery/reagent_refinery/waste_processor/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u. It is pumping chemicals at a rate of [amount_per_transfer_from_this]u." + tutorial(REFINERY_TUTORIAL_ALLIN, .) + +/obj/machinery/reagent_refinery/waste_processor/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove)) + return + if(istype(C,/obj/vehicle/train/trolley_tank)) + // Drain it! + C.reagents.trans_to_holder( src.reagents, src.reagents.maximum_volume) + visible_message("\The [user] drains \the [C] into \the [src].") + update_icon() + return + if(istype(C,/obj/item/reagent_containers/glass) || \ + istype(C,/obj/item/reagent_containers/food/drinks/glass2) || \ + istype(C,/obj/item/reagent_containers/food/drinks/shaker)) + // Drain it! + C.reagents.trans_to_holder( src.reagents, src.reagents.maximum_volume) + visible_message("\The [user] dumps \the [C] into \the [src].") + update_icon() + return + . = ..() diff --git a/code/modules/refinery/equipment/chemcontainer.dm b/code/modules/refinery/equipment/chemcontainer.dm new file mode 100644 index 0000000000..04ed0d3d54 --- /dev/null +++ b/code/modules/refinery/equipment/chemcontainer.dm @@ -0,0 +1,165 @@ +/obj/item/reagent_containers/chem_canister + name = "chemical canister" + desc = "Used to refill chemical dispensers. Uses special chemical safety technology to prevent tampering. It will attempt to fully dispense its contents into any container it is connected to." + + icon = 'icons/obj/chemical.dmi' + icon_state = "container" + + drop_sound = 'sound/items/drop/gascan.ogg' + pickup_sound = 'sound/items/pickup/gascan.ogg' + + w_class = ITEMSIZE_COST_LARGE + + flags = NOREACT + + volume = CARTRIDGE_VOLUME_LARGE + amount_per_transfer_from_this = CARTRIDGE_VOLUME_LARGE + possible_transfer_amounts = list(CARTRIDGE_VOLUME_LARGE) + unacidable = TRUE + + VAR_PROTECTED/loaded_reagent = null + VAR_PRIVATE/label = "" + +/obj/item/reagent_containers/chem_canister/Initialize(mapload) + . = ..() + if(loaded_reagent) + var/datum/reagent/R = SSchemistry.chemical_reagents[loaded_reagent] + if(R) // Sanity check the reagent + set_canister(R.name,R.id) + reagents.add_reagent(R.id, volume) + // Can't be set on these + src.verbs -= /obj/item/reagent_containers/verb/set_APTFT + update_icon() + +/obj/item/reagent_containers/chem_canister/examine(mob/user) + . = ..() + if(reagents.total_volume <= 0) + . += "It is empty." + else + . += "It contains [reagents.total_volume] units of liquid." + +/obj/item/reagent_containers/chem_canister/proc/set_canister(var/labl,var/reagent_id) + setLabel(labl) + loaded_reagent = reagent_id + +/obj/item/reagent_containers/chem_canister/proc/setLabel(L) + PRIVATE_PROC(TRUE) + if(L) + label = L + name = "[initial(name)] - '[L]'" + else + label = "" + name = initial(name) + +/obj/item/reagent_containers/chem_canister/afterattack(obj/target, mob/user , flag) + if (!flag) + return + + else if(istype(target, /obj/machinery/chemical_dispenser)) //A dispenser. Refill a matching reagent container in it! + target.add_fingerprint(user) + + if(!reagents.total_volume) + to_chat(user, span_warning("\The [src] is empty.")) + return + + var/found_any = FALSE + var/obj/machinery/chemical_dispenser/DISP = target + for(var/key in DISP.cartridges) + var/obj/item/reagent_containers/chem_disp_cartridge/C = DISP.cartridges[key] + if(C && C.label == label) // This allows it to be player configured + found_any = TRUE + if(C.reagents.total_volume >= C.reagents.maximum_volume) + continue + reagents.trans_to_obj(C, amount_per_transfer_from_this) + update_icon() + SStgui.update_uis(DISP) + to_chat(user, span_notice("You fill \the [target] with '\the [src].")) + return + + if(found_any) + to_chat(user, span_notice("The [label] is already full.")) + else + to_chat(user, span_notice("\The [target] has no [label] cartridges to fill.")) + + if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it. + + if(!reagents.total_volume) + to_chat(user, span_warning("\The [src] is empty.")) + return + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, span_warning("\The [target] is full.")) + return + + var/trans = src.reagents.trans_to_obj(target, amount_per_transfer_from_this) + to_chat(user, span_notice("You transfer [trans] units of the solution to \the [target].")) + update_icon() + + else + return ..() + +/obj/item/reagent_containers/chem_canister/on_reagent_change(changetype) + update_icon() + +/obj/item/reagent_containers/chem_canister/update_icon() + . = ..() + cut_overlays() + if(reagents && reagents.total_volume > 0) + var/percent = (reagents.total_volume / reagents.maximum_volume) * 100 + switch(percent) + if(0 to 25) percent = 25 + if(25 to 50) percent = 50 + if(50 to 75) percent = 75 + if(75 to INFINITY) percent = 100 + var/image/chems = image(icon, icon_state = "[icon_state]_c[percent]", dir = NORTH) + chems.color = reagents.get_color() + add_overlay(chems) + + +// Preloads +/obj/item/reagent_containers/chem_canister/water + loaded_reagent = REAGENT_ID_WATER +/obj/item/reagent_containers/chem_canister/sugar + loaded_reagent = REAGENT_ID_SUGAR +/obj/item/reagent_containers/chem_canister/hydrogen + loaded_reagent = REAGENT_ID_HYDROGEN +/obj/item/reagent_containers/chem_canister/lithium + loaded_reagent = REAGENT_ID_LITHIUM +/obj/item/reagent_containers/chem_canister/carbon + loaded_reagent = REAGENT_ID_CARBON +/obj/item/reagent_containers/chem_canister/nitrogen + loaded_reagent = REAGENT_ID_NITROGEN +/obj/item/reagent_containers/chem_canister/oxygen + loaded_reagent = REAGENT_ID_OXYGEN +/obj/item/reagent_containers/chem_canister/fluorine + loaded_reagent = REAGENT_ID_FLUORINE +/obj/item/reagent_containers/chem_canister/sodium + loaded_reagent = REAGENT_ID_SODIUM +/obj/item/reagent_containers/chem_canister/aluminum + loaded_reagent = REAGENT_ID_ALUMINIUM +/obj/item/reagent_containers/chem_canister/silicon + loaded_reagent = REAGENT_ID_SILICON +/obj/item/reagent_containers/chem_canister/phosphorus + loaded_reagent = REAGENT_ID_PHOSPHORUS +/obj/item/reagent_containers/chem_canister/sulfur + loaded_reagent = REAGENT_ID_SULFUR +/obj/item/reagent_containers/chem_canister/chlorine + loaded_reagent = REAGENT_ID_CHLORINE +/obj/item/reagent_containers/chem_canister/potassium + loaded_reagent = REAGENT_ID_POTASSIUM +/obj/item/reagent_containers/chem_canister/iron + loaded_reagent = REAGENT_ID_IRON +/obj/item/reagent_containers/chem_canister/copper + loaded_reagent = REAGENT_ID_COPPER +/obj/item/reagent_containers/chem_canister/mercury + loaded_reagent = REAGENT_ID_MERCURY +/obj/item/reagent_containers/chem_canister/radium + loaded_reagent = REAGENT_ID_RADIUM +/obj/item/reagent_containers/chem_canister/ethanol + loaded_reagent = REAGENT_ID_ETHANOL +/obj/item/reagent_containers/chem_canister/sacid + loaded_reagent = REAGENT_ID_SACID +/obj/item/reagent_containers/chem_canister/tungsten + loaded_reagent = REAGENT_ID_TUNGSTEN +/obj/item/reagent_containers/chem_canister/calcium + loaded_reagent = REAGENT_ID_CALCIUM diff --git a/code/modules/refinery/equipment/pumprelay.dm b/code/modules/refinery/equipment/pumprelay.dm new file mode 100644 index 0000000000..ed42ad84fb --- /dev/null +++ b/code/modules/refinery/equipment/pumprelay.dm @@ -0,0 +1,62 @@ +/obj/machinery/pump_relay + name = "Pump Relay" + desc = "Pumps chemicals long distances using plastic hoses. It has multiple inputs to allow the creation of complex pump networks. Does not require power." + icon = 'icons/obj/machines/refinery_machines.dmi' + icon_state = "pumprelay" + density = TRUE + anchored = TRUE + circuit = /obj/item/circuitboard/industrial_reagent_pump + +/obj/machinery/pump_relay/Initialize(mapload) + . = ..() + create_reagents(200) + default_apply_parts() + + AddComponent(/datum/component/hose_connector/input) + AddComponent(/datum/component/hose_connector/input) + AddComponent(/datum/component/hose_connector/output) + +/obj/machinery/pump_relay/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(default_deconstruction_screwdriver(user, O)) + return + if(default_deconstruction_crowbar(user, O)) + return + if(default_part_replacement(user, O)) + return + if(default_unfasten_wrench(user, O, 20)) + return + + ..() + +/obj/machinery/pump_relay/on_reagent_change(changetype) + . = ..() + if(prob(2)) + visible_message(span_infoplain("\The [src] gurgles as it pumps fluid.")) + +/obj/machinery/pump_relay/on_reagent_change(changetype) + update_icon() + +/obj/machinery/pump_relay/update_icon() + . = ..() + cut_overlays() + // GOOBY! + if(reagents && reagents.total_volume >= 5) + var/percent = (reagents.total_volume / reagents.maximum_volume) * 100 + switch(percent) + if(5 to 10) percent = 1 + if(10 to 20) percent = 2 + if(20 to 30) percent = 3 + if(30 to 40) percent = 4 + if(40 to 50) percent = 5 + if(50 to 60) percent = 6 + if(60 to 70) percent = 7 + if(70 to 80) percent = 8 + if(80 to 90) percent = 9 + if(90 to INFINITY) percent = 10 + var/image/filling = image(icon, loc, "pumprelay_r_[percent]",dir = dir) + filling.color = reagents.get_color() + add_overlay(filling) + +/obj/machinery/pump_relay/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u." diff --git a/code/modules/refinery/equipment/smart_centrifuge.dm b/code/modules/refinery/equipment/smart_centrifuge.dm new file mode 100644 index 0000000000..7383e258e7 --- /dev/null +++ b/code/modules/refinery/equipment/smart_centrifuge.dm @@ -0,0 +1,117 @@ +/obj/machinery/smart_centrifuge + name = "smart centrifuge" + desc = "Isolates various compounds and stores them in chemical cartridges." + icon = 'icons/obj/hydroponics_machines_vr.dmi' + icon_state = "sextractor" + density = TRUE + anchored = TRUE + circuit = /obj/item/circuitboard/smart_centrifuge + + var/working = FALSE + +/obj/machinery/smart_centrifuge/Initialize(mapload) + . = ..() + create_reagents(CARGOTANKER_VOLUME) + flags |= OPENCONTAINER + default_apply_parts() + +/obj/machinery/smart_centrifuge/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(in_use) + to_chat(user, "\The [src] is still spinning.") + return + if(default_deconstruction_screwdriver(user, O)) + update_icon() + return + + if(default_deconstruction_crowbar(user, O)) + return + + if(default_unfasten_wrench(user, O, 20)) + return + + return ..() + +/obj/machinery/smart_centrifuge/attack_hand(mob/user) + spin_reagents(user,FALSE) + +/obj/machinery/smart_centrifuge/verb/isolate_reagents() + set name = "Isolate Reagents Automatically" + set category = "Object" + set src in view(1) + spin_reagents(usr,FALSE,FALSE) + +/obj/machinery/smart_centrifuge/verb/isolate_reagents_bottle() + set name = "Isolate Reagents To Bottles" + set category = "Object" + set src in view(1) + spin_reagents(usr,TRUE,FALSE) + +/obj/machinery/smart_centrifuge/verb/isolate_reagents_canisters() + set name = "Isolate Reagents To Canisters" + set category = "Object" + set src in view(1) + spin_reagents(usr,FALSE,TRUE) + +/obj/machinery/smart_centrifuge/proc/spin_reagents(mob/user, var/force_bottle, var/force_canister) + if(working) + to_chat(user, "\The [src] is still spinning.") + return + else if(reagents.reagent_list.len == 0) + to_chat(user, "\The [src] is empty.") + return + else + playsound(src, 'sound/machines/buttonbeep.ogg', 50, 1) + playsound(src, 'sound/machines/airpumpidle.ogg', 100, 1) + to_chat(user, "You activate \the [src].") + working = TRUE + flags ^= OPENCONTAINER + addtimer(CALLBACK(src, PROC_REF(internal_reagent_seperate),force_canister,force_bottle), 10 SECONDS, TIMER_DELETE_ME) + +/obj/machinery/smart_centrifuge/proc/internal_reagent_seperate(var/force_canister,var/force_bottle) + if(reagents.reagent_list.len <= 0) + visible_message("\The [src] finishes processing.") + playsound(src, 'sound/machines/biogenerator_end.ogg', 50, 1) + playsound(src, 'sound/machines/buttonbeep.ogg', 50, 1) + working = FALSE + flags |= OPENCONTAINER + return + + // Seperate out reagents + for(var/datum/reagent/RL in reagents.reagent_list) + // Handle special bottle types + if(!RL.volume) + continue + var/obj/item/reagent_containers/CD + if(force_canister || (RL.volume >= 500 && !force_bottle)) + CD = new /obj/item/reagent_containers/chem_canister(src) + var/obj/item/reagent_containers/chem_canister/CHEM = CD + CHEM.set_canister(RL.name,RL.id) + else + CD = new /obj/item/reagent_containers/glass/bottle(src) + CD.name = "[RL.name] bottle" + CD.icon_state = "bottle-1" + // Transfer if possible + playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1) + reagents.trans_id_to( CD, RL.id, min(RL.volume,CD.reagents.maximum_volume), TRUE) + CD.update_icon() + CD.forceMove(loc) // Drop it outside + CD.pixel_x = rand(-7, 7) // random position + CD.pixel_y = rand(-7, 7) + break + addtimer(CALLBACK(src, PROC_REF(internal_reagent_seperate),force_canister,force_bottle), 1 SECOND, TIMER_DELETE_ME) + +/obj/machinery/smart_centrifuge/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(user.buckled || user.stat || user.restrained() || !Adjacent(user) || !user.Adjacent(C) || !istype(C) || (user == C && !user.canmove)) + return + if(istype(C,/obj/vehicle/train/trolley_tank)) + // Drain it! + C.reagents.trans_to_holder( src.reagents, src.reagents.maximum_volume) + visible_message("\The [user] drains \the [C] into \the [src].") + return + . = ..() + +/obj/machinery/smart_centrifuge/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u." + for(var/datum/reagent/RL in reagents.reagent_list) + . += "[RL.name]: [RL.volume]u." diff --git a/code/modules/research/tg/designs/boards/refinery.dm b/code/modules/research/tg/designs/boards/refinery.dm new file mode 100644 index 0000000000..3655598dc4 --- /dev/null +++ b/code/modules/research/tg/designs/boards/refinery.dm @@ -0,0 +1,119 @@ +/datum/design_techweb/board/industrial_reagent_filter + name = "Industrial Reagent Filter" + id = "industrial_reagent_filter" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_filter + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_furnace + name = "Industrial Reagent Furnace" + id = "industrial_reagent_furnace" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_furnace + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_grinder + name = "Industrial Reagent Grinder" + id = "industrial_reagent_grinder" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_grinder + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_hub + name = "Industrial Reagent Hub" + id = "industrial_reagent_hub" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_hub + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_pipe + name = "Industrial Reagent Pipe" + id = "industrial_reagent_pipe" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_pipe + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_pump + name = "Industrial Reagent Pump" + id = "industrial_reagent_pump" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_pump + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_reactor + name = "Industrial Reagent Reactor" + id = "industrial_reagent_reactor" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_reactor + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_vat + name = "Industrial Reagent Vat" + id = "industrial_reagent_vat" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_vat + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/industrial_reagent_waste_processor + name = "Industrial Reagent Waste Processor" + id = "industrial_reagent_waste_processor" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/industrial_reagent_waste_processor + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/smart_centrifuge + name = "Smart Centrifuge" + id = "smart_centrifuge" + // req_tech = list(TECH_MAGNET = 2, TECH_DATA = 1, TECH_MATERIAL = 2) + build_path = /obj/item/circuitboard/smart_centrifuge + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/pump_relay + name = "Pump Relay" + id = "pump_relay" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/pump_relay + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design_techweb/board/fluid_pump + name = "Fluid Pump" + id = "fluid_pump" + // req_tech = list(TECH_DATA = 1) + build_path = /obj/item/circuitboard/fluidpump + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/tg/techwebs/nodes/engi_nodes.dm b/code/modules/research/tg/techwebs/nodes/engi_nodes.dm index 39f256bf4c..c49d92a018 100644 --- a/code/modules/research/tg/techwebs/nodes/engi_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/engi_nodes.dm @@ -313,6 +313,28 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) announce_channels = list(CHANNEL_ENGINEERING, CHANNEL_SECURITY, CHANNEL_SCIENCE, CHANNEL_MEDICAL) +/datum/techweb_node/chemical_refinery + id = TECHWEB_NODE_CHEM_REFINERY + display_name = "Chemical Refining" + description = "Reacting and distilling reagents into more complex and useful forms." + prereq_ids = list(TECHWEB_NODE_CHEM_SYNTHESIS) + design_ids = list( + "industrial_reagent_filter", + "industrial_reagent_furnace", + "industrial_reagent_grinder", + "industrial_reagent_hub", + "industrial_reagent_pipe", + "industrial_reagent_pump", + "industrial_reagent_reactor", + "industrial_reagent_vat", + "industrial_reagent_waste_processor", + "smart_centrifuge", + "pump_relay", + "fluid_pump" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + announce_channels = list(CHANNEL_ENGINEERING,CHANNEL_MEDICAL) + /datum/techweb_node/cells_empproof //CHOMPEdit Start - EMP proof cells and Recharging Cells and teleporter id = TECHWEB_NODE_PARTS_EMP_PROOF display_name = "EMP-Proof Parts" diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index e88f6c1c07..0288a373db 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -357,7 +357,7 @@ //if we are attaching a trolley to an engine we don't care what direction // it is in and it should probably be attached with the engine in the lead - if(istype(T, /obj/vehicle/train/trolley)) + if(istype(T, /obj/vehicle/train/trolley) || istype(T, /obj/vehicle/train/trolley_tank)) T.attach_to(src, user) else var/T_dir = get_dir(src, T) //figure out where T is wrt src @@ -413,3 +413,130 @@ ..() update_icon() // VOREStation Edit End - Overlay stuff for the chair-like effect + +//------------------------------------------------------- +// Cargo tugs for reagent transport from chemical refinery +//------------------------------------------------------- +/obj/vehicle/train/trolley_tank + name = "cargo train tanker" + desc = "A large, tank made for transporting liquids." + icon = 'icons/obj/vehicles_vr.dmi' + icon_state = "cargo_tank" + anchored = FALSE + flags = OPENCONTAINER + paint_color = "#efdd16" + +/obj/vehicle/train/trolley_tank/Initialize(mapload) + . = ..() + create_reagents(CARGOTANKER_VOLUME) + update_icon() + AddComponent(/datum/component/hose_connector/input) + AddComponent(/datum/component/hose_connector/output) + AddElement(/datum/element/climbable) + AddElement(/datum/element/sellable/trolley_tank) + +/obj/vehicle/train/trolley_tank/insert_cell(var/obj/item/cell/C, var/mob/living/carbon/human/H) + return + +/obj/vehicle/train/trolley_tank/Bump(atom/Obstacle) + if(!lead) + return //so people can't knock others over by pushing a trolley around + ..() + +/obj/vehicle/train/trolley_tank/MouseDrop_T(var/atom/movable/C, mob/user as mob) + if(C == user) + SEND_SIGNAL(src, COMSIG_CLIMBABLE_START_CLIMB, user) + return + + if(istype(C,/obj/item/reagent_containers/glass)) + var/obj/item/reagent_containers/glass/G = C + G.reagents.trans_to(src,G.reagents.total_volume) + to_chat(usr,"You empty \the [G] into the \the [src].") + return + + if(istype(C,/obj/vehicle/train)) // Only allow latching + . = ..() + +/obj/vehicle/train/trolley_tank/load(var/atom/movable/C, var/mob/living/user) + return FALSE // Cannot load anything onto this + +/obj/vehicle/train/trolley_tank/RunOver(var/mob/living/M) + ..() + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") + +/obj/vehicle/train/trolley_tank/attackby(obj/item/W, mob/user) + + if(istype(W,/obj/item/reagent_containers/glass)) + var/obj/item/reagent_containers/glass/G = W + if(reagents.total_volume <= 0) + to_chat(usr,"\The [src] is empty.") + return + if(G.reagents.total_volume >= G.reagents.maximum_volume) + to_chat(usr,"\The [G] is full.") + return + playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1) + to_chat(usr,"You drain \the [src] into the \the [G].") + reagents.trans_to_holder( G.reagents, G.reagents.maximum_volume) + update_icon() + return + + if(istype(W, /obj/item/multitool)) + var/new_paint = input(usr, "Please select paint color.", "Paint Color", paint_color) as color|null + if(new_paint) + paint_color = new_paint + update_icon() + return + + if(istype(W, /obj/item/pen)) + var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", src.name), null, MAX_NAME_LEN) + if (user.get_active_hand() != W) + return + if((!in_range(src, user) && src.loc != user)) + return + t = sanitizeSafe(t, MAX_NAME_LEN) + if(t) + src.name = "[initial(name)] - '[t]'" + else + src.name = initial(name) + return + + . = ..() + +/obj/vehicle/train/trolley_tank/update_car(var/train_length, var/active_engines) + src.train_length = train_length + src.active_engines = active_engines + + if(!lead && !tow) + anchored = FALSE + else + anchored = TRUE + +/obj/vehicle/train/trolley_tank/examine(mob/user, infix, suffix) + . = ..() + . += "The meter shows [reagents.total_volume]u / [reagents.maximum_volume]u." + +/obj/vehicle/train/trolley_tank/update_icon() + . = ..() + cut_overlays() + if(reagents && reagents.total_volume > 0) + var/percent = (reagents.total_volume / reagents.maximum_volume) * 100 + switch(percent) + if(5 to 10) percent = 10 + if(10 to 20) percent = 20 + if(20 to 30) percent = 30 + if(30 to 40) percent = 40 + if(40 to 50) percent = 50 + if(50 to 60) percent = 60 + if(60 to 70) percent = 70 + if(70 to 80) percent = 80 + if(80 to 90) percent = 90 + if(90 to INFINITY) percent = 100 + var/image/chems = image(icon, icon_state = "[icon_state]_r_[percent]", dir = NORTH) + chems.color = reagents.get_color() + add_overlay(chems) + var/image/Bodypaint = image(icon, icon_state = "[icon_state]_c", dir = NORTH) + Bodypaint.color = paint_color + add_overlay(Bodypaint) + +/obj/vehicle/train/trolley_tank/on_reagent_change(changetype) + update_icon() diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index ac33902dd7..d7386d5bed 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -110,9 +110,8 @@ return if(istype(C,/obj/vehicle/train)) latch(C, user) - else - if(!load(C, user)) - to_chat(user, span_red("You were unable to load [C] on [src].")) + else if(!load(C, user)) + to_chat(user, span_red("You were unable to load [C] on [src].")) /obj/vehicle/train/attack_hand(mob/user as mob) if(user.stat || user.restrained() || !Adjacent(user)) diff --git a/code/unit_tests/reagent_tests.dm b/code/unit_tests/reagent_tests.dm index dd0f72789f..b7552c6a61 100644 --- a/code/unit_tests/reagent_tests.dm +++ b/code/unit_tests/reagent_tests.dm @@ -39,6 +39,14 @@ failed = TRUE collection_id[R.id] = R.type + if(!R.supply_conversion_value) + log_unit_test("[Rpath]: Reagents - reagent ID \"[R.id]\" does not have supply_conversion_value set.") + failed = TRUE + + if(!R.industrial_use || !R.industrial_use == "") + log_unit_test("[Rpath]: Reagents - reagent ID \"[R.id]\" does not have industrial_use set.") + failed = TRUE + if(R.description == REAGENT_DESC_DEVELOPER_WARNING) log_unit_test("[Rpath]: Reagents - reagent description unset.") failed = TRUE @@ -202,9 +210,7 @@ fake_beaker.reagents.maximum_volume = 5000 else if(istype(CR, /decl/chemical_reaction/distilling)) // distilling - var/decl/chemical_reaction/distilling/DR = CR - var/obj/machinery/portable_atmospherics/powered/reagent_distillery/D = new() - D.current_temp = DR.temp_range[1] + var/obj/distilling_tester/D = new() qdel_swap(fake_beaker, D) fake_beaker.reagents.maximum_volume = 5000 else @@ -230,24 +236,44 @@ return TRUE /datum/unit_test/chemical_reactions_shall_not_conflict/proc/perform_reaction(var/decl/chemical_reaction/CR, var/list/inhib = list()) - // clear for inhibitor searches - fake_beaker.reagents.clear_reagents() - result_reactions.Cut() - var/scale = 1 if(CR.result_amount < 1) scale = 1 / CR.result_amount // Create at least 1 unit - if(inhib.len) // taken from argument and not reaction! Put in FIRST! - for(var/RR in inhib) - fake_beaker.reagents.add_reagent(RR, inhib[RR] * scale) - if(CR.catalysts) // Required for reaction - for(var/RR in CR.catalysts) - fake_beaker.reagents.add_reagent(RR, CR.catalysts[RR] * scale) - if(CR.required_reagents) - for(var/RR in CR.required_reagents) - fake_beaker.reagents.add_reagent(RR, CR.required_reagents[RR] * scale) + // Weird loop here, but this is used to test both instant and distilling reactions + // Instants will meet the while() condition on the first loop and go to the next stuff + // but distilling will repeat over and over until the temperature test is finished! + var/temp_test = 0 + do + // clear for inhibitor searches + fake_beaker.reagents.clear_reagents() + result_reactions.Cut() + if(inhib.len) // taken from argument and not reaction! Put in FIRST! + for(var/RR in inhib) + fake_beaker.reagents.add_reagent(RR, inhib[RR] * scale) + if(CR.catalysts) // Required for reaction + for(var/RR in CR.catalysts) + fake_beaker.reagents.add_reagent(RR, CR.catalysts[RR] * scale) + if(CR.required_reagents) + for(var/RR in CR.required_reagents) + fake_beaker.reagents.add_reagent(RR, CR.required_reagents[RR] * scale) + + if(!istype(CR, /decl/chemical_reaction/distilling)) + break // Skip the next section if we're not distilling + + // Check distillation at 10 points along its temperature range! + // This is so multiple reactions with the same requirements, but different temps, can be tested. + temp_test += 0.1 + var/obj/distilling_tester/DD = fake_beaker + DD.test_distilling(CR,temp_test) + + if(fake_beaker.reagents.has_reagent(CR.result)) + return FALSE // Distilling success + + while(temp_test > 1) + + // Check beaker to see if we reached our goal! if(fake_beaker.reagents.has_reagent(CR.result)) return FALSE // INSTANT SUCCESS! @@ -313,3 +339,40 @@ else pass("All grindable sheet or ore entries had valid lists and reagents.") return TRUE + + + +// Used to test distillations without hacking the other machinery's code up +/obj/distilling_tester + icon = 'icons/obj/weapons.dmi' + icon_state = "cartridge" + var/datum/gas_mixture/GM = new() + var/current_temp = 0 + +/obj/distilling_tester/Initialize(mapload) + create_reagents(5000,/datum/reagents/distilling) + . = ..() + +/obj/distilling_tester/return_air() + return GM + +/obj/distilling_tester/proc/test_distilling(var/decl/chemical_reaction/distilling/D, var/temp_prog) + qdel_swap(GM,new()) + if(D.require_xgm_gas) + GM.gas[D.require_xgm_gas] = 100 + else + if(D.rejects_xgm_gas == GAS_N2) + GM.gas[GAS_O2] = 100 + else + GM.gas[GAS_N2] = 100 + if(D.minimum_xgm_pressure) + GM.temperature = (D.minimum_xgm_pressure * CELL_VOLUME) / (GM.gas[D.require_xgm_gas] * R_IDEAL_GAS_EQUATION) + + // Try this 10 times, We need to know if something is blocking at multiple temps. + // If it passes unit test, it might still be awful to make though, gotta find the right gas mix! + current_temp = LERP( D.temp_range[1], D.temp_range[2], temp_prog) + reagents.handle_reactions() + +/obj/distilling_tester/Destroy(force, ...) + qdel_null(GM) + . = ..() diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 1ea178555966f82d26abb43679f9a1bbc00f6a09..c6d4673aab22a324c16bc25c2af8ae3bb1211fb3 100644 GIT binary patch literal 59366 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 z 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 z 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 diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 2a6076147aa26f8ee18ac3680310e52cd3d4e930..4a3d33d3d5131a4fd28a904760a8e1514085ae67 100644 GIT binary patch delta 5869 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 byrVLG*6+M{yJyG^pglLQ8|jo>wGaC*a#yI| delta 5598 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

=uU$ClMx4@!b`)gjzL6BS0vOCq`(E_>9_mdSrp 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

qWs#;Wz5WEDEDG&&BoD~ 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 diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm index 1368416f8c..2ffe5882a2 100644 --- a/maps/expedition_vr/aerostat/_aerostat.dm +++ b/maps/expedition_vr/aerostat/_aerostat.dm @@ -64,13 +64,13 @@ T.resources[ORE_MHYDROGEN] = 0 T.resources[ORE_VERDANTIUM] = 0 T.resources[ORE_LEAD] = 0 - //T.resources[ORE_COPPER] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - //T.resources[ORE_TIN] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) - //T.resources[ORE_BAUXITE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources[ORE_COPPER] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources[ORE_TIN] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources[ORE_BAUXITE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources[ORE_RUTILE] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) - //T.resources[ORE_VOPAL] = 0 - //T.resources[ORE_QUARTZ] = 0 - //T.resources[ORE_PAINITE] = 0 + T.resources[ORE_VOPAL] = 0 + T.resources[ORE_QUARTZ] = 0 + T.resources[ORE_PAINITE] = 0 else if(current_cell < deep_val) // Rare metals. T.resources[ORE_GOLD] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources[ORE_SILVER] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) @@ -83,13 +83,13 @@ T.resources[ORE_DIAMOND] = 0 T.resources[ORE_HEMATITE] = 0 T.resources[ORE_MARBLE] = 0 - //T.resources[ORE_COPPER] = 0 - //T.resources[ORE_TIN] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - //T.resources[ORE_BAUXITE] = 0 + T.resources[ORE_COPPER] = 0 + T.resources[ORE_TIN] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + T.resources[ORE_BAUXITE] = 0 T.resources[ORE_RUTILE] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - //T.resources[ORE_VOPAL] = 0 - //T.resources[ORE_QUARTZ] = 0 - //T.resources[ORE_PAINITE] = 0 + T.resources[ORE_VOPAL] = 0 + T.resources[ORE_QUARTZ] = 0 + T.resources[ORE_PAINITE] = 0 else // Deep metals. T.resources[ORE_URANIUM] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources[ORE_DIAMOND] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) @@ -102,13 +102,13 @@ T.resources[ORE_HEMATITE] = 0 T.resources[ORE_GOLD] = 0 T.resources[ORE_SILVER] = 0 - //T.resources[ORE_COPPER] = 0 - //T.resources[ORE_TIN] = 0 - //T.resources[ORE_BAUXITE] = 0 + T.resources[ORE_COPPER] = 0 + T.resources[ORE_TIN] = 0 + T.resources[ORE_BAUXITE] = 0 T.resources[ORE_RUTILE] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) - //T.resources[ORE_VOPAL] = 0 - //T.resources[ORE_QUARTZ] = 0 - //T.resources[ORE_PAINITE] = 0 + T.resources[ORE_VOPAL] = 0 + T.resources[ORE_QUARTZ] = 0 + T.resources[ORE_PAINITE] = 0 return // -- Objs -- // diff --git a/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm b/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm index 7e959a7c13..a5d67b1aa8 100644 --- a/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm +++ b/maps/expedition_vr/aerostat/_aerostat_science_outpost.dm @@ -161,7 +161,12 @@ VIRGO2_TURF_CREATE(/turf/simulated/mineral) ORE_SILVER = 8, ORE_PHORON = 18, ORE_LEAD = 2, - ORE_VERDANTIUM = 1)) + ORE_VERDANTIUM = 1, + ORE_TIN = 3, + ORE_COPPER = 2, + ORE_BAUXITE = 9, + ORE_QUARTZ = 5, + ORE_PAINITE = 1)) else mineral_name = pickweight(list( ORE_MARBLE = 2, @@ -172,7 +177,10 @@ VIRGO2_TURF_CREATE(/turf/simulated/mineral) ORE_GOLD = 3, ORE_SILVER = 3, ORE_PHORON = 25, - ORE_LEAD = 1)) + ORE_LEAD = 1, + ORE_TIN = 12, + ORE_COPPER = 9, + ORE_QUARTZ = 12)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/maps/groundbase/groundbase_mining.dm b/maps/groundbase/groundbase_mining.dm index e396abdd75..71ea8b0bcd 100644 --- a/maps/groundbase/groundbase_mining.dm +++ b/maps/groundbase/groundbase_mining.dm @@ -14,7 +14,12 @@ ORE_SILVER = 8, ORE_PHORON = 18, ORE_LEAD = 2, - ORE_VERDANTIUM = 1)) + ORE_VERDANTIUM = 1, + ORE_TIN = 3, + ORE_COPPER = 2, + ORE_BAUXITE = 9, + ORE_QUARTZ = 5, + ORE_PAINITE = 1)) else mineral_name = pickweight(list( ORE_MARBLE = 2, @@ -25,7 +30,9 @@ ORE_GOLD = 3, ORE_SILVER = 3, ORE_PHORON = 25, - ORE_LEAD = 1)) + ORE_LEAD = 1, + ORE_TIN = 12, + ORE_COPPER = 9)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/maps/om_adventure/grasscave.dm b/maps/om_adventure/grasscave.dm index 43ebe3f49e..841ee01616 100644 --- a/maps/om_adventure/grasscave.dm +++ b/maps/om_adventure/grasscave.dm @@ -74,7 +74,13 @@ ORE_SILVER = 8, ORE_PHORON = 18, ORE_LEAD = 5, - ORE_VERDANTIUM = 5)) + ORE_VERDANTIUM = 5, + ORE_TIN = 3, + ORE_COPPER = 2, + ORE_BAUXITE = 9, + ORE_QUARTZ = 5, + ORE_PAINITE = 1 + )) else mineral_name = pickweight(list( ORE_MARBLE = 2, @@ -85,7 +91,10 @@ ORE_GOLD = 3, ORE_SILVER = 3, ORE_PHORON = 25, - ORE_LEAD = 1)) + ORE_LEAD = 1, + ORE_TIN = 12, + ORE_COPPER = 9, + ORE_QUARTZ = 12)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/maps/stellar_delight/stellar_delight_turfs.dm b/maps/stellar_delight/stellar_delight_turfs.dm index 8a5454d18e..0d30ad1d8d 100644 --- a/maps/stellar_delight/stellar_delight_turfs.dm +++ b/maps/stellar_delight/stellar_delight_turfs.dm @@ -62,7 +62,11 @@ VIRGO3B_TURF_CREATE(/turf/simulated/floor/outdoors/rocks) ORE_SILVER = 15, ORE_LEAD = 5, ORE_VERDANTIUM = 2, - ORE_RUTILE = 10)) + ORE_TIN = 3, + ORE_COPPER = 2, + ORE_BAUXITE = 9, + ORE_QUARTZ = 5, + ORE_PAINITE = 1)) else mineral_name = pickweight(list( ORE_MARBLE = 5, @@ -75,7 +79,11 @@ VIRGO3B_TURF_CREATE(/turf/simulated/floor/outdoors/rocks) ORE_SILVER = 7, ORE_LEAD = 4, ORE_VERDANTIUM = 1, - ORE_RUTILE = 10)) + ORE_RUTILE = 10, + ORE_LEAD = 1, + ORE_TIN = 12, + ORE_COPPER = 9, + ORE_QUARTZ = 12)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] UpdateMineral() diff --git a/maps/submaps/space_rocks/space_rocks.dm b/maps/submaps/space_rocks/space_rocks.dm index e3df6374f3..796f2c9b80 100644 --- a/maps/submaps/space_rocks/space_rocks.dm +++ b/maps/submaps/space_rocks/space_rocks.dm @@ -17,7 +17,12 @@ ORE_SILVER = 8, ORE_PHORON = 18, ORE_LEAD = 2, - ORE_VERDANTIUM = 1)) + ORE_VERDANTIUM = 1, + ORE_TIN = 3, + ORE_COPPER = 2, + ORE_BAUXITE = 9, + ORE_QUARTZ = 5, + ORE_PAINITE = 1)) else mineral_name = pickweight(list( ORE_MARBLE = 2, @@ -28,7 +33,10 @@ ORE_GOLD = 3, ORE_SILVER = 3, ORE_PHORON = 25, - ORE_LEAD = 1)) + ORE_LEAD = 1, + ORE_TIN = 12, + ORE_COPPER = 9, + ORE_QUARTZ = 12)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/maps/tether/submaps/underdark_pois/underdark_things.dm b/maps/tether/submaps/underdark_pois/underdark_things.dm index 012c182762..54c4903b8a 100644 --- a/maps/tether/submaps/underdark_pois/underdark_things.dm +++ b/maps/tether/submaps/underdark_pois/underdark_things.dm @@ -92,6 +92,17 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor/ignore_oregen) VIRGO3B_TURF_CREATE(/turf/simulated/mineral/ignore_cavegen) VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor/ignore_cavegen) +//GasCracks, despite the pathnames these give them atmos that let you place them anywhere on 3B +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/oxygen) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/nitrogen) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/carbon) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/nitro) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/phoron) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/air) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/terrible) +VIRGO3B_TURF_CREATE(/turf/simulated/floor/gas_crack/random) + //Vault2 VIRGO3B_TURF_CREATE(/turf/simulated/floor/tiled/freezer) diff --git a/maps/tether/tether_turfs.dm b/maps/tether/tether_turfs.dm index 8cc53d9be2..5e086bd61d 100644 --- a/maps/tether/tether_turfs.dm +++ b/maps/tether/tether_turfs.dm @@ -77,7 +77,11 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) ORE_SILVER = 8, ORE_PHORON = 18, ORE_LEAD = 2, - ORE_VERDANTIUM = 1)) + ORE_TIN = 3, + ORE_COPPER = 2, + ORE_BAUXITE = 9, + ORE_QUARTZ = 5, + ORE_PAINITE = 1)) else mineral_name = pickweight(list( ORE_MARBLE = 2, @@ -88,7 +92,9 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) ORE_GOLD = 3, ORE_SILVER = 3, ORE_PHORON = 25, - ORE_LEAD = 1)) + ORE_LEAD = 1, + ORE_TIN = 12, + ORE_COPPER = 9)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] UpdateMineral() diff --git a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/xeyakin.dm b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/xeyakin.dm index b718b3eca3..d5d72276fc 100644 --- a/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/xeyakin.dm +++ b/modular_chomp/code/modules/mob/living/simple_mob/subtypes/vore/xeyakin.dm @@ -54,6 +54,8 @@ color = "#FF8000" overdose = REAGENTS_OVERDOSE * 0.25 scannable = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_GODTIER + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/xeyakinblood/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) //should proabaly make something more special but this isn't meant to be a proper chem var/chem_effective = 1 * M.species.chem_strength_heal diff --git a/modular_chomp/code/modules/reagents/reagents/dispenser.dm b/modular_chomp/code/modules/reagents/reagents/dispenser.dm index 0c4b02d16b..abbc40d278 100644 --- a/modular_chomp/code/modules/reagents/reagents/dispenser.dm +++ b/modular_chomp/code/modules/reagents/reagents/dispenser.dm @@ -5,3 +5,5 @@ reagent_state = GAS taste_description = "indescribable" color = "#808000" + supply_conversion_value = REFINERYEXPORT_VALUE_NO + industrial_use = REFINERYEXPORT_REASON_BIOHAZARD diff --git a/modular_chomp/code/modules/reagents/reagents/food_drinks.dm b/modular_chomp/code/modules/reagents/reagents/food_drinks.dm index 6d84aba5e8..0b396ba5c6 100644 --- a/modular_chomp/code/modules/reagents/reagents/food_drinks.dm +++ b/modular_chomp/code/modules/reagents/reagents/food_drinks.dm @@ -83,6 +83,8 @@ glass_name = REAGENT_SLIMEDRINK glass_desc = "Slime thats safe to drink (relatively)" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/drink/soda ingest_met = REM * 5 //Makes it so soda metabolizes faster, since without this increase, the nutrients it currently gives does nothing. Also, metabolises faster then normal nutrients due to being soda. @@ -507,6 +509,8 @@ glass_name = "infused arachnid slammer" glass_desc = "A pint of metabolized Arachnid Slammer. Even if its flat it still somehow foams and sparkles as well as bubbles more actively when spiders are nearby." + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD /datum/reagent/infusedarachnidslammer/enragedarachnidslammer name = REAGENT_ENRAGEDARACHNIDSLAMMER @@ -516,6 +520,8 @@ glass_name = "enraged arachnid slammer" glass_desc = "A pint of Enraged Arachnid Slammer. It bubbles and sparkles fiercly as if it was in a berserking state!" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_DRUG /datum/reagent/infusedarachnidslammer/enragedarachnidslammer/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -693,3 +699,5 @@ description = "A dry mix for making delicious blondies." reagent_state = SOLID color = "#f3b44e" + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_FOOD diff --git a/modular_chomp/code/modules/reagents/reagents/medicine.dm b/modular_chomp/code/modules/reagents/reagents/medicine.dm index 1fd5f8e2d8..0b870fed48 100644 --- a/modular_chomp/code/modules/reagents/reagents/medicine.dm +++ b/modular_chomp/code/modules/reagents/reagents/medicine.dm @@ -8,6 +8,8 @@ taste_description = "this shouldn't be here" //unobtainable ingame color = "#7F0000" var/gender_change = null //set the gender variable here so we can set it to others in varients + supply_conversion_value = REFINERYEXPORT_VALUE_COMMON + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/change_drug/male //inherits base chemical properties listed above name = REAGENT_ANDROROVIR @@ -74,6 +76,8 @@ scannable = 1 overdose = REAGENTS_OVERDOSE overdose_mod = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/cleansingagent/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -94,6 +98,8 @@ scannable = 1 overdose = REAGENTS_OVERDOSE overdose_mod = 0 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/purifyingagent/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -116,6 +122,8 @@ overdose = REAGENTS_OVERDOSE * 0.2 overdose_mod = 1.25 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/burncard/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -151,6 +159,8 @@ overdose = REAGENTS_OVERDOSE * 0.5 scannable = 1 var/repair_strength = 9 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/flamecure/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -182,6 +192,8 @@ color = "#FF6600" overdose = REAGENTS_OVERDOSE * 0.2 scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/neotane/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -201,6 +213,8 @@ color = "#00BFFF" overdose = REAGENTS_OVERDOSE scannable = 1 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/bloodsealer/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) @@ -217,6 +231,8 @@ color = "#8040FF" scannable = 1 overdose = REAGENTS_OVERDOSE * 3 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/livingagent/overdose(var/mob/living/carbon/M, var/alien) ..() @@ -243,6 +259,8 @@ color = "#006666" scannable = 1 overdose = REAGENTS_OVERDOSE * 0.5 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/performancepeaker/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.add_chemical_effect(CE_SPEEDBOOST, 0.5) @@ -266,6 +284,8 @@ affects_dead = TRUE mrate_static = TRUE metabolism = 0.5 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/souldew/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -283,6 +303,8 @@ color = "#FF3399" scannable = 1 overdose = REAGENTS_OVERDOSE * 2 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/quadcord/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) var/chem_effective = 1 * M.species.chem_strength_heal @@ -305,6 +327,8 @@ color = "#660066" scannable = 1 overdose = REAGENTS_OVERDOSE * 0.5 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/curea/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.remove_a_modifier_of_type(/datum/modifier/poisoned) @@ -333,6 +357,8 @@ overdose = REAGENTS_OVERDOSE * 0.5 modifier_to_add = /datum/modifier/liquidhealer modifier_duration = 3 SECONDS + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/modifier/liquidhealer name = REAGENT_ID_LIQUIDHEALER @@ -373,6 +399,8 @@ affects_dead = TRUE mrate_static = TRUE metabolism = 0.5 + supply_conversion_value = REFINERYEXPORT_VALUE_HIGHREFINED + industrial_use = REFINERYEXPORT_REASON_MEDSCI /datum/reagent/phoenixbreath/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal @@ -394,6 +422,8 @@ color = "#A70FFF" scannable = 1 overdose = REAGENTS_OVERDOSE + supply_conversion_value = REFINERYEXPORT_VALUE_PROCESSED + industrial_use = REFINERYEXPORT_REASON_INDUSTRY /datum/reagent/dryagent/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal diff --git a/vorestation.dme b/vorestation.dme index 34183a69c6..0977d49e72 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -143,6 +143,7 @@ #include "code\__defines\qdel.dm" #include "code\__defines\radio.dm" #include "code\__defines\recipe.dm" +#include "code\__defines\refinery.dm" #include "code\__defines\request_console.dm" #include "code\__defines\research.dm" #include "code\__defines\robot.dm" @@ -270,6 +271,7 @@ #include "code\_helpers\nameof.dm" #include "code\_helpers\names.dm" #include "code\_helpers\priority_queue_ch.dm" +#include "code\_helpers\refinery.dm" #include "code\_helpers\sanitize_values.dm" #include "code\_helpers\screen_objs.dm" #include "code\_helpers\shell.dm" @@ -1997,6 +1999,7 @@ #include "code\game\turfs\flooring\flooring_decals_yw.dm" #include "code\game\turfs\flooring\flooring_premade.dm" #include "code\game\turfs\flooring\flooring_vr.dm" +#include "code\game\turfs\flooring\gas_cracks.dm" #include "code\game\turfs\flooring\seasonal.dm" #include "code\game\turfs\flooring\shuttle_vr.dm" #include "code\game\turfs\initialization\init.dm" @@ -4336,6 +4339,7 @@ #include "code\modules\reagents\machinery\dispenser\supply.dm" #include "code\modules\reagents\reactions\_reactions.dm" #include "code\modules\reagents\reactions\distilling\distilling.dm" +#include "code\modules\reagents\reactions\distilling\gas_condensing.dm" #include "code\modules\reagents\reactions\fusion\fusion.dm" #include "code\modules\reagents\reactions\instant\drinks.dm" #include "code\modules\reagents\reactions\instant\drinks_vr.dm" @@ -4389,6 +4393,19 @@ #include "code\modules\recycling\disposal_vr.dm" #include "code\modules\recycling\recycling.dm" #include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\refinery\core\industrial_reagent_filter.dm" +#include "code\modules\refinery\core\industrial_reagent_furnace.dm" +#include "code\modules\refinery\core\industrial_reagent_grinder.dm" +#include "code\modules\refinery\core\industrial_reagent_hub.dm" +#include "code\modules\refinery\core\industrial_reagent_machines.dm" +#include "code\modules\refinery\core\industrial_reagent_pipe.dm" +#include "code\modules\refinery\core\industrial_reagent_pump.dm" +#include "code\modules\refinery\core\industrial_reagent_reactor.dm" +#include "code\modules\refinery\core\industrial_reagent_vat.dm" +#include "code\modules\refinery\core\industrial_reagent_waste.dm" +#include "code\modules\refinery\equipment\chemcontainer.dm" +#include "code\modules\refinery\equipment\pumprelay.dm" +#include "code\modules\refinery\equipment\smart_centrifuge.dm" #include "code\modules\research\message_server.dm" #include "code\modules\research\part_replacer.dm" #include "code\modules\research\tg\designs.dm" @@ -4426,6 +4443,7 @@ #include "code\modules\research\tg\designs\boards\kitchen.dm" #include "code\modules\research\tg\designs\boards\medical.dm" #include "code\modules\research\tg\designs\boards\misc.dm" +#include "code\modules\research\tg\designs\boards\refinery.dm" #include "code\modules\research\tg\designs\boards\science.dm" #include "code\modules\research\tg\designs\boards\telecomms.dm" #include "code\modules\research\tg\experisci\handheld_scanner.dm"