From 7da4aa9adf6bedd07bca74e453badb6d824143a4 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 12 Feb 2021 01:04:39 +0100 Subject: [PATCH] [MIRROR] Reaction rates, pH, purity and more! Brings a heavily improved, less explosive and optimised fermichem to tg. (#3306) * Reaction rates, pH, purity and more! Brings a heavily improved, less explosive and optimised fermichem to tg. * a Co-authored-by: Thalpy <33956696+Thalpy@users.noreply.github.com> Co-authored-by: Gandalf2k15 --- code/__DEFINES/achievements.dm | 1 + code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/reagents.dm | 40 ++ code/__DEFINES/subsystems.dm | 2 + code/__HELPERS/_lists.dm | 14 +- code/__HELPERS/reagents.dm | 4 + code/_compile_options.dm | 7 + code/_globalvars/bitfields.dm | 15 + .../subsystem/processing/reagents.dm | 42 ++ code/datums/achievements/misc_achievements.dm | 6 + .../components/plumbing/reaction_chamber.dm | 6 + code/datums/quirks/negative.dm | 2 +- code/game/atoms.dm | 5 +- code/game/machinery/Sleeper.dm | 2 + code/game/machinery/medical_kiosk.dm | 4 + .../effects/effect_system/effects_foam.dm | 4 +- .../effects/effect_system/effects_smoke.dm | 5 +- code/game/objects/items/devices/scanners.dm | 4 + .../crates_lockers/closets/secure/medical.dm | 3 + code/modules/asset_cache/asset_list_items.dm | 5 + .../kitchen_machinery/deep_fryer.dm | 3 +- .../food_and_drinks/recipes/drinks_recipes.dm | 288 ++++---- .../food_and_drinks/recipes/food_mixtures.dm | 83 ++- code/modules/jobs/job_types/chemist.dm | 2 + .../plumbing/plumbers/reaction_chamber.dm | 21 + .../modules/reagents/chemistry/equilibrium.dm | 404 +++++++++++ .../reagents/chemistry/fermi_readme.md | 212 ++++++ code/modules/reagents/chemistry/holder.dm | 679 ++++++++++++++---- code/modules/reagents/chemistry/items.dm | 164 +++++ .../chemistry/machinery/chem_dispenser.dm | 38 +- .../chemistry/machinery/chem_heater.dm | 372 +++++++++- .../chemistry/machinery/chem_master.dm | 35 +- .../chemistry/machinery/chem_recipe_debug.dm | 129 ++++ code/modules/reagents/chemistry/reagents.dm | 38 +- .../chemistry/reagents/alcohol_reagents.dm | 26 +- .../chemistry/reagents/catalyst_reagents.dm | 48 ++ .../chemistry/reagents/drink_reagents.dm | 5 + .../chemistry/reagents/drug_reagents.dm | 6 + .../chemistry/reagents/food_reagents.dm | 14 + .../chemistry/reagents/impure_reagents.dm | 39 + .../chemistry/reagents/medicine_reagents.dm | 36 + .../chemistry/reagents/other_reagents.dm | 64 +- .../reagents/reaction_agents_reagents.dm | 124 ++++ .../chemistry/reagents/toxin_reagents.dm | 24 + code/modules/reagents/chemistry/recipes.dm | 268 ++++++- .../chemistry/recipes/cat2_medicines.dm | 28 +- .../reagents/chemistry/recipes/catalysts.dm | 26 + .../reagents/chemistry/recipes/drugs.dm | 63 +- .../reagents/chemistry/recipes/medicine.dm | 93 +-- .../reagents/chemistry/recipes/others.dm | 77 +- .../chemistry/recipes/pyrotechnics.dm | 77 +- .../chemistry/recipes/reaction_agents.dm | 115 +++ .../chemistry/recipes/slime_extracts.dm | 79 +- .../reagents/chemistry/recipes/special.dm | 89 ++- .../reagents/chemistry/recipes/toxins.dm | 1 + .../reagents/reagent_containers/bottle.dm | 25 + .../research/designs/medical_designs.dm | 9 + code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/surgery/organs/liver.dm | 15 + code/modules/vending/wardrobes.dm | 3 +- icons/UI_Icons/Achievements/Misc/chem_tut.png | Bin 0 -> 25969 bytes icons/UI_Icons/Advisors/chem_help_advisor.gif | Bin 0 -> 5318 bytes icons/obj/chemical.dmi | Bin 49796 -> 53868 bytes sound/chemistry/SoundSources.txt | 16 + sound/chemistry/acidmelt.ogg | Bin 0 -> 107224 bytes sound/chemistry/bluespace.ogg | Bin 0 -> 47333 bytes sound/chemistry/bufferadd.ogg | Bin 0 -> 37400 bytes sound/chemistry/catalyst.ogg | Bin 0 -> 41252 bytes sound/chemistry/heatdam.ogg | Bin 0 -> 21623 bytes sound/chemistry/heatmelt.ogg | Bin 0 -> 73692 bytes sound/chemistry/shockwave_explosion.ogg | Bin 0 -> 59863 bytes tgstation.dme | 9 + .../packages/tgui/interfaces/ChemDispenser.js | 35 +- tgui/packages/tgui/interfaces/ChemHeater.js | 304 +++++++- tgui/packages/tgui/interfaces/ChemMaster.js | 3 + .../tgui/interfaces/ChemReactionChamber.js | 96 ++- .../tgui/interfaces/common/BeakerContents.js | 7 +- 77 files changed, 3915 insertions(+), 552 deletions(-) create mode 100644 code/controllers/subsystem/processing/reagents.dm create mode 100644 code/modules/reagents/chemistry/equilibrium.dm create mode 100644 code/modules/reagents/chemistry/fermi_readme.md create mode 100644 code/modules/reagents/chemistry/items.dm create mode 100644 code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm create mode 100644 code/modules/reagents/chemistry/reagents/catalyst_reagents.dm create mode 100644 code/modules/reagents/chemistry/reagents/impure_reagents.dm create mode 100644 code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm create mode 100644 code/modules/reagents/chemistry/recipes/catalysts.dm create mode 100644 code/modules/reagents/chemistry/recipes/reaction_agents.dm create mode 100644 icons/UI_Icons/Achievements/Misc/chem_tut.png create mode 100644 icons/UI_Icons/Advisors/chem_help_advisor.gif create mode 100644 sound/chemistry/SoundSources.txt create mode 100644 sound/chemistry/acidmelt.ogg create mode 100644 sound/chemistry/bluespace.ogg create mode 100644 sound/chemistry/bufferadd.ogg create mode 100644 sound/chemistry/catalyst.ogg create mode 100644 sound/chemistry/heatdam.ogg create mode 100644 sound/chemistry/heatmelt.ogg create mode 100644 sound/chemistry/shockwave_explosion.ogg diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 7a7bf3489e5..da640d795e4 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -31,6 +31,7 @@ #define MEDAL_RUST_ASCENSION "Rust" #define MEDAL_VOID_ASCENSION "Void" #define MEDAL_TOOLBOX_SOUL "Toolsoul" +#define MEDAL_CHEM_TUT "Beginner Chemist" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index e7b7d485493..c5dad7e1334 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -208,6 +208,8 @@ #define COMSIG_REAGENTS_TEMP_CHANGE "reagents_temp_change" ///from base of [/datum/reagents/proc/handle_reactions]: (num_reactions) #define COMSIG_REAGENTS_REACTED "reagents_reacted" +///from base of [/datum/reagents/proc/process]: (num_reactions) +#define COMSIG_REAGENTS_REACTION_STEP "reagents_time_step" ///from base of [/atom/proc/expose_reagents]: (/atom, /list, methods, volume_modifier, show_message) #define COMSIG_REAGENTS_EXPOSE_ATOM "reagents_expose_atom" ///from base of [/obj/proc/expose_reagents]: (/obj, /list, methods, volume_modifier, show_message) diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index c149c503a69..e4baf7f9d57 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -12,6 +12,7 @@ #define TRANSPARENT (1<<5) // Used on containers which you want to be able to see the reagents off. #define AMOUNT_VISIBLE (1<<6) // For non-transparent containers that still have the general amount of reagents in them visible. #define NO_REACT (1<<7) // Applied to a reagent holder, the contents will not react with each other. +#define REAGENT_HOLDER_INSTANT_REACT (1<<8) // Applied to a reagent holder, all of the reactions in the reagents datum will be instant. Meant to be used for things like smoke effects where reactions aren't meant to occur // Is an open container for all intents and purposes. #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) @@ -43,3 +44,42 @@ #define CONDIMASTER_STYLE_FALLBACK "_" #define ALLERGIC_REMOVAL_SKIP "Allergy" + +//Used in holder.dm/equlibrium.dm to set values and volume limits +///stops floating point errors causing issues with checking reagent amounts +#define CHEMICAL_QUANTISATION_LEVEL 0.0001 +///The smallest amount of volume allowed - prevents tiny numbers +#define CHEMICAL_VOLUME_MINIMUM 0.001 +///Round to this, to prevent extreme decimal magic and to keep reagent volumes in line with perceived values. +#define CHEMICAL_VOLUME_ROUNDING 0.01 +///Default pH for reagents datum +#define CHEMICAL_NORMAL_PH 7.000 + +//reagent bitflags, used for altering how they works +///allows on_mob_dead() if present in a dead body +#define REAGENT_DEAD_PROCESS (1<<0) +///Do not split the chem at all during processing - ignores all purity effects +#define REAGENT_DONOTSPLIT (1<<1) +///Doesn't appear on handheld health analyzers. +#define REAGENT_INVISIBLE (1<<2) +///When inverted, the inverted chem uses the name of the original chem +#define REAGENT_SNEAKYNAME (1<<3) +///Retains initial volume of chem when splitting for purity effects +#define REAGENT_SPLITRETAINVOL (1<<4) + +//Chemical reaction flags, for determining reaction specialties +///Convert into impure/pure on reaction completion +#define REACTION_CLEAR_IMPURE (1<<0) +///Convert into inverse on reaction completion when purity is low enough +#define REACTION_CLEAR_INVERSE (1<<1) +///Clear converted chems retain their purities/inverted purities. Requires 1 or both of the above. +#define REACTION_CLEAR_RETAIN (1<<2) +///Used to create instant reactions +#define REACTION_INSTANT (1<<3) +///Used to force reactions to create a specific amount of heat per 1u created. So if thermic_constant = 5, for 1u of reagent produced, the heat will be forced up arbitarily by 5 irresepective of other reagents. If you use this, keep in mind standard thermic_constant values are 100x what it should be with this enabled. +#define REACTION_HEAT_ARBITARY (1<<4) +///Used to bypass the chem_master transfer block (This is needed for competitive reactions unless you have an end state programmed). More stuff might be added later. When defining this, please add in the comments the associated reactions that it competes with +#define REACTION_COMPETITIVE (1<<5) + +///Used to force an equlibrium to end a reaction in reaction_step() (i.e. in a reaction_step() proc return END_REACTION to end it) +#define END_REACTION "end_reaction" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index b6d5cceac54..3bdfedbc96b 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -119,6 +119,7 @@ #define INIT_ORDER_QUIRKS 60 #define INIT_ORDER_TICKER 55 #define INIT_ORDER_TCG 55 +#define INIT_ORDER_REAGENTS 55 //HAS to be before mapping - mapping creates objects, which creates reagents, which relies on lists made in this subsystem #define INIT_ORDER_MAPPING 50 #define INIT_ORDER_TIMETRACK 47 #define INIT_ORDER_NETWORKS 45 @@ -161,6 +162,7 @@ #define FIRE_PRIORITY_NPC 20 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 +#define FIRE_PRIORITY_REAGENTS 26 #define FIRE_PRIORITY_SPACEDRIFT 30 #define FIRE_PRIORITY_FIELDS 30 #define FIRE_PRIOTITY_SMOOTHING 35 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 08ca05396e8..a6f64518d82 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -11,7 +11,8 @@ #define LAZYINITLIST(L) if (!L) L = list() #define UNSETEMPTY(L) if (L && !length(L)) L = null -#define LAZYCOPY(L) (L ? L.Copy() : list() ) +///Like LAZYCOPY - copies an input list if the list has entries, If it doesn't the assigned list is nulled +#define LAZYLISTDUPLICATE(L) (L ? L.Copy() : null ) #define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } } #define LAZYADD(L, I) if(!L) { L = list(); } L += I; #define LAZYOR(L, I) if(!L) { L = list(); } L |= I; @@ -19,12 +20,17 @@ #define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null) #define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V; #define LAZYLEN(L) length(L) -#define LAZYCLEARLIST(L) if(L) L.Cut() -#define SANITIZE_LIST(L) ( islist(L) ? L : list() ) -#define reverseList(L) reverseRange(L.Copy()) +///Sets a list to null +#define LAZYNULL(L) L = null #define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V); #define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; } #define LAZYACCESSASSOC(L, I, K) L ? L[I] ? L[I][K] ? L[I][K] : null : null : null +#define QDEL_LAZYLIST(L) for(var/I in L) qdel(I); L = null; +//These methods don't null the list +#define LAZYCOPY(L) (L ? L.Copy() : list() ) //Use LAZYLISTDUPLICATE instead if you want it to null with no entries +#define LAZYCLEARLIST(L) if(L) L.Cut() // Consider LAZYNULL instead +#define SANITIZE_LIST(L) ( islist(L) ? L : list() ) +#define reverseList(L) reverseRange(L.Copy()) /// Passed into BINARY_INSERT to compare keys #define COMPARE_KEY __BIN_LIST[__BIN_MID] diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index e96a5509f66..92c7b872bb1 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -1,4 +1,8 @@ /proc/chem_recipes_do_conflict(datum/chemical_reaction/r1, datum/chemical_reaction/r2) + //We have to check to see if either is competitive so can ignore it (competitive reagents are supposed to conflict) + if((r1.reaction_flags & REACTION_COMPETITIVE) || (r2.reaction_flags & REACTION_COMPETITIVE)) + return FALSE + //do the non-list tests first, because they are cheaper if(r1.required_container != r2.required_container) return FALSE diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 8ff0ac753a4..e4ac1b2b099 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -15,6 +15,13 @@ //#define REFERENCE_TRACKING #ifdef REFERENCE_TRACKING +/* +* Enables debug messages for every single reaction step. This is 1 message per 0.5s for a SINGLE reaction. Useful for tracking down bugs/asking me for help in the main reaction handiler (equilibrium.dm). +* +* * Requires TESTING to be defined to work. +*/ +//#define REAGENTS_TESTING + ///Run a lookup on things hard deleting by default. //#define GC_FAILURE_HARD_LOOKUP #ifdef GC_FAILURE_HARD_LOOKUP diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index b9156b8ba1a..ab3f28a557f 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -294,3 +294,18 @@ DEFINE_BITFIELD(zap_flags, list( "ZAP_OBJ_DAMAGE" = ZAP_OBJ_DAMAGE, "ZAP_GENERATES_POWER" = ZAP_GENERATES_POWER, )) + +DEFINE_BITFIELD(chemical_flags, list( + "REAGENT_DEAD_PROCESS" = REAGENT_DEAD_PROCESS, + "REAGENT_DONOTSPLIT" = REAGENT_DONOTSPLIT, + "REAGENT_INVISIBLE" = REAGENT_INVISIBLE, + "REAGENT_SNEAKYNAME" = REAGENT_SNEAKYNAME, + "REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL, +)) + +DEFINE_BITFIELD(reaction_flags, list( + "REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE, + "REACTION_CLEAR_INVERSE" = REACTION_CLEAR_INVERSE, + "REACTION_CLEAR_RETAIN" = REACTION_CLEAR_RETAIN, + "REACTION_INSTANT" = REACTION_INSTANT, +)) diff --git a/code/controllers/subsystem/processing/reagents.dm b/code/controllers/subsystem/processing/reagents.dm new file mode 100644 index 00000000000..344c066adf2 --- /dev/null +++ b/code/controllers/subsystem/processing/reagents.dm @@ -0,0 +1,42 @@ +//Used for active reactions in reagents/equilibrium datums + +PROCESSING_SUBSYSTEM_DEF(reagents) + name = "Reagents" + init_order = INIT_ORDER_REAGENTS + priority = FIRE_PRIORITY_REAGENTS + wait = 0.25 SECONDS //You might think that rate_up_lim has to be set to half, but since everything is normalised around delta_time, it automatically adjusts it to be per second. Magic! + flags = SS_KEEP_TIMING + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + ///What time was it when we last ticked + var/previous_world_time = 0 + +/datum/controller/subsystem/processing/reagents/Initialize() + . = ..() + //So our first step isn't insane + previous_world_time = world.time + //Build GLOB lists - see holder.dm + build_chemical_reagent_list() + build_chemical_reactions_list() + return + +/datum/controller/subsystem/processing/reagents/fire(resumed = FALSE) + if (!resumed) + currentrun = processing.Copy() + //cache for sanic speed (lists are references anyways) + var/list/current_run = currentrun + + //Attempt to realtime reactions in a way that doesn't make them overtly dangerous + var/delta_realtime = (world.time - previous_world_time)/10 //normalise to s from ds + previous_world_time = world.time + + while(current_run.len) + var/datum/thing = current_run[current_run.len] + current_run.len-- + if(QDELETED(thing)) + stack_trace("Found qdeleted thing in [type], in the current_run list.") + processing -= thing + else if(thing.process(delta_realtime) == PROCESS_KILL) //we are realtime + // fully stop so that a future START_PROCESSING will work + STOP_PROCESSING(src, thing) + if (MC_TICK_CHECK) + return diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index c08b2d9dbbd..0da38df8f30 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -153,3 +153,9 @@ desc = "My eternal soul was destroyed to make a toolbox look funny and all I got was this achievement..." database_id = MEDAL_TOOLBOX_SOUL icon = "toolbox_soul" + +/datum/award/achievement/misc/chemistry_tut + name = "Perfect chemistry blossom" + desc = "Passed the chemistry tutorial with perfect purity!" + database_id = MEDAL_CHEM_TUT + icon = "chem_tut" diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm index 88d7c760a7d..07ee12b108e 100644 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -36,3 +36,9 @@ RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update //everything for every chemical removed, wich isn't a good option either. RC.on_reagent_change(reagents) //We need to check it now, because some reactions leave nothing left. + + +/datum/component/plumbing/reaction_chamber/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + if(reagents.is_reacting == TRUE) //Let the thing react in peace + return + return ..() diff --git a/code/datums/quirks/negative.dm b/code/datums/quirks/negative.dm index 851d3060a3c..81654a2ac87 100644 --- a/code/datums/quirks/negative.dm +++ b/code/datums/quirks/negative.dm @@ -193,7 +193,7 @@ if("Psychologist") heirloom_type = /obj/item/storage/pill_bottle if("Chemist") - heirloom_type = /obj/item/book/manual/wiki/chemistry + heirloom_type = pick(/obj/item/book/manual/wiki/chemistry, /obj/item/ph_booklet) if("Virologist") heirloom_type = /obj/item/reagent_containers/syringe //Engineering diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a4816ca7220..4bf4100f4ad 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -611,7 +611,10 @@ if(length(reagents.reagent_list)) if(user.can_see_reagents()) //Show each individual reagent for(var/datum/reagent/R in reagents.reagent_list) - . += "[R.volume] units of [R.name]" + . += "[round(R.volume, 0.01)] units of [R.name]" + if(reagents.is_reacting) + . += "It is currently reacting!" + . += "The solution's pH is [round(reagents.ph, 0.01)] and has a temperature of [reagents.chem_temp]K." else //Otherwise, just show the total volume var/total_volume = 0 for(var/datum/reagent/R in reagents.reagent_list) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 4f36f7ac73e..cca2561c4f7 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -202,6 +202,8 @@ data["occupant"]["reagents"] = list() if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) + if(R.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems + continue data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) return data diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 5f1c2af708b..3cd0b413d7c 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -235,6 +235,8 @@ if(altPatient.reagents.reagent_list.len) //Chemical Analysis details. for(var/r in altPatient.reagents.reagent_list) var/datum/reagent/reagent = r + if(reagent.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems + continue chemical_list += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01))) if(reagent.overdosed) overdose_list += list(list("name" = reagent.name)) @@ -242,6 +244,8 @@ if(belly?.reagents.reagent_list.len) //include the stomach contents if it exists for(var/bile in belly.reagents.reagent_list) var/datum/reagent/bit = bile + if(bit.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems + continue if(!belly.food_reagents[bit.type]) chemical_list += list(list("name" = bit.name, "volume" = round(bit.volume, 0.01))) else diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 0466504ac5c..513fc71153a 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -91,7 +91,7 @@ /obj/effect/particle_effect/foam/Initialize() . = ..() - create_reagents(1000) //limited by the size of the reagent holder anyway. + create_reagents(1000, REAGENT_HOLDER_INSTANT_REACT) //limited by the size of the reagent holder anyway. Works without instant possibly edit in future START_PROCESSING(SSfastprocess, src) playsound(src, 'sound/effects/bubbles2.ogg', 80, TRUE, -3) @@ -224,7 +224,7 @@ /datum/effect_system/foam_spread/New() ..() chemholder = new /obj() - var/datum/reagents/R = new/datum/reagents(1000) + var/datum/reagents/R = new/datum/reagents(1000, REAGENT_HOLDER_INSTANT_REACT) //same as above chemholder.reagents = R R.my_atom = chemholder diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 04a4f901676..aaf4f52889b 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -263,8 +263,9 @@ /datum/effect_system/smoke_spread/chem/New() ..() chemholder = new /obj() - var/datum/reagents/R = new/datum/reagents(500) + var/datum/reagents/R = new (500, REAGENT_HOLDER_INSTANT_REACT) //This is a safety for now to prevent smoke generating more smoke as the smoke reagents react in the smoke. This is prevented naturally from happening even if this is off, but I want to be sure that any edge cases are prevented before I get a chance to rework smoke reactions (specifically adding water or reacting away stabilizing agent in the middle of it). chemholder.reagents = R + R.my_atom = chemholder /datum/effect_system/smoke_spread/chem/Destroy() @@ -288,7 +289,7 @@ contained = "\[[contained]\]" var/where = "[AREACOORD(location)]" - if(carry.my_atom.fingerprintslast) + if(carry.my_atom?.fingerprintslast) //Some reagents don't have a my_atom in some cases var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e3e66a4c103..36da0dad728 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -430,6 +430,8 @@ GENE SCANNER render_list += "Subject contains the following reagents in their blood:\n" for(var/r in M.reagents.reagent_list) var/datum/reagent/reagent = r + if(reagent.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems on scanners + continue render_list += "[round(reagent.volume, 0.001)] units of [reagent.name][reagent.overdosed ? " - OVERDOSING" : "."]\n" else render_list += "Subject contains no reagents in their blood.\n" @@ -439,6 +441,8 @@ GENE SCANNER render_list += "Subject contains the following reagents in their stomach:\n" for(var/bile in belly.reagents.reagent_list) var/datum/reagent/bit = bile + if(bit.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems on scanners + continue if(!belly.food_reagents[bit.type]) render_list += "[round(bit.volume, 0.001)] units of [bit.name][bit.overdosed ? " - OVERDOSING" : "."]\n" else diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 1959e2157a5..4e18a996a40 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -123,6 +123,9 @@ new /obj/item/storage/box/medigels(src) new /obj/item/storage/box/hypospray(src) //SKYRAT EDIT ADDITION - HYPOSPRAYS new /obj/item/storage/box/hypospray(src) //SKYRAT EDIT ADDITION - HYPOSPRAYS + new /obj/item/ph_booklet(src) + new /obj/item/reagent_containers/dropper(src) + new /obj/item/reagent_containers/glass/bottle/acidic_buffer(src) //hopefully they get the hint /obj/structure/closet/secure_closet/chemical/heisenberg //contains one of each beaker, syringe etc. name = "advanced chemical closet" diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 62bcf6e0288..dd2bc8d4632 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -524,3 +524,8 @@ /proc/sanitize_css_class_name(name) var/static/regex/regex = new(@"[^a-zA-Z0-9]","g") return replacetext(name, regex, "") + +/datum/asset/simple/tutorial_advisors + assets = list( + "chem_help_advisor.gif" = 'icons/UI_Icons/Advisors/chem_help_advisor.gif', + ) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index cc7231f7370..352c6438d13 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -131,7 +131,8 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( reagents.expose(C, TOUCH) var/permeability = 1 - C.get_permeability_protection(list(HEAD)) C.apply_damage(min(30 * permeability, reagents.total_volume), BURN, BODY_ZONE_HEAD) - reagents.remove_any((reagents.total_volume/2)) + if(reagents.reagent_list) //This can runtime if reagents has nothing in it. + reagents.remove_any((reagents.total_volume/2)) C.Paralyze(60) user.changeNext_move(CLICK_CD_MELEE) return ..() diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index c7fc75b956e..da378521c4a 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -1,594 +1,610 @@ +//////////////////////////////////////// DRINK RECIPE BASE //////////////////////////////// + +/datum/chemical_reaction/drink + optimal_temp = 400 + temp_exponent_factor = 1 + optimal_ph_min = 2 + optimal_ph_max = 10 + thermic_constant = 0 + H_ion_release = 0 + rate_up_lim = 50 + ////////////////////////////////////////// COCKTAILS ////////////////////////////////////// -/datum/chemical_reaction/goldschlager +/datum/chemical_reaction/drink/goldschlager results = list(/datum/reagent/consumable/ethanol/goldschlager = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/gold = 1) -/datum/chemical_reaction/patron +/datum/chemical_reaction/drink/patron results = list(/datum/reagent/consumable/ethanol/patron = 10) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 10, /datum/reagent/silver = 1) -/datum/chemical_reaction/bilk +/datum/chemical_reaction/drink/bilk results = list(/datum/reagent/consumable/ethanol/bilk = 2) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ethanol/beer = 1) -/datum/chemical_reaction/icetea +/datum/chemical_reaction/drink/icetea results = list(/datum/reagent/consumable/icetea = 4) required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/tea = 3) -/datum/chemical_reaction/icecoffee +/datum/chemical_reaction/drink/icecoffee results = list(/datum/reagent/consumable/icecoffee = 4) required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/coffee = 3) -/datum/chemical_reaction/hoticecoffee +/datum/chemical_reaction/drink/hoticecoffee results = list(/datum/reagent/consumable/hot_ice_coffee = 3) required_reagents = list(/datum/reagent/toxin/hot_ice = 1, /datum/reagent/consumable/coffee = 2) -/datum/chemical_reaction/nuka_cola +/datum/chemical_reaction/drink/nuka_cola results = list(/datum/reagent/consumable/nuka_cola = 6) required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6) -/datum/chemical_reaction/moonshine +/datum/chemical_reaction/drink/moonshine results = list(/datum/reagent/consumable/ethanol/moonshine = 10) required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/wine +/datum/chemical_reaction/drink/wine results = list(/datum/reagent/consumable/ethanol/wine = 10) required_reagents = list(/datum/reagent/consumable/grapejuice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/spacebeer +/datum/chemical_reaction/drink/spacebeer results = list(/datum/reagent/consumable/ethanol/beer = 10) required_reagents = list(/datum/reagent/consumable/flour = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/vodka +/datum/chemical_reaction/drink/vodka results = list(/datum/reagent/consumable/ethanol/vodka = 10) required_reagents = list(/datum/reagent/consumable/potato_juice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/kahlua +/datum/chemical_reaction/drink/kahlua results = list(/datum/reagent/consumable/ethanol/kahlua = 5) required_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/gin_tonic +/datum/chemical_reaction/drink/gin_tonic results = list(/datum/reagent/consumable/ethanol/gintonic = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/tonic = 1) -/datum/chemical_reaction/rum_coke +/datum/chemical_reaction/drink/rum_coke results = list(/datum/reagent/consumable/ethanol/rum_coke = 3) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/space_cola = 1) -/datum/chemical_reaction/cuba_libre +/datum/chemical_reaction/drink/cuba_libre results = list(/datum/reagent/consumable/ethanol/cuba_libre = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum_coke = 3, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/martini +/datum/chemical_reaction/drink/martini results = list(/datum/reagent/consumable/ethanol/martini = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/ethanol/vermouth = 1) -/datum/chemical_reaction/vodkamartini +/datum/chemical_reaction/drink/vodkamartini results = list(/datum/reagent/consumable/ethanol/vodkamartini = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/ethanol/vermouth = 1) -/datum/chemical_reaction/white_russian +/datum/chemical_reaction/drink/white_russian results = list(/datum/reagent/consumable/ethanol/white_russian = 5) required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 3, /datum/reagent/consumable/cream = 2) -/datum/chemical_reaction/whiskey_cola +/datum/chemical_reaction/drink/whiskey_cola results = list(/datum/reagent/consumable/ethanol/whiskey_cola = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/space_cola = 1) -/datum/chemical_reaction/screwdriver +/datum/chemical_reaction/drink/screwdriver results = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/orangejuice = 1) -/datum/chemical_reaction/bloody_mary +/datum/chemical_reaction/drink/bloody_mary results = list(/datum/reagent/consumable/ethanol/bloody_mary = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/gargle_blaster +/datum/chemical_reaction/drink/gargle_blaster results = list(/datum/reagent/consumable/ethanol/gargle_blaster = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/brave_bull +/datum/chemical_reaction/drink/brave_bull results = list(/datum/reagent/consumable/ethanol/brave_bull = 3) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/ethanol/kahlua = 1) -/datum/chemical_reaction/tequila_sunrise +/datum/chemical_reaction/drink/tequila_sunrise results = list(/datum/reagent/consumable/ethanol/tequila_sunrise = 5) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/orangejuice = 2, /datum/reagent/consumable/grenadine = 1) -/datum/chemical_reaction/toxins_special +/datum/chemical_reaction/drink/toxins_special results = list(/datum/reagent/consumable/ethanol/toxins_special = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2) -/datum/chemical_reaction/beepsky_smash +/datum/chemical_reaction/drink/beepsky_smash results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1) -/datum/chemical_reaction/doctor_delight +/datum/chemical_reaction/drink/doctor_delight results = list(/datum/reagent/consumable/doctor_delight = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1) -/datum/chemical_reaction/irish_cream +/datum/chemical_reaction/drink/irish_cream results = list(/datum/reagent/consumable/ethanol/irish_cream = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/cream = 1) -/datum/chemical_reaction/manly_dorf +/datum/chemical_reaction/drink/manly_dorf results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3) required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2) -/datum/chemical_reaction/greenbeer +/datum/chemical_reaction/drink/greenbeer results = list(/datum/reagent/consumable/ethanol/beer/green = 10) required_reagents = list(/datum/reagent/colorful_reagent/powder/green = 1, /datum/reagent/consumable/ethanol/beer = 10) -/datum/chemical_reaction/greenbeer2 //apparently there's no other way to do this +/datum/chemical_reaction/drink/greenbeer2 //apparently there's no other way to do this results = list(/datum/reagent/consumable/ethanol/beer/green = 10) required_reagents = list(/datum/reagent/colorful_reagent/powder/green/crayon = 1, /datum/reagent/consumable/ethanol/beer = 10) -/datum/chemical_reaction/hooch +/datum/chemical_reaction/drink/hooch results = list(/datum/reagent/consumable/ethanol/hooch = 3) required_reagents = list (/datum/reagent/consumable/ethanol = 2, /datum/reagent/fuel = 1) required_catalysts = list(/datum/reagent/consumable/enzyme = 1) -/datum/chemical_reaction/irish_coffee +/datum/chemical_reaction/drink/irish_coffee results = list(/datum/reagent/consumable/ethanol/irishcoffee = 2) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/coffee = 1) -/datum/chemical_reaction/b52 +/datum/chemical_reaction/drink/b52 results = list(/datum/reagent/consumable/ethanol/b52 = 3) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/cognac = 1) -/datum/chemical_reaction/atomicbomb +/datum/chemical_reaction/drink/atomicbomb results = list(/datum/reagent/consumable/ethanol/atomicbomb = 10) required_reagents = list(/datum/reagent/consumable/ethanol/b52 = 10, /datum/reagent/uranium = 1) -/datum/chemical_reaction/margarita +/datum/chemical_reaction/drink/margarita results = list(/datum/reagent/consumable/ethanol/margarita = 4) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/triple_sec = 1) -/datum/chemical_reaction/longislandicedtea +/datum/chemical_reaction/drink/longislandicedtea results = list(/datum/reagent/consumable/ethanol/longislandicedtea = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/tequila = 1, /datum/reagent/consumable/ethanol/cuba_libre = 1) -/datum/chemical_reaction/threemileisland +/datum/chemical_reaction/drink/threemileisland results = list(/datum/reagent/consumable/ethanol/threemileisland = 10) required_reagents = list(/datum/reagent/consumable/ethanol/longislandicedtea = 10, /datum/reagent/uranium = 1) -/datum/chemical_reaction/whiskeysoda +/datum/chemical_reaction/drink/whiskeysoda results = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/sodawater = 1) -/datum/chemical_reaction/black_russian +/datum/chemical_reaction/drink/black_russian results = list(/datum/reagent/consumable/ethanol/black_russian = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 3, /datum/reagent/consumable/ethanol/kahlua = 2) -/datum/chemical_reaction/hiveminderaser +/datum/chemical_reaction/drink/hiveminderaser results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4) required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1) -/datum/chemical_reaction/manhattan +/datum/chemical_reaction/drink/manhattan results = list(/datum/reagent/consumable/ethanol/manhattan = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 2, /datum/reagent/consumable/ethanol/vermouth = 1) -/datum/chemical_reaction/manhattan_proj +/datum/chemical_reaction/drink/manhattan_proj results = list(/datum/reagent/consumable/ethanol/manhattan_proj = 10) required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 10, /datum/reagent/uranium = 1) -/datum/chemical_reaction/vodka_tonic +/datum/chemical_reaction/drink/vodka_tonic results = list(/datum/reagent/consumable/ethanol/vodkatonic = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/tonic = 1) -/datum/chemical_reaction/gin_fizz +/datum/chemical_reaction/drink/gin_fizz results = list(/datum/reagent/consumable/ethanol/ginfizz = 4) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/bahama_mama +/datum/chemical_reaction/drink/bahama_mama results = list(/datum/reagent/consumable/ethanol/bahama_mama = 5) required_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/pineapplejuice = 1) -/datum/chemical_reaction/singulo +/datum/chemical_reaction/drink/singulo results = list(/datum/reagent/consumable/ethanol/singulo = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/uranium/radium = 1, /datum/reagent/consumable/ethanol/wine = 5) -/datum/chemical_reaction/alliescocktail +/datum/chemical_reaction/drink/alliescocktail results = list(/datum/reagent/consumable/ethanol/alliescocktail = 2) required_reagents = list(/datum/reagent/consumable/ethanol/martini = 1, /datum/reagent/consumable/ethanol/vodka = 1) -/datum/chemical_reaction/demonsblood +/datum/chemical_reaction/drink/demonsblood results = list(/datum/reagent/consumable/ethanol/demonsblood = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/spacemountainwind = 1, /datum/reagent/blood = 1, /datum/reagent/consumable/dr_gibb = 1) -/datum/chemical_reaction/booger +/datum/chemical_reaction/drink/booger results = list(/datum/reagent/consumable/ethanol/booger = 4) required_reagents = list(/datum/reagent/consumable/cream = 1, /datum/reagent/consumable/banana = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/watermelonjuice = 1) -/datum/chemical_reaction/antifreeze +/datum/chemical_reaction/drink/antifreeze results = list(/datum/reagent/consumable/ethanol/antifreeze = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ice = 1) -/datum/chemical_reaction/barefoot +/datum/chemical_reaction/drink/barefoot results = list(/datum/reagent/consumable/ethanol/barefoot = 3) required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ethanol/vermouth = 1) -/datum/chemical_reaction/moscow_mule +/datum/chemical_reaction/drink/moscow_mule results = list(/datum/reagent/consumable/ethanol/moscow_mule = 10) required_reagents = list(/datum/reagent/consumable/sol_dry = 5, /datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ice = 1) mix_sound = 'sound/effects/bubbles2.ogg' -/datum/chemical_reaction/painkiller +/datum/chemical_reaction/drink/painkiller results = list(/datum/reagent/consumable/ethanol/painkiller = 10) required_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 5, /datum/reagent/consumable/pineapplejuice = 4, /datum/reagent/consumable/orangejuice = 1) -/datum/chemical_reaction/pina_colada +/datum/chemical_reaction/drink/pina_colada results = list(/datum/reagent/consumable/ethanol/pina_colada = 5) required_reagents = list(/datum/reagent/consumable/ethanol/creme_de_coconut = 1, /datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/limejuice = 1) ////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri///// -/datum/chemical_reaction/sbiten +/datum/chemical_reaction/drink/sbiten results = list(/datum/reagent/consumable/ethanol/sbiten = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/consumable/capsaicin = 1) -/datum/chemical_reaction/red_mead +/datum/chemical_reaction/drink/red_mead results = list(/datum/reagent/consumable/ethanol/red_mead = 2) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/mead = 1) -/datum/chemical_reaction/mead +/datum/chemical_reaction/drink/mead results = list(/datum/reagent/consumable/ethanol/mead = 2) required_reagents = list(/datum/reagent/consumable/honey = 2) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) -/datum/chemical_reaction/iced_beer +/datum/chemical_reaction/drink/iced_beer results = list(/datum/reagent/consumable/ethanol/iced_beer = 6) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 5, /datum/reagent/consumable/ice = 1) -/datum/chemical_reaction/grog +/datum/chemical_reaction/drink/grog results = list(/datum/reagent/consumable/ethanol/grog = 2) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/water = 1) -/datum/chemical_reaction/soy_latte +/datum/chemical_reaction/drink/soy_latte results = list(/datum/reagent/consumable/soy_latte = 2) required_reagents = list(/datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/soymilk = 1) -/datum/chemical_reaction/cafe_latte +/datum/chemical_reaction/drink/cafe_latte results = list(/datum/reagent/consumable/cafe_latte = 2) required_reagents = list(/datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/milk = 1) -/datum/chemical_reaction/acidspit +/datum/chemical_reaction/drink/acidspit results = list(/datum/reagent/consumable/ethanol/acid_spit = 6) required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/consumable/ethanol/wine = 5) + optimal_ph_min = 0 //Our reaction is very acidic, so lets shift our range -/datum/chemical_reaction/amasec +/datum/chemical_reaction/drink/amasec results = list(/datum/reagent/consumable/ethanol/amasec = 10) required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/consumable/ethanol/wine = 5, /datum/reagent/consumable/ethanol/vodka = 5) -/datum/chemical_reaction/changelingsting +/datum/chemical_reaction/drink/changelingsting results = list(/datum/reagent/consumable/ethanol/changelingsting = 5) required_reagents = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 1, /datum/reagent/consumable/lemon_lime = 2) -/datum/chemical_reaction/aloe +/datum/chemical_reaction/drink/aloe results = list(/datum/reagent/consumable/ethanol/aloe = 2) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/watermelonjuice = 1) -/datum/chemical_reaction/andalusia +/datum/chemical_reaction/drink/andalusia results = list(/datum/reagent/consumable/ethanol/andalusia = 3) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1) -/datum/chemical_reaction/neurotoxin +/datum/chemical_reaction/drink/neurotoxin results = list(/datum/reagent/consumable/ethanol/neurotoxin = 2) required_reagents = list(/datum/reagent/consumable/ethanol/gargle_blaster = 1, /datum/reagent/medicine/morphine = 1) -/datum/chemical_reaction/snowwhite +/datum/chemical_reaction/drink/snowwhite results = list(/datum/reagent/consumable/ethanol/snowwhite = 2) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/lemon_lime = 1) -/datum/chemical_reaction/irishcarbomb +/datum/chemical_reaction/drink/irishcarbomb results = list(/datum/reagent/consumable/ethanol/irishcarbomb = 2) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 1, /datum/reagent/consumable/ethanol/irish_cream = 1) -/datum/chemical_reaction/syndicatebomb +/datum/chemical_reaction/drink/syndicatebomb results = list(/datum/reagent/consumable/ethanol/syndicatebomb = 2) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/whiskey_cola = 1) -/datum/chemical_reaction/erikasurprise +/datum/chemical_reaction/drink/erikasurprise results = list(/datum/reagent/consumable/ethanol/erikasurprise = 5) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/banana = 1, /datum/reagent/consumable/ice = 1) -/datum/chemical_reaction/devilskiss +/datum/chemical_reaction/drink/devilskiss results = list(/datum/reagent/consumable/ethanol/devilskiss = 3) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 1) -/datum/chemical_reaction/hippiesdelight +/datum/chemical_reaction/drink/hippiesdelight results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2) required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1) -/datum/chemical_reaction/bananahonk +/datum/chemical_reaction/drink/bananahonk results = list(/datum/reagent/consumable/ethanol/bananahonk = 2) required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1) -/datum/chemical_reaction/silencer +/datum/chemical_reaction/drink/silencer results = list(/datum/reagent/consumable/ethanol/silencer = 3) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1) -/datum/chemical_reaction/driestmartini +/datum/chemical_reaction/drink/driestmartini results = list(/datum/reagent/consumable/ethanol/driestmartini = 2) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1) -/datum/chemical_reaction/thirteenloko +/datum/chemical_reaction/drink/thirteenloko results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/cherryshake +/datum/chemical_reaction/drink/cherryshake results = list(/datum/reagent/consumable/cherryshake = 3) required_reagents = list(/datum/reagent/consumable/cherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) -/datum/chemical_reaction/bluecherryshake +/datum/chemical_reaction/drink/bluecherryshake results = list(/datum/reagent/consumable/bluecherryshake = 3) required_reagents = list(/datum/reagent/consumable/bluecherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) -/datum/chemical_reaction/drunkenblumpkin +/datum/chemical_reaction/drink/drunkenblumpkin results = list(/datum/reagent/consumable/ethanol/drunkenblumpkin = 4) required_reagents = list(/datum/reagent/consumable/blumpkinjuice = 1, /datum/reagent/consumable/ethanol/irish_cream = 2, /datum/reagent/consumable/ice = 1) -/datum/chemical_reaction/pumpkin_latte +/datum/chemical_reaction/drink/pumpkin_latte results = list(/datum/reagent/consumable/pumpkin_latte = 15) required_reagents = list(/datum/reagent/consumable/pumpkinjuice = 5, /datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/cream = 5) -/datum/chemical_reaction/gibbfloats +/datum/chemical_reaction/drink/gibbfloats results = list(/datum/reagent/consumable/gibbfloats = 15) required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5) -/datum/chemical_reaction/triple_citrus +/datum/chemical_reaction/drink/triple_citrus results = list(/datum/reagent/consumable/triple_citrus = 5) required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1) + optimal_ph_min = 0//Our reaction is very acidic, so lets shift our range -/datum/chemical_reaction/grape_soda +/datum/chemical_reaction/drink/grape_soda results = list(/datum/reagent/consumable/grape_soda = 2) required_reagents = list(/datum/reagent/consumable/grapejuice = 1, /datum/reagent/consumable/sodawater = 1) -/datum/chemical_reaction/grappa +/datum/chemical_reaction/drink/grappa results = list(/datum/reagent/consumable/ethanol/grappa = 10) required_reagents = list (/datum/reagent/consumable/ethanol/wine = 10) required_catalysts = list (/datum/reagent/consumable/enzyme = 10) -/datum/chemical_reaction/whiskey_sour +/datum/chemical_reaction/drink/whiskey_sour results = list(/datum/reagent/consumable/ethanol/whiskey_sour = 3) required_reagents = list(/datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/sugar = 1) mix_message = "The mixture darkens to a rich gold hue." -/datum/chemical_reaction/fetching_fizz +/datum/chemical_reaction/drink/fetching_fizz results = list(/datum/reagent/consumable/ethanol/fetching_fizz = 3) required_reagents = list(/datum/reagent/consumable/nuka_cola = 1, /datum/reagent/iron = 1) //Manufacturable from only the mining station mix_message = "The mixture slightly vibrates before settling." -/datum/chemical_reaction/hearty_punch +/datum/chemical_reaction/drink/hearty_punch results = list(/datum/reagent/consumable/ethanol/hearty_punch = 1) //Very little, for balance reasons required_reagents = list(/datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5, /datum/reagent/consumable/ethanol/absinthe = 5) mix_message = "The mixture darkens to a healthy crimson." required_temp = 315 //Piping hot! -/datum/chemical_reaction/bacchus_blessing +/datum/chemical_reaction/drink/bacchus_blessing results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4) required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1) mix_message = "The mixture turns to a sickening froth." -/datum/chemical_reaction/lemonade +/datum/chemical_reaction/drink/lemonade results = list(/datum/reagent/consumable/lemonade = 5) required_reagents = list(/datum/reagent/consumable/lemonjuice = 2, /datum/reagent/water = 2, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/ice = 1) mix_message = "You're suddenly reminded of home." -/datum/chemical_reaction/arnold_palmer +/datum/chemical_reaction/drink/arnold_palmer results = list(/datum/reagent/consumable/tea/arnold_palmer = 2) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/lemonade = 1) mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange." -/datum/chemical_reaction/chocolate_milk +/datum/chemical_reaction/drink/chocolate_milk results = list(/datum/reagent/consumable/milk/chocolate_milk = 5) required_reagents = list(/datum/reagent/consumable/hot_coco = 3, /datum/reagent/consumable/coco = 2) mix_message = "The color changes as the mixture blends smoothly." required_temp = 300 is_cold_recipe = TRUE + optimal_temp = 280 + overheat_temp = 5 + thermic_constant= -1 -/datum/chemical_reaction/hot_coco +/datum/chemical_reaction/drink/hot_coco results = list(/datum/reagent/consumable/hot_coco = 6) required_reagents = list(/datum/reagent/consumable/milk = 5, /datum/reagent/consumable/coco = 1) required_temp = 320 -/datum/chemical_reaction/hot_coco_from_chocolate_milk +/datum/chemical_reaction/drink/hot_coco_from_chocolate_milk results = list(/datum/reagent/consumable/hot_coco = 3) required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 1, /datum/reagent/consumable/milk = 2) required_temp = 320 -/datum/chemical_reaction/coffee +/datum/chemical_reaction/drink/coffee results = list(/datum/reagent/consumable/coffee = 5) required_reagents = list(/datum/reagent/toxin/coffeepowder = 1, /datum/reagent/water = 5) -/datum/chemical_reaction/tea +/datum/chemical_reaction/drink/tea results = list(/datum/reagent/consumable/tea = 5) required_reagents = list(/datum/reagent/toxin/teapowder = 1, /datum/reagent/water = 5) -/datum/chemical_reaction/eggnog +/datum/chemical_reaction/drink/eggnog results = list(/datum/reagent/consumable/ethanol/eggnog = 15) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 5, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/eggyolk = 5) -/datum/chemical_reaction/narsour +/datum/chemical_reaction/drink/narsour results = list(/datum/reagent/consumable/ethanol/narsour = 1) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/demonsblood = 1) mix_message = "The mixture develops a sinister glow." mix_sound = 'sound/effects/singlebeat.ogg' -/datum/chemical_reaction/quadruplesec +/datum/chemical_reaction/drink/quadruplesec results = list(/datum/reagent/consumable/ethanol/quadruple_sec = 15) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 5, /datum/reagent/consumable/triple_citrus = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5) mix_message = "The snap of a taser emanates clearly from the mixture as it settles." mix_sound = 'sound/weapons/taser.ogg' -/datum/chemical_reaction/grasshopper +/datum/chemical_reaction/drink/grasshopper results = list(/datum/reagent/consumable/ethanol/grasshopper = 15) required_reagents = list(/datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/creme_de_menthe = 5, /datum/reagent/consumable/ethanol/creme_de_cacao = 5) mix_message = "A vibrant green bubbles forth as the mixture emulsifies." -/datum/chemical_reaction/stinger +/datum/chemical_reaction/drink/stinger results = list(/datum/reagent/consumable/ethanol/stinger = 15) required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 10, /datum/reagent/consumable/ethanol/creme_de_menthe = 5 ) -/datum/chemical_reaction/quintuplesec +/datum/chemical_reaction/drink/quintuplesec results = list(/datum/reagent/consumable/ethanol/quintuple_sec = 15) required_reagents = list(/datum/reagent/consumable/ethanol/quadruple_sec = 5, /datum/reagent/consumable/clownstears = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5) mix_message = "Judgement is upon you." mix_sound = 'sound/items/airhorn2.ogg' -/datum/chemical_reaction/bastion_bourbon +/datum/chemical_reaction/drink/bastion_bourbon results = list(/datum/reagent/consumable/ethanol/bastion_bourbon = 2) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/berryjuice = 1) //herbal and minty, with a hint of citrus and berry mix_message = "You catch an aroma of hot tea and fruits as the mix blends into a blue-green color." -/datum/chemical_reaction/squirt_cider +/datum/chemical_reaction/drink/squirt_cider results = list(/datum/reagent/consumable/ethanol/squirt_cider = 1) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/nutriment = 1) mix_message = "The mix swirls and turns a bright red that reminds you of an apple's skin." -/datum/chemical_reaction/fringe_weaver +/datum/chemical_reaction/drink/fringe_weaver results = list(/datum/reagent/consumable/ethanol/fringe_weaver = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 9, /datum/reagent/consumable/sugar = 1) //9 karmotrine, 1 adelhyde mix_message = "The mix turns a pleasant cream color and foams up." -/datum/chemical_reaction/sugar_rush +/datum/chemical_reaction/drink/sugar_rush results = list(/datum/reagent/consumable/ethanol/sugar_rush = 4) required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/wine = 1) //2 adelhyde (sweet), 1 powdered delta (sour), 1 karmotrine (alcohol) mix_message = "The mixture bubbles and brightens into a girly pink." -/datum/chemical_reaction/crevice_spike +/datum/chemical_reaction/drink/crevice_spike results = list(/datum/reagent/consumable/ethanol/crevice_spike = 6) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/capsaicin = 4) //2 powdered delta (sour), 4 flanergide (spicy) mix_message = "The mixture stings your eyes as it settles." -/datum/chemical_reaction/sake +/datum/chemical_reaction/drink/sake results = list(/datum/reagent/consumable/ethanol/sake = 10) required_reagents = list(/datum/reagent/consumable/rice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) mix_message = "The rice grains ferment into a clear, sweet-smelling liquid." -/datum/chemical_reaction/peppermint_patty +/datum/chemical_reaction/drink/peppermint_patty results = list(/datum/reagent/consumable/ethanol/peppermint_patty = 10) required_reagents = list(/datum/reagent/consumable/hot_coco = 6, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/menthol = 1) mix_message = "The coco turns mint green just as the strong scent hits your nose." -/datum/chemical_reaction/alexander +/datum/chemical_reaction/drink/alexander results = list(/datum/reagent/consumable/ethanol/alexander = 3) required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1) -/datum/chemical_reaction/sidecar +/datum/chemical_reaction/drink/sidecar results = list(/datum/reagent/consumable/ethanol/sidecar = 4) required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 2, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/lemonjuice = 1) -/datum/chemical_reaction/between_the_sheets +/datum/chemical_reaction/drink/between_the_sheets results = list(/datum/reagent/consumable/ethanol/between_the_sheets = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/sidecar = 4) -/datum/chemical_reaction/kamikaze +/datum/chemical_reaction/drink/kamikaze results = list(/datum/reagent/consumable/ethanol/kamikaze = 3) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/limejuice = 1) -/datum/chemical_reaction/mojito +/datum/chemical_reaction/drink/mojito results = list(/datum/reagent/consumable/ethanol/mojito = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/menthol = 1) -/datum/chemical_reaction/fernet_cola +/datum/chemical_reaction/drink/fernet_cola results = list(/datum/reagent/consumable/ethanol/fernet_cola = 2) required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/space_cola = 1) -/datum/chemical_reaction/fanciulli +/datum/chemical_reaction/drink/fanciulli results = list(/datum/reagent/consumable/ethanol/fanciulli = 2) required_reagents = list(/datum/reagent/consumable/ethanol/manhattan = 1, /datum/reagent/consumable/ethanol/fernet = 1) -/datum/chemical_reaction/branca_menta +/datum/chemical_reaction/drink/branca_menta results = list(/datum/reagent/consumable/ethanol/branca_menta = 3) required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/ice = 1) -/datum/chemical_reaction/blank_paper +/datum/chemical_reaction/drink/blank_paper results = list(/datum/reagent/consumable/ethanol/blank_paper = 3) required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1) -/datum/chemical_reaction/wizz_fizz +/datum/chemical_reaction/drink/wizz_fizz results = list(/datum/reagent/consumable/ethanol/wizz_fizz = 3) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/ethanol/champagne = 1) mix_message = "The beverage starts to froth with an almost mystical zeal!" mix_sound = 'sound/effects/bubbles2.ogg' -/datum/chemical_reaction/bug_spray +/datum/chemical_reaction/drink/bug_spray results = list(/datum/reagent/consumable/ethanol/bug_spray = 5) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/lemon_lime = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vodka = 1) mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?" mix_sound = 'sound/creatures/bee.ogg' -/datum/chemical_reaction/jack_rose +/datum/chemical_reaction/drink/jack_rose results = list(/datum/reagent/consumable/ethanol/jack_rose = 4) required_reagents = list(/datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/ethanol/applejack = 2, /datum/reagent/consumable/limejuice = 1) mix_message = "As the grenadine incorporates, the beverage takes on a mellow, red-orange glow." -/datum/chemical_reaction/turbo +/datum/chemical_reaction/drink/turbo results = list(/datum/reagent/consumable/ethanol/turbo = 5) required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1) -/datum/chemical_reaction/old_timer +/datum/chemical_reaction/drink/old_timer results = list(/datum/reagent/consumable/ethanol/old_timer = 6) required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1) -/datum/chemical_reaction/rubberneck +/datum/chemical_reaction/drink/rubberneck results = list(/datum/reagent/consumable/ethanol/rubberneck = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1) -/datum/chemical_reaction/duplex +/datum/chemical_reaction/drink/duplex results = list(/datum/reagent/consumable/ethanol/duplex = 4) required_reagents = list(/datum/reagent/consumable/ethanol/hcider = 2, /datum/reagent/consumable/applejuice = 1, /datum/reagent/consumable/berryjuice = 1) -/datum/chemical_reaction/trappist +/datum/chemical_reaction/drink/trappist results = list(/datum/reagent/consumable/ethanol/trappist = 5) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1) -/datum/chemical_reaction/cream_soda +/datum/chemical_reaction/drink/cream_soda results = list(/datum/reagent/consumable/cream_soda = 4) required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/sodawater = 2, /datum/reagent/consumable/vanilla = 1) -/datum/chemical_reaction/blazaam +/datum/chemical_reaction/drink/blazaam results = list(/datum/reagent/consumable/ethanol/blazaam = 3) required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1) -/datum/chemical_reaction/planet_cracker +/datum/chemical_reaction/drink/planet_cracker results = list(/datum/reagent/consumable/ethanol/planet_cracker = 4) required_reagents = list(/datum/reagent/consumable/ethanol/champagne = 2, /datum/reagent/consumable/ethanol/lizardwine = 2, /datum/reagent/consumable/eggyolk = 1, /datum/reagent/gold = 1) mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited." -/datum/chemical_reaction/red_queen +/datum/chemical_reaction/drink/red_queen results = list(/datum/reagent/consumable/red_queen = 10) required_reagents = list(/datum/reagent/consumable/tea = 6, /datum/reagent/mercury = 2, /datum/reagent/consumable/blackpepper = 1, /datum/reagent/growthserum = 1) -/datum/chemical_reaction/mauna_loa +/datum/chemical_reaction/drink/mauna_loa results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5) required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2) -/datum/chemical_reaction/godfather +/datum/chemical_reaction/drink/godfather results = list(/datum/reagent/consumable/ethanol/godfather = 2) required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/whiskey = 1) -/datum/chemical_reaction/godmother +/datum/chemical_reaction/drink/godmother results = list(/datum/reagent/consumable/ethanol/godmother = 2) required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/vodka = 1) -/datum/chemical_reaction/amaretto_alexander +/datum/chemical_reaction/drink/amaretto_alexander results = list(/datum/reagent/consumable/ethanol/amaretto_alexander = 3) required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1) -/datum/chemical_reaction/ginger_amaretto +/datum/chemical_reaction/drink/ginger_amaretto results = list(/datum/reagent/consumable/ethanol/ginger_amaretto = 4) required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/sol_dry = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/lemonjuice = 1) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 5578172115d..439fbb2f92a 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -9,39 +9,50 @@ //////////////////////////////////////////FOOD MIXTURES//////////////////////////////////// -/datum/chemical_reaction/tofu +/datum/chemical_reaction/food + optimal_temp = 400 + temp_exponent_factor = 1 + optimal_ph_min = 2 + optimal_ph_max = 10 + thermic_constant = 0 + H_ion_release = 0 + +/datum/chemical_reaction/food/tofu required_reagents = list(/datum/reagent/consumable/soymilk = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/tofu/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/tofu(location) return -/datum/chemical_reaction/chocolatepudding +/datum/chemical_reaction/food/chocolatepudding results = list(/datum/reagent/consumable/chocolatepudding = 20) required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 10, /datum/reagent/consumable/eggyolk = 5) -/datum/chemical_reaction/vanillapudding +/datum/chemical_reaction/food/vanillapudding results = list(/datum/reagent/consumable/vanillapudding = 20) required_reagents = list(/datum/reagent/consumable/vanilla = 5, /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/eggyolk = 5) -/datum/chemical_reaction/chocolate_bar +/datum/chemical_reaction/food/chocolate_bar required_reagents = list(/datum/reagent/consumable/soymilk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2) + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/chocolate_bar/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/chocolate_bar/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/chocolatebar(location) return -/datum/chemical_reaction/chocolate_bar2 +/datum/chemical_reaction/food/chocolate_bar2 required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 4, /datum/reagent/consumable/sugar = 2) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/chocolate_bar2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/chocolatebar(location) @@ -50,7 +61,7 @@ /datum/chemical_reaction/chocolate_bar3 required_reagents = list(/datum/reagent/consumable/milk = 2, /datum/reagent/consumable/coco = 2, /datum/reagent/consumable/sugar = 2) -/datum/chemical_reaction/chocolate_bar3/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/chocolate_bar3/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/chocolatebar(location) @@ -60,110 +71,118 @@ results = list(/datum/reagent/consumable/soysauce = 5) required_reagents = list(/datum/reagent/consumable/soymilk = 4, /datum/reagent/toxin/acid = 1) -/datum/chemical_reaction/corn_syrup +/datum/chemical_reaction/food/corn_syrup results = list(/datum/reagent/consumable/corn_syrup = 5) required_reagents = list(/datum/reagent/consumable/corn_starch = 1, /datum/reagent/toxin/acid = 1) required_temp = 374 -/datum/chemical_reaction/caramel +/datum/chemical_reaction/food/caramel results = list(/datum/reagent/consumable/caramel = 1) required_reagents = list(/datum/reagent/consumable/sugar = 1) required_temp = 413.15 + optimal_temp = 600 mob_react = FALSE -/datum/chemical_reaction/caramel_burned +/datum/chemical_reaction/food/caramel_burned results = list(/datum/reagent/carbon = 1) required_reagents = list(/datum/reagent/consumable/caramel = 1) required_temp = 483.15 + optimal_temp = 600 mob_react = FALSE -/datum/chemical_reaction/cheesewheel +/datum/chemical_reaction/food/cheesewheel required_reagents = list(/datum/reagent/consumable/milk = 40) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/cheesewheel/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/cheesewheel/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/cheese/wheel(location) -/datum/chemical_reaction/synthmeat +/datum/chemical_reaction/food/synthmeat required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/medicine/cryoxadone = 1) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/synthmeat/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/synthmeat/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/meat/slab/synthmeat(location) -/datum/chemical_reaction/hot_ramen +/datum/chemical_reaction/food/hot_ramen results = list(/datum/reagent/consumable/hot_ramen = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/consumable/dry_ramen = 3) -/datum/chemical_reaction/hell_ramen +/datum/chemical_reaction/food/hell_ramen results = list(/datum/reagent/consumable/hell_ramen = 6) required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/hot_ramen = 6) -/datum/chemical_reaction/imitationcarpmeat +/datum/chemical_reaction/food/imitationcarpmeat required_reagents = list(/datum/reagent/toxin/carpotoxin = 5) required_container = /obj/item/food/tofu mix_message = "The mixture becomes similar to carp meat." + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/imitationcarpmeat/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/food/imitationcarpmeat/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) new /obj/item/food/fishmeat/carp/imitation(location) if(holder?.my_atom) qdel(holder.my_atom) -/datum/chemical_reaction/dough +/datum/chemical_reaction/food/dough required_reagents = list(/datum/reagent/water = 10, /datum/reagent/consumable/flour = 15) mix_message = "The ingredients form a dough." + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/dough/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/dough/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/dough(location) -/datum/chemical_reaction/cakebatter +/datum/chemical_reaction/food/cakebatter required_reagents = list(/datum/reagent/consumable/eggyolk = 15, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) mix_message = "The ingredients form a cake batter." + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/cakebatter/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/food/cakebatter/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/cakebatter(location) -/datum/chemical_reaction/cakebatter/vegan +/datum/chemical_reaction/food/cakebatter/vegan required_reagents = list(/datum/reagent/consumable/soymilk = 15, /datum/reagent/consumable/flour = 15, /datum/reagent/consumable/sugar = 5) -/datum/chemical_reaction/pancakebatter +/datum/chemical_reaction/food/pancakebatter results = list(/datum/reagent/consumable/pancakebatter = 15) required_reagents = list(/datum/reagent/consumable/eggyolk = 12, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/flour = 5) -/datum/chemical_reaction/ricebowl +/datum/chemical_reaction/food/ricebowl required_reagents = list(/datum/reagent/consumable/rice = 10, /datum/reagent/water = 10) required_container = /obj/item/reagent_containers/glass/bowl mix_message = "The rice absorbs the water." + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/ricebowl/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/food/ricebowl/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) new /obj/item/food/salad/ricebowl(location) if(holder?.my_atom) qdel(holder.my_atom) -/datum/chemical_reaction/nutriconversion +/datum/chemical_reaction/food/nutriconversion results = list(/datum/reagent/consumable/nutriment/peptides = 0.5) required_reagents = list(/datum/reagent/consumable/nutriment/ = 0.5) required_catalysts = list(/datum/reagent/medicine/metafactor = 0.5) -/datum/chemical_reaction/protein_peptide +/datum/chemical_reaction/food/protein_peptide results = list(/datum/reagent/consumable/nutriment/peptides = 0.5) required_reagents = list(/datum/reagent/consumable/nutriment/protein = 0.5) required_catalysts = list(/datum/reagent/medicine/metafactor = 0.5) -/datum/chemical_reaction/bbqsauce +/datum/chemical_reaction/food/bbqsauce results = list(/datum/reagent/consumable/bbqsauce = 5) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1) -/datum/chemical_reaction/gravy +/datum/chemical_reaction/food/gravy results = list(/datum/reagent/consumable/gravy = 3) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/flour = 1) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 0ca731d0b52..e71e93c1cc5 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -27,6 +27,8 @@ glasses = /obj/item/clothing/glasses/science belt = /obj/item/pda/chemist + l_pocket = /obj/item/reagent_containers/glass/bottle/random_buffer + r_pocket = /obj/item/reagent_containers/dropper ears = /obj/item/radio/headset/headset_med uniform = /obj/item/clothing/under/rank/medical/chemist shoes = /obj/item/clothing/shoes/sneakers/white diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 794987e5e04..75cfcfca2eb 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -13,6 +13,11 @@ ///our reagent goal has been reached, so now we lock our inputs and start emptying var/emptying = FALSE + ///towards which temperature do we build (except during draining)? + var/target_temperature = 300 + ///cool/heat power + var/heater_coefficient = 0.05 //same lvl as acclimator + /obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt) . = ..() AddComponent(/datum/component/plumbing/reaction_chamber, bolt) @@ -37,6 +42,11 @@ holder.flags |= NO_REACT return NONE +/obj/machinery/plumbing/reaction_chamber/process(delta_time) + if(!emptying) //suspend heating/cooling during emptying phase + reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * delta_time * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + reagents.handle_reactions() + /obj/machinery/plumbing/reaction_chamber/power_change() . = ..() if(use_power != NO_POWER_USE) @@ -59,6 +69,10 @@ data["reagents"] = text_reagents data["emptying"] = emptying + data["temperature"] = round(reagents.chem_temp, 0.1) + data["ph"] = round(reagents.ph, 0.01) + data["targetTemp"] = target_temperature + data["isReacting"] = reagents.is_reacting return data /obj/machinery/plumbing/reaction_chamber/ui_act(action, params) @@ -77,3 +91,10 @@ var/input_amount = text2num(params["amount"]) if(input_amount) required_reagents[input_reagent] = input_amount + if("temperature") + var/target = params["target"] + if(text2num(target) != null) + target = text2num(target) + . = TRUE + if(.) + target_temperature = clamp(target, 0, 1000) diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm new file mode 100644 index 00000000000..e44ddbc53f0 --- /dev/null +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -0,0 +1,404 @@ +/* +* #/datum/equilibrium +* +* A dynamic reaction object that processes the reaction that it is set within it. Relies on a reagents holder to call and operate the functions. +* +* An object/datum to contain the vars for each of the reactions currently ongoing in a holder/reagents datum +* This way all information is kept within one accessable object +* equilibrium is a unique name as reaction is already too close to chemical_reaction +* This is set up this way to reduce holder.dm bloat as well as reduce confusing list overhead +* The crux of the fermimechanics are handled here +* Instant reactions AREN'T handled here. See holder.dm +*/ +/datum/equilibrium + ///The chemical reaction that is presently being processed + var/datum/chemical_reaction/reaction + ///The location/reagents datum the processing is taking place + var/datum/reagents/holder + ///How much product we can make multiplied by the input recipe's products/required_reagents numerical values + var/multiplier = INFINITY + ///The sum total of each of the product's numerical's values. This is so the addition/deletion is kept at the right values for multiple product reactions + var/product_ratio = 0 + ///The total possible that this reaction can make presently - used for gui outputs + var/target_vol = 0 + ///The target volume the reaction is headed towards. This is updated every tick, so isn't the total value for the reaction, it's just a way to ensure we can't make more than is possible. + var/step_target_vol = INFINITY + ///How much of the reaction has been made so far. Mostly used for subprocs, but it keeps track across the whole reaction and is added to every step. + var/reacted_vol = 0 + ///What our last delta_ph was + var/reaction_quality = 1 + ///If we're done with this reaction so that holder can clear it. + var/to_delete = FALSE + ///Result vars, private - do not edit unless in reaction_step() + ///How much we're adding + var/delta_t + ///How pure our step is + var/delta_ph + ///Modifiers from catalysts, do not use negative numbers. + ///I should write a better handiler for modifying these + ///Speed mod + var/speed_mod = 1 + ///pH mod + var/h_ion_mod = 1 + ///Temp mod + var/thermic_mod = 1 + ///Allow us to deal with lag by "charging" up our reactions to react faster over a period - this means that the reaction doesn't suddenly mass react - which can cause explosions + var/time_deficit + +/* +* Creates and sets up a new equlibrium object +* +* Arguments: +* * input_reaction - the chemical_reaction datum that will be processed +* * input_holder - the reagents datum that the output will be put into +*/ +/datum/equilibrium/New(datum/chemical_reaction/input_reaction, datum/reagents/input_holder) + reaction = input_reaction + holder = input_holder + if(!holder || !reaction) //sanity check + stack_trace("A new [type] was set up, with incorrect/null input vars!") + to_delete = TRUE + return + if(!check_inital_conditions()) //If we're outside of the scope of the reaction vars + to_delete = TRUE + return + if(!length(reaction.results)) //Come back to and revise the affected reactions in the next PR, this is a placeholder fix. + holder.instant_react(reaction) //Even if this check fails, there's a backup - look inside of calculate_yield() + to_delete = TRUE + return + LAZYADD(holder.reaction_list, src) + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] attempts") + + +/datum/equilibrium/Destroy() + if(reacted_vol < target_vol) //We did NOT finish from reagents - so we can restart this reaction given property changes in the beaker. (i.e. if it stops due to low temp, this will allow it to fast restart when heated up again) + LAZYADD(holder.failed_but_capable_reactions, reaction) //Consider replacing check with calculate_yield() + LAZYREMOVE(holder.reaction_list, src) + holder = null + reaction = null + return ..() + +/* +* Check to make sure our input vars are sensible - truncated version of check_reagent_properties() +* +* (as the setup in holder.dm checks for that already - this is a way to reduce calculations on New()) +* Don't call this unless you know what you're doing, this is an internal proc +*/ +/datum/equilibrium/proc/check_inital_conditions() + //Make sure we have the right multipler for on_reaction() + for(var/single_reagent in reaction.required_reagents) + multiplier = min(multiplier, round((holder.get_reagent_amount(single_reagent) / reaction.required_reagents[single_reagent]), CHEMICAL_QUANTISATION_LEVEL)) + if(multiplier == INFINITY) + return FALSE + //Consider purity gating too? - probably not, purity is hard to determine + //To prevent reactions outside of the pH window from starting. + if(!((holder.ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (holder.ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) + return FALSE + return TRUE + +/* +* Check to make sure our input vars are sensible - is the holder overheated? does it have the required reagents? Does it have the required calalysts? +* +* If you're adding more checks for reactions, this is the proc to edit +* otherwise, generally, don't call this directed except internally +*/ +/datum/equilibrium/proc/check_reagent_properties() + //Have we exploded from on_reaction? + if(!holder.my_atom || holder.reagent_list.len == 0) + return FALSE + if(!holder) + stack_trace("an equilibrium is missing it's holder.") + return FALSE + if(!reaction) + stack_trace("an equilibrium is missing it's reaction.") + return FALSE + + //set up catalyst checks + var/total_matching_catalysts = 0 + //Reagents check should be handled in the calculate_yield() from multiplier + + //If the product/reactants are too impure + for(var/r in holder.reagent_list) + var/datum/reagent/reagent = r + //this is done this way to reduce processing compared to holder.has_reagent(P) + for(var/c in reaction.required_catalysts) + var/datum/reagent/catalyst = c + if(catalyst == reagent.type) + total_matching_catalysts++ + if(istype(reagent, /datum/reagent/catalyst_agent)) + var/datum/reagent/catalyst_agent/catalyst_agent = reagent + if(reagent.volume >= catalyst_agent.min_volume) + catalyst_agent.consider_catalyst(src) + + if(!(total_matching_catalysts == reaction.required_catalysts.len)) + return FALSE + + //All good! + return TRUE + +/* +* Calculates how much we're aiming to create +* +* Specifically calcuates multiplier, product_ratio, step_target_vol +* Also checks to see if these numbers are sane, returns a TRUE/FALSE +* Generally an internal proc +*/ +/datum/equilibrium/proc/calculate_yield() + if(!reaction) + stack_trace("Tried to calculate an equlibrium for reaction [reaction.type], but there was no reaction set for the datum") + return FALSE + + multiplier = INFINITY + for(var/reagent in reaction.required_reagents) + multiplier = min(multiplier, round((holder.get_reagent_amount(reagent) / reaction.required_reagents[reagent]), CHEMICAL_QUANTISATION_LEVEL)) + + if(!length(reaction.results)) //Incase of no reagent product + product_ratio = 1 + step_target_vol = INFINITY + for(var/reagent in reaction.required_reagents) + step_target_vol = min(step_target_vol, multiplier * reaction.required_reagents[reagent]) + if(step_target_vol == 0 || multiplier == 0) + return FALSE + //Sanity Check + if(step_target_vol == INFINITY || multiplier == INFINITY) //I don't see how this can happen, but I'm not bold enough to let infinities roll around for free + to_delete = TRUE + CRASH("Tried to calculate target vol for [reaction.type] with no products, but could not find required reagents for the reaction. If it got here, something is really broken with the recipe.") + return TRUE + + product_ratio = 0 + step_target_vol = 0 + var/true_reacted_vol //Because volumes can be lost mid reactions + for(var/product in reaction.results) + step_target_vol += (reaction.results[product]*multiplier) + product_ratio += reaction.results[product] + true_reacted_vol += holder.get_reagent_amount(product) + if(step_target_vol == 0 || multiplier == INFINITY) + return FALSE + target_vol = step_target_vol + true_reacted_vol + reacted_vol = true_reacted_vol + return TRUE + +/* +* Deals with lag - allows a reaction to speed up to 3x from delta_time +* "Charged" time (time_deficit) discharges by incrementing reactions by doubling them +* If delta_time is greater than 1.5, then we save the extra time for the next ticks +* +* Arguments: +* * delta_time - the time between the last proc in world.time +*/ +/datum/equilibrium/proc/deal_with_time(delta_time) + if(delta_time > 1) + time_deficit += delta_time - 1 + delta_time = 1 //Lets make sure reactions aren't super speedy and blow people up from a big lag spike + else if (time_deficit) + if(time_deficit < 0.25) + delta_time += time_deficit + time_deficit = 0 + else + delta_time += 0.25 + time_deficit = 0.25 + return delta_time + +/* +* Main method of checking for explosive - or failed states +* Checks overheated() and overly_impure() of a reaction +* This was moved from the start, to the end - after a reaction, so post reaction temperature changes aren't ignored. +* overheated() is first - so double explosions can't happen (i.e. explosions that blow up the holder) +*/ +/datum/equilibrium/proc/check_fail_states() + //Are we overheated? + if(reaction.is_cold_recipe) + if(holder.chem_temp < reaction.overheat_temp) //This is before the process - this is here so that overly_impure and overheated() share the same code location (and therefore vars) for calls. + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps") + reaction.overheated(holder, src) + else + if(holder.chem_temp > reaction.overheat_temp) + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps") + reaction.overheated(holder, src) + + //is our product too impure? + for(var/product in reaction.results) + var/datum/reagent/reagent = holder.has_reagent(product) + if(!reagent) //might be missing from overheat exploding + continue + if (reagent.purity < reaction.purity_min)//If purity is below the min, call the proc + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overly impure reaction steps") + reaction.overly_impure(holder, src) + + //did we explode? + if(!holder.my_atom || holder.reagent_list.len == 0) + return FALSE + return TRUE + +/* +* Main reaction processor - Increments the reaction by a timestep +* +* First checks the holder to make sure it can continue +* Then calculates the purity and volume produced.TRUE +* Then adds/removes reagents +* Then alters the holder pH and temperature, and calls reaction_step +* Arguments: +* * delta_time - the time displacement between the last call and the current, 1 is a standard step +* * purity_modifier - how much to modify the step's purity by (0 - 1) +*/ +/datum/equilibrium/proc/react_timestep(delta_time, purity_modifier = 1) + if(to_delete) + //This occurs when it explodes + return FALSE + if(!check_reagent_properties()) //this is first because it'll call explosions first + to_delete = TRUE + return + if(!calculate_yield())//So that this can detect if we're missing reagents + to_delete = TRUE + return + delta_time = deal_with_time(delta_time) + + delta_t = 0 //how far off optimal temp we care + delta_ph = 0 //How far off the pH we are + var/cached_ph = holder.ph + var/cached_temp = holder.chem_temp + var/purity = 1 //purity of the current step + + //Begin checks + //Calculate DeltapH (Deviation of pH from optimal) + //Within mid range + if (cached_ph >= reaction.optimal_ph_min && cached_ph <= reaction.optimal_ph_max) + delta_ph = 1 //100% purity for this step + //Lower range + else if (cached_ph < reaction.optimal_ph_min) //If we're outside of the optimal lower bound + if (cached_ph < (reaction.optimal_ph_min - reaction.determin_ph_range)) //If we're outside of the deterministic bound + delta_ph = 0 //0% purity + else //We're in the deterministic phase + delta_ph = (((cached_ph - (reaction.optimal_ph_min - reaction.determin_ph_range))**reaction.ph_exponent_factor)/((reaction.determin_ph_range**reaction.ph_exponent_factor))) //main pH calculation + //Upper range + else if (cached_ph > reaction.optimal_ph_max) //If we're above of the optimal lower bound + if (cached_ph > (reaction.optimal_ph_max + reaction.determin_ph_range)) //If we're outside of the deterministic bound + delta_ph = 0 //0% purity + else //We're in the deterministic phase + delta_ph = (((- cached_ph + (reaction.optimal_ph_max + reaction.determin_ph_range))**reaction.ph_exponent_factor)/(reaction.determin_ph_range**reaction.ph_exponent_factor))//Reverse - to + to prevent math operation failures. + + //This should never proc, but it's a catch incase someone puts in incorrect values + else + stack_trace("[holder.my_atom] attempted to determine FermiChem pH for '[reaction.type]' which had an invalid pH of [cached_ph] for set recipie pH vars. It's likely the recipe vars are wrong.") + + //Calculate DeltaT (Deviation of T from optimal) + if(!reaction.is_cold_recipe) + if (cached_temp < reaction.optimal_temp && cached_temp >= reaction.required_temp) + delta_t = (((cached_temp - reaction.required_temp)**reaction.temp_exponent_factor)/((reaction.optimal_temp - reaction.required_temp)**reaction.temp_exponent_factor)) + else if (cached_temp >= reaction.optimal_temp) + delta_t = 1 + else //too hot + delta_t = 0 + to_delete = TRUE + return + else + if (cached_temp > reaction.optimal_temp && cached_temp <= reaction.required_temp) + delta_t = (((cached_temp - reaction.required_temp)**reaction.temp_exponent_factor)/((reaction.optimal_temp - reaction.required_temp)**reaction.temp_exponent_factor)) + else if (cached_temp <= reaction.optimal_temp) + delta_t = 1 + else //Too cold + delta_t = 0 + to_delete = TRUE + return + + //Call any special reaction steps BEFORE addition + if(reaction.reaction_step(src, holder, delta_t, delta_ph, step_target_vol) == END_REACTION) + to_delete = TRUE + return + + //Catalyst modifier + delta_t *= speed_mod + + purity = delta_ph//set purity equal to pH offset + + //Then adjust purity of result with beaker reagent purity. + purity *= reactant_purity(reaction) + + //Then adjust it from the input modifier + purity *= purity_modifier + + //Now we calculate how much to add - this is normalised to the rate up limiter + var/delta_chem_factor = (reaction.rate_up_lim*delta_t)*delta_time//add/remove factor + var/total_step_added = 0 + //keep limited + if(delta_chem_factor > step_target_vol) + delta_chem_factor = step_target_vol + else if (delta_chem_factor < CHEMICAL_VOLUME_MINIMUM) + delta_chem_factor = CHEMICAL_VOLUME_MINIMUM + //Normalise to multiproducts + delta_chem_factor /= product_ratio + //delta_chem_factor = round(delta_chem_factor, CHEMICAL_QUANTISATION_LEVEL) // Might not be needed - left here incase testmerge shows that it does. Remove before full commit. + + //Calculate how much product to make and how much reactant to remove factors.. + for(var/reagent in reaction.required_reagents) + holder.remove_reagent(reagent, (delta_chem_factor * reaction.required_reagents[reagent]), safety = TRUE) + //Apply pH changes + holder.adjust_specific_reagent_ph(reagent, (delta_chem_factor * reaction.required_reagents[reagent])*(reaction.H_ion_release*h_ion_mod)) + + var/step_add + for(var/product in reaction.results) + //create the products + step_add = delta_chem_factor * reaction.results[product] + holder.add_reagent(product, step_add, null, cached_temp, purity, override_base_ph = TRUE) + //Apply pH changes + holder.adjust_specific_reagent_ph(product, step_add*reaction.H_ion_release) + reacted_vol += step_add + total_step_added += step_add + + #ifdef REAGENTS_TESTING //Kept in so that people who want to write fermireactions can contact me with this log so I can help them + if(GLOB.Debug2) //I want my spans for my sanity + message_admins("Reaction step active for:[reaction.type]") + message_admins("|Reaction conditions| Temp: [holder.chem_temp], pH: [holder.ph], reactions: [length(holder.reaction_list)], awaiting reactions: [length(holder.failed_but_capable_reactions)], no. reagents:[length(holder.reagent_list)], no. prev reagents: [length(holder.previous_reagent_list)]") + message_admins("Reaction vars: PreReacted:[reacted_vol] of [step_target_vol] of total [target_vol]. delta_t [delta_t], multiplier [multiplier], delta_chem_factor [delta_chem_factor] Pfactor [product_ratio], purity of [purity] from a delta_ph of [delta_ph]. DeltaTime: [delta_time]") + #endif + + //Apply thermal output of reaction to beaker + if(reaction.reaction_flags & REACTION_HEAT_ARBITARY) + holder.chem_temp += (reaction.thermic_constant* total_step_added*thermic_mod) //old method - for every bit added, the whole temperature is adjusted + else //Standard mechanics + var/heat_energy = reaction.thermic_constant * total_step_added * thermic_mod * SPECIFIC_HEAT_DEFAULT + holder.adjust_thermal_energy(heat_energy, 0, 10000) //heat is relative to the beaker conditions + + //Give a chance of sounds + if(prob(5)) + holder.my_atom.audible_message("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [reaction.mix_message]") + if(reaction.mix_sound) + playsound(get_turf(holder.my_atom), reaction.mix_sound, 80, TRUE) + + //Used for UI output + reaction_quality = purity + + //post reaction checks + if(!(check_fail_states())) + to_delete = TRUE + + //end reactions faster so plumbing is faster + if((step_add >= step_target_vol) && (length(holder.reaction_list == 1)))//length is so that plumbing is faster - but it doesn't disable competitive reactions. Basically, competitive reactions will likely reach their step target at the start, so this will disable that. We want to avoid that. But equally, we do want to full stop a holder from reacting asap so plumbing isn't waiting an tick to resolve. + to_delete = TRUE + + holder.update_total()//do NOT recalculate reactions + + +/* +* Calculates the total sum normalised purity of ALL reagents in a holder +* +* Currently calculates it irrespective of required reagents at the start, but this should be changed if this is powergamed to required reagents +* It's not currently because overly_impure affects all reagents +*/ +/datum/equilibrium/proc/reactant_purity(datum/chemical_reaction/C) + var/list/cached_reagents = holder.reagent_list + var/i = 0 + var/cached_purity + for(var/datum/reagent/reagent as anything in holder.reagent_list) + if (reagent in cached_reagents) + cached_purity += reagent.purity + i++ + if(!i)//I've never seen it get here with 0, but in case - it gets here when it blows up from overheat + stack_trace("No reactants found mid reaction for [C.type]. Beaker: [holder.my_atom]") + return 0 //we exploded and cleared reagents - but lets not kill the process + return cached_purity/i + +///Panic stop a reaction - cleanup should be handled by the next timestep +/datum/equilibrium/proc/force_clear_reactive_agents() + for(var/reagent in reaction.required_reagents) + holder.remove_reagent(reagent, (multiplier * reaction.required_reagents[reagent]), safety = 1) diff --git a/code/modules/reagents/chemistry/fermi_readme.md b/code/modules/reagents/chemistry/fermi_readme.md new file mode 100644 index 00000000000..ebb930e486f --- /dev/null +++ b/code/modules/reagents/chemistry/fermi_readme.md @@ -0,0 +1,212 @@ +# How to make fermi reactions from a code perspective + +## How purity works + +Purity by default only splits on a mob’s consumption unless reaction_flags in the recipe is set to one of the CLEAR_CONVERT defines. Here is a bad flowchart for the on mob process. + +I am not good at flowcharts sorry. + +![image](https://user-images.githubusercontent.com/33956696/103941231-78123b80-5126-11eb-9d89-635a6b810454.png) + +Essentially +For purity: +If 1: normal +If above inverse_chem_val: normal + impure +If below: inverse + +# How reactions mechanics work + +For the effects starting/during/at the end of a reaction see below: + +![image](https://user-images.githubusercontent.com/33956696/103941281-88c2b180-5126-11eb-8740-207dc9bb830d.png) + +Maybe this makes no sense. + +In brief: + +Holder.dm now sets up reactions, while equilibrium.dm runs them. Holder itself is processed when there is a list of reactions, but the equilibrium does the calculating. In essence, it holds onto a list of objects to run. Handle_reactions() is used to update the reaction list, with a few checks at the start to prevent any unnecessary updates. + +#### When a reaction is detected: +- If it’s REACTION_INSTANT then it’ll use a method similar to the old mechanics. +- If not then it’ll set up an equilibrium, which checks to see if the reaction is valid on creation. +- If it’s valid, then on_reaction is called. +- If the reaction’s temperature is over the overheat_temp overheated() is called +- When equilibriums detect they’re invalid, they flag for deletion and holder.dm deletes them. +- If there’s a list of reactions, then the holder starts processing. + +#### When holder is processing: +- Each equilibrium is processed, and it handles it’s own reaction. For each step it handles every reaction. +- At the start, the equilibrium checks it’s conditions and calculates how much it can make in this step. +- It checks the temp, reagents and catalyst. +- If it’s overheated, call overheated() +- If it’s too impure call overly_impure() +- The offset of optimal pH and temp is calculated, and these correlate with purity and yield. + +#### How a holder stops reacting: +When one of the checks fails in the equilibrium object, it is flagged for deletion. The holder will detect this and call reaction_finish() and delete the equilibrium object – ending that reaction. + +## Recipe and processing mechanics + +Lets go over the reaction vars below. These can be edited and set on a per chemical_reaction basis +```dm +/datum/chemical_reaction + ... + var/required_temp = 100 + var/optimal_temp = 500 // Upper end for above + var/overheat_temp = 900 // Temperature at which reaction explodes - If any reaction is this hot, it procs overheated() + var/optimal_ph_min = 5 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + var/optimal_ph_max = 9 // Higest value for above + var/determin_ph_range = 4 // How far out pH wil react, giving impurity place (Exponential phase) + var/temp_exponent_factor = 2 // How sharp the temperature exponential curve is (to the power of value) + var/ph_exponent_factor = 1 // How sharp the pH exponential curve is (to the power of value) + var/thermic_constant = 1 // Temperature change per 1u produced + var/H_ion_release = 0.01 // pH change per 1u reaction + var/rate_up_lim = 20 // Optimal/max rate possible if all conditions are perfect + var/purity_min = 0.15 // If purity is below 0.15, it calls OverlyImpure() too. Set to 0 to disable this. + var/reaction_flags // bitflags for clear conversions; REACTION_CLEAR_IMPURE, REACTION_CLEAR_INVERSE, REACTION_CLEAR_RETAIN, REACTION_INSTANT +``` + +### How temperature ranges are set and how reaction rate is determined + +Reaction rates are determined by the current temperature of the reagents holder. There are a few variables related to this: + +```dm +/datum/chemical_reaction + var/required_temp = 100 + var/optimal_temp = 500 // Upper end for above + var/overheat_temp = 900 // Temperature at which reaction explodes - If any reaction is this hot, it procs overheated() + var/temp_exponent_factor = 2 // How sharp the temperature exponential curve is (to the power of value) + var/rate_up_lim = 20 // Optimal/max rate possible if all conditions are perfect +``` + +The amount added is based off the recipies’ required_temp, optimal_temp, overheat_temp and temp_exponent_factor. See below: +![image](https://user-images.githubusercontent.com/33956696/104081088-5e571e00-5224-11eb-8834-87aa36b3e45f.png) + +the y axis is the normalised value of growth, which is then muliplied by the rate_up_lim. You can see that temperatures below the required_temp produce no result (the reaction doesn't start, or if it is reacting, the reaction will stop). Between the required and optimal is a region that is defined by the temp_exponent_factor, so in this case the value is ^2, so we see exponential growth. Between the optimal_temp and the overheat_temp is the optimal phase - where the rate factor is 1. After that it continues to react, but will call overheated() per timestep. Presently the default for overheated() is to reduce the yield of the product (i.e. it's faster but you get less). The rate_up_lim is the maximum rate the reaction can go at optimal temperatures, so in this case a rate factor of 1 i.e. a temperature between 500+ will produce 10u, or a temperature of 400 will roughly produce 4u per step (independant of product ratio produced, if you put 10, it will only create 10 maximum regardless of how much product is defined in the results list). + +### How pH ranges are set and what pH mechanics do + +Optimal pH ranges are set on a per recipe basis - though at the moment all recipes use a default recipe, so they all have the same window (except for the buffers). Hopefully either as a community effort/or in future PRs we can create unique profiles for the present reactions in the game. + +As for how you define the reaction variables for a reaction, there are a few new variables for the chemical_recipe datum. I'll go over specifically how pH works for the default reaction. +```dm +/datum/chemical_reaction + ... + var/optimal_ph_min = 5 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + var/optimal_ph_max = 9 // Higest value for above + var/determin_ph_range = 4 // How far out pH wil react, giving impurity place (Exponential phase) + var/ph_exponent_factor = 1 // How sharp the pH exponential curve is (to the power of value) + var/purity_min = 0.15 // If purity is below 0.15, it calls overly_impure(). In addition, if the product's purity is below this value at the end, the product will be 100% converted into the reagent's failed_chem. Set to 0 to disable this. +``` + +For this default reaction, the curve looks like this: +![image](https://user-images.githubusercontent.com/33956696/104081030-0fa98400-5224-11eb-822e-ffc614799ddc.png) + +The y axis is the purity of the product made for that time step. This is recalculated based off the beaker's sum pH for every tick in the reaction. The rate in which your product is made based off the temperature (If you want me to describe that too I can.) So say our reaction has 10u of a purity 1 of product in there, and for our step we're making another 10u with our pH at (roughly) 3, from the curve our purity is (roughly) 0.5. So we will be adding 10u of 0.5 purity to 10u of 1 purity, resulting in 20u of 0.75 purity product. (Though - to note the reactant's purities also modify the purity of volume created on top of this). + +If you're designing a reaction you can define an optimal range between the OptimalpHMin to OptimalpHMax (5 - 7 in this case) and a deterministic region set by the ReactpHLim (5 - 4, 9 + 4 aka between 1 to 5 and 9 to 13). This deterministic region is exponential, so if you set it to 2 then it’ll exponentially grow, but since our CurveSharpph = 1, it’s linear (basically normalise the range in the determinsitic region, then put that to the power of CurveSharppH). Finally values outside of these ranges will prevent reactions from starting, but if a reaction drifts out during a reaction, the purity of volume created for each step will be 0 (It does not stop ongoing reactions). It’s entirely possible to design a reaction without a deterministic or optimal phase if you wanted. + +Though to note; if your purity dips below the PurityMin of a reaction it’ll call the overly_impure() function – which by default reduces the purity of all reagents in the beaker. Additionally, if the purity at the end of a reaction is below the PurityMin, it’ll convert into the failed chem defined by the product’s failed_chem defined in it's reagent datum. For default the PurityMin is 0.15, and is pretty difficult to fail. This is all customisable however, if you wanted to use these hooks to design a even more unique reaction, just don’t call the parent proc when using methods. + + +### Conditional changes in reagents datum per timestep + +```dm +/datum/chemical_reaction + ... + var/thermic_constant = 1 // Temperature change per 1u produced + var/H_ion_release = 0.01 // pH change per 1u reaction +``` + +The thermic_constant is how much the temperature changes per u created, so for 10u created the temperature will increase by 10K. The H_ion_release is how much the pH changes per u created, for 10u created the pH will increase by 0.1. During a reaction this is the only factor in pH changes - presently the addition/removal of reagents tie to the reaction won't affect this, though other reactions ongoing in the beaker will also affect pH, as well as the removal/addition of reagents outside of the reaction. + +### Reaction flags + +Reaction_flags can be used to set these defines: + +```dm +#define REACTION_CLEAR_IMPURE //Convert into impure/pure on reaction completion in the datum/reagents holder instead of on consumption +#define REACTION_CLEAR_INVERSE //Convert into inverse on reaction completion when purity is low enough in the datum/reagents holder instead of on consumption +#define REACTION_CLEAR_RETAIN //Clear converted chems retain their purities/inverted purities. Requires 1 or both of the above. This is so that it can split again after splitting from a reaction (i.e. if your impure_chem or inverse_chem has it's own impure_chem/inverse_chem and you want it to split again on consumption). +#define REACTION_INSTANT //Used to create instant reactions + +/datum/chemical_reaction + var/reaction_flags +``` + +For REACTION_CLEAR – this causes the purity mechanics to resolve in the beaker at the end of the reaction, instead of when added to a mob. + +#### A note on cold recipies + +Is_cold_recipie requires you to set your overheat_temp and optimal_temp descend instead. +Eg: +```dm +/datum/chemical_reaction + ... + var/required_temp = 300 + var/optimal_temp = 200 + var/overheat_temp = 50 +``` + +# Reagents +The new vars that are introduced are below: +```dm +/datum/reagent + /// pH of the reagent + var/ph = 7 + ///Purity of the reagent + var/purity = 1 + ///the purity of the reagent on creation (i.e. when it's added to a mob and it's purity split it into 2 chems; the purity of the resultant chems are kept as 1, this tracks what the purity was before that) + var/creation_purity = 1 + //impure chem values (see fermi_readme.dm for more details): + var/impure_chem = /datum/reagent/impurity // What chemical path is made when metabolised as a function of purity + var/inverse_chem_val = 0.2 // If the impurity is below 0.5, replace ALL of the chem with inverse_chem upon metabolising + var/inverse_chem = /datum/reagent/impurity/toxic // What chem is metabolised when purity is below inverse_chem_val + var/failed_chem = /datum/reagent/consumable/failed_reaction //what chem is made at the end of a reaction IF the purity is below the recipies purity_min + var/chemical_flags +``` + +- `pH` is the innate pH of the reagent and is used to calculate the pH of a reagents datum on addition/removal. This does not change and is a reference value. The reagents datum pH changes. +- `purity` is the INTERNAL value for splitting. This is set to 1 after splitting so that it doesn't infinite split +- `creation_purity` is the purity of the reagent on creation. This won't change. If you want to write code that checks the purity in any of the methods, use this. +- `impure_chem` is the datum type that is created provided that it's `creation_purity` is above the `inverse_chem_val`. When the reagent is consumed it will split into this OR if the associated `datum/chemical_recipe` has a REACTION_CLEAR_IMPURE flag it will split at the end of the reaction in the `datum/reagents` holder +- `inverse_chem_val` if a reagent's purity is below this value it will 100% convert into `inverse_chem`. If above it will split into `impure_chem`. See the note on purity effects above +- `inverse_chem` is the datum type that is created provided that it's `creation_purity` is below the `inverse_chem_val`. When the reagent is consumed it will 100% convert into this OR if the associated `datum/chemical_recipe` has a REACTION_CLEAR_INVERSE flag it will 100% convert at the end of the reaction in the `datum/reagents` holder +- `failed_chem` is the chem that the product is 100% converted into if the purity is below the associated `datum/chemical_recipies`' `PurityMin` AT THE END OF A REACTION. + +When writing any reagent code ALWAYS use creation_purity. Purity is kept for internal mechanics only and won’t reflect the purity on creation. + +See above for purity mechanics, but this is where you set the reagents that are created. If you’re making an impure reagent I recommend looking at impure_reagents.dm to see how they’re set up and consider using the `datum/reagents/impure` as a parent. + +The flags you can set for `var/chemical_flags` are: +```dm +#define REAGENT_DEAD_PROCESS (1<<0) //allows on_mob_dead() if present in a dead body +#define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing - ignores all purity effects +#define REAGENT_INVISIBLE (1<<2) //Doesn't appear on handheld health analyzers. +#define REAGENT_SNEAKYNAME (1<<3) //When inverted, the inverted chem uses the name of the original chem +#define REAGENT_SPLITRETAINVOL (1<<4) //Retains initial volume of chem when splitting for purity effects + +/datum/reagent + var/chemical_flags +``` + +While you might think reagent_flags is a more sensible name - it is already used for beakers. Hopefully this doesn't trip anyone up. + +# Relivant vars from the holder.dm / reagents datum + +There are a few variables that are useful to know about +```dm +/datum/reagents + /// Current temp of the holder volume + var/chem_temp = 150 + ///pH of the whole system + var/ph = CHEMICAL_NORMAL_PH //aka 7 + ///cached list of reagents + var/list/datum/reagent/previous_reagent_list = new/list() + ///Hard check to see if the reagents is presently reacting + var/is_reacting = FALSE +``` +- chem_temp is the temperature used in the `datum/chemical_recipe` +- pH is a result of the sum of all reagents, as well as any changes from buffers and reactions. This is the pH used in `datum/chemical_recipe`. +- isReacting is a bool that can be used outside to ensure that you don't touch a reagents that is reacting. +- previous_reagent_list is a list of the previous reagents (just the typepaths, not the objects) that was present on the last handle_reactions() method. This is to prevent pointless method calls. \ No newline at end of file diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8bd22bb8864..7ceda895f50 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1,6 +1,4 @@ -#define CHEMICAL_QUANTISATION_LEVEL 0.0001 //stops floating point errors causing issues with checking reagent amounts - - +/////////////These are used in the reagents subsystem init() and the reagent_id_typos.dm//////// /proc/build_chemical_reagent_list() //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -44,7 +42,7 @@ GLOB.chemical_reactions_list[id] += D break // Don't bother adding ourselves to other reagent ids, it is redundant -/////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////Main reagents code///////////////////////////////////////////// /// Holder for a bunch of [/datum/reagent] /datum/reagents @@ -58,6 +56,8 @@ var/atom/my_atom = null /// Current temp of the holder volume var/chem_temp = 150 + ///pH of the whole system + var/ph = CHEMICAL_NORMAL_PH /// unused var/last_tick = 1 /// see [/datum/reagents/proc/metabolize] for usage @@ -66,30 +66,34 @@ var/list/datum/reagent/addiction_list /// various flags, see code\__DEFINES\reagents.dm var/flags + ///list of reactions currently on going, this is a lazylist for optimisation + var/list/datum/equilibrium/reaction_list + ///cached list of reagents typepaths (not object references), this is a lazylist for optimisation + var/list/datum/reagent/previous_reagent_list + ///If a reaction fails due to temperature or pH, this tracks the required temperature or pH for it to be enabled. + var/list/failed_but_capable_reactions + ///Hard check to see if the reagents is presently reacting + var/is_reacting = FALSE /datum/reagents/New(maximum=100, new_flags=0) maximum_volume = maximum - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!GLOB.chemical_reagents_list) - build_chemical_reagent_list() - if(!GLOB.chemical_reactions_list) - build_chemical_reactions_list() - flags = new_flags /datum/reagents/Destroy() - . = ..() //We're about to delete all reagents, so lets cleanup addiction_list = null for(var/reagent in reagent_list) var/datum/reagent/R = reagent qdel(R) reagent_list = null + if(is_reacting) //If false, reaction list should be cleaned up + force_stop_reacting() + QDEL_LAZYLIST(reaction_list) + previous_reagent_list = null if(my_atom && my_atom.reagents == src) my_atom.reagents = null my_atom = null - + return ..() /** * Adds a reagent to this holder @@ -100,19 +104,29 @@ * * list/data - Any reagent data for this reagent, used for transferring data with reagents * * reagtemp - Temperature of this reagent, will be equalized * * no_react - prevents reactions being triggered by this addition + * * added_purity - override to force a purity when added + * * added_ph - override to force a pH when added + * * override_base_ph - ingore the present pH of the reagent, and instead use the default (i.e. if buffers/reactions alter it) */ -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, added_purity = null, added_ph, no_react = 0, override_base_ph = FALSE) if(!isnum(amount) || !amount) return FALSE - if(amount <= 0) + if(amount <= CHEMICAL_QUANTISATION_LEVEL)//To prevent small amount problems. return FALSE var/datum/reagent/glob_reagent = GLOB.chemical_reagents_list[reagent] if(!glob_reagent) - WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") + stack_trace("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE + var/datum/reagent/D = GLOB.chemical_reagents_list[reagent] + if(isnull(added_purity)) //Because purity additions can be 0 + added_purity = D.creation_purity //Usually 1 + + if(!added_ph) + added_ph = D.ph + update_total() var/cached_total = total_volume if(cached_total + amount > maximum_volume) @@ -134,7 +148,12 @@ for(var/r in cached_reagents) var/datum/reagent/iter_reagent = r if (iter_reagent.type == reagent) - iter_reagent.volume += amount + if(override_base_ph) + added_ph = iter_reagent.ph + iter_reagent.purity = ((iter_reagent.creation_purity * iter_reagent.volume) + (added_purity * amount)) /(iter_reagent.volume + amount) //This should add the purity to the product + iter_reagent.creation_purity = iter_reagent.purity + iter_reagent.ph = ((iter_reagent.ph*(iter_reagent.volume))+(added_ph*amount))/(iter_reagent.volume+amount) + iter_reagent.volume += round(amount, CHEMICAL_QUANTISATION_LEVEL) update_total() iter_reagent.on_merge(data, amount) @@ -146,7 +165,7 @@ set_temperature(reagtemp) SEND_SIGNAL(src, COMSIG_REAGENTS_ADD_REAGENT, iter_reagent, amount, reagtemp, data, no_react) - if(!no_react) + if(!no_react && !is_reacting) //To reduce the amount of calculations for a reaction the reaction list is only updated on a reagents addition. handle_reactions() return TRUE @@ -155,12 +174,15 @@ cached_reagents += new_reagent new_reagent.holder = src new_reagent.volume = amount + new_reagent.purity = added_purity + new_reagent.creation_purity = added_purity + new_reagent.ph = added_ph if(data) new_reagent.data = data new_reagent.on_new(data) if(isliving(my_atom)) - new_reagent.on_mob_add(my_atom) //Must occur before it could posibly run on_mob_delete + new_reagent.on_mob_add(my_atom, amount) //Must occur before it could posibly run on_mob_delete update_total() if(reagtemp != cached_temp) @@ -183,7 +205,7 @@ /// Remove a specific reagent -/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to +/datum/reagents/proc/remove_reagent(reagent, amount, safety = TRUE)//Added a safety check for the trans_id_to if(isnull(amount)) amount = 0 CRASH("null amount passed to reagent code") @@ -203,12 +225,11 @@ amount = clamp(amount, 0, R.volume) R.volume -= amount update_total() - SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(R) ? reagent : R, amount) if(!safety)//So it does not handle reactions when it need not to handle_reactions() + SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(R) ? reagent : R, amount) return TRUE - return FALSE /// Remove an amount of reagents without caring about what they are @@ -250,7 +271,7 @@ var/datum/reagent/R = reagent remove_reagent(R.type, R.volume * part) - update_total() + //finish_reacting() //A just in case - update total is in here - should be unneeded, make sure to test this handle_reactions() return amount @@ -293,11 +314,19 @@ //Clear from relevant lists LAZYREMOVE(addiction_list, R) reagent_list -= R + LAZYREMOVE(previous_reagent_list, R.type) qdel(R) update_total() SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, reagent) return TRUE +//Converts the creation_purity to purity +/datum/reagents/proc/uncache_creation_purity(id) + var/datum/reagent/R = has_reagent(id) + if(!R) + return + R.purity = R.creation_purity + /// Remove every reagent except this one /datum/reagents/proc/isolate_reagent(reagent) var/list/cached_reagents = reagent_list @@ -362,6 +391,7 @@ if(amount < 0) return + var/cached_amount = amount var/atom/target_atom var/datum/reagents/R if(istype(target, /datum/reagents)) @@ -382,6 +412,10 @@ R = target.reagents target_atom = target + //Set up new reagents to inherit the old ongoing reactions + if(!no_react) + transfer_reactions(R) + amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume) var/trans_data = null var/transfer_log = list() @@ -394,7 +428,9 @@ var/transfer_amount = T.volume * part if(preserve_data) trans_data = copy_data(T) - R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered. + if(T.intercept_reagents_transfer(R, cached_amount))//Use input amount instead. + continue + R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, T.purity, T.ph, no_react = TRUE) //we only handle reaction after every reagent has been transfered. if(methods) if(istype(target_atom, /obj/item/organ)) R.expose_single(T, target, methods, part, show_message) @@ -403,6 +439,8 @@ T.on_transfer(target_atom, methods, transfer_amount * multiplier) remove_reagent(T.type, transfer_amount) transfer_log[T.type] = transfer_amount + if(is_type_in_list(target_atom, list(/mob/living/carbon, /obj/item/organ/stomach))) + R.process_mob_reagent_purity(T.type, transfer_amount * multiplier, T.purity) else var/to_transfer = amount for(var/reagent in cached_reagents) @@ -416,7 +454,9 @@ var/transfer_amount = amount if(amount > T.volume) transfer_amount = T.volume - R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, no_react = 1) + if(T.intercept_reagents_transfer(R, cached_amount))//Use input amount instead. + continue + R.add_reagent(T.type, transfer_amount * multiplier, trans_data, chem_temp, T.purity, T.ph, no_react = TRUE) //we only handle reaction after every reagent has been transfered. to_transfer = max(to_transfer - transfer_amount , 0) if(methods) if(istype(target_atom, /obj/item/organ)) @@ -426,11 +466,14 @@ T.on_transfer(target_atom, methods, transfer_amount * multiplier) remove_reagent(T.type, transfer_amount) transfer_log[T.type] = transfer_amount + if(is_type_in_list(target_atom, list(/mob/living/carbon, /obj/item/organ/stomach))) + R.process_mob_reagent_purity(T.type, transfer_amount * multiplier, T.purity) if(transfered_by && target_atom) target_atom.add_hiddenprint(transfered_by) //log prints so admins can figure out who touched it last. log_combat(transfered_by, target_atom, "transferred reagents ([log_list(transfer_log)]) from [my_atom] to") + update_total() R.update_total() if(!no_react) @@ -447,18 +490,23 @@ return if(amount < 0) return - + + var/cached_amount = amount var/datum/reagents/R = target.reagents if(src.get_reagent_amount(reagent) 0) - add_reagent(T.type, T.volume * change) + add_reagent(T.type, T.volume * change, added_purity = T.purity) else remove_reagent(T.type, abs(T.volume * change)) //absolute value to prevent a double negative situation (removing -50% would be adding 50%) @@ -707,127 +759,416 @@ update_total() /// Handle any reactions possible in this holder +/// Also UPDATES the reaction list +/// High potential for infinite loopsa if you're editing this. /datum/reagents/proc/handle_reactions() + if(QDELING(src)) + CRASH("[my_atom] is trying to handle reactions while being flagged for deletion. It presently has [length(reagent_list)] number of reactants in it. If that is over 0 then something terrible happened.") + + if(!length(reagent_list))//The liver is calling this method a lot, and is often empty of reagents so it's pointless busywork. It should be an easy fix, but I'm nervous about touching things beyond scope. Also since everything is so handle_reactions() trigger happy it might be a good idea having this check anyways. + return FALSE + if(flags & NO_REACT) - return 0 //Yup, no reactions here. No siree. + if(is_reacting) + force_stop_reacting() //Force anything that is trying to to stop + return FALSE //Yup, no reactions here. No siree. + + if(is_reacting)//Prevent wasteful calculations + if(datum_flags != DF_ISPROCESSING)//If we're reacting - but not processing (i.e. we've transfered) + START_PROCESSING(SSreagents, src) + if(!(has_changed_state())) + return FALSE var/list/cached_reagents = reagent_list var/list/cached_reactions = GLOB.chemical_reactions_list var/datum/cached_my_atom = my_atom + LAZYNULL(failed_but_capable_reactions) . = 0 - var/reaction_occurred - do - var/list/possible_reactions = list() - reaction_occurred = FALSE - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - for(var/reaction in cached_reactions[R.type]) // Was a big list but now it should be smaller since we filtered it with our reagent id - if(!reaction) - continue + var/list/possible_reactions = list() + for(var/_reagent in cached_reagents) + var/datum/reagent/reagent = _reagent + for(var/_reaction in cached_reactions[reagent.type]) // Was a big list but now it should be smaller since we filtered it with our reagent id + if(!_reaction) + continue - var/datum/chemical_reaction/C = reaction - var/list/cached_required_reagents = C.required_reagents - var/total_required_reagents = cached_required_reagents.len - var/total_matching_reagents = 0 - var/list/cached_required_catalysts = C.required_catalysts - var/total_required_catalysts = cached_required_catalysts.len - var/total_matching_catalysts= 0 - var/matching_container = FALSE - var/matching_other = FALSE - var/required_temp = C.required_temp - var/is_cold_recipe = C.is_cold_recipe - var/meets_temp_requirement = FALSE + var/datum/chemical_reaction/reaction = _reaction + if(!reaction.required_reagents)//Don't bring in empty ones + continue + var/list/cached_required_reagents = reaction.required_reagents + var/total_required_reagents = cached_required_reagents.len + var/total_matching_reagents = 0 + var/list/cached_required_catalysts = reaction.required_catalysts + var/total_required_catalysts = cached_required_catalysts.len + var/total_matching_catalysts= 0 + var/matching_container = FALSE + var/matching_other = FALSE + var/required_temp = reaction.required_temp + var/is_cold_recipe = reaction.is_cold_recipe + var/meets_temp_requirement = FALSE + var/meets_ph_requirement = FALSE + var/granularity = 1 + if(!(reaction.reaction_flags & REACTION_INSTANT)) + granularity = 0.01 - for(var/B in cached_required_reagents) - if(!has_reagent(B, cached_required_reagents[B])) - break - total_matching_reagents++ - for(var/B in cached_required_catalysts) - if(!has_reagent(B, cached_required_catalysts[B])) - break - total_matching_catalysts++ - if(cached_my_atom) - if(!C.required_container) - matching_container = TRUE - else - if(cached_my_atom.type == C.required_container) - matching_container = TRUE - if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs - matching_container = FALSE - if(!C.required_other) - matching_other = TRUE - - else if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = TRUE - else - if(!C.required_container) - matching_container = TRUE - if(!C.required_other) - matching_other = TRUE - - if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp)) - meets_temp_requirement = TRUE - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement) - possible_reactions += C - - if(possible_reactions.len) - var/datum/chemical_reaction/selected_reaction = possible_reactions[1] - //select the reaction with the most extreme temperature requirements - for(var/V in possible_reactions) - var/datum/chemical_reaction/competitor = V - if(selected_reaction.is_cold_recipe) //if there are no recipe conflicts, everything in possible_reactions will have this same value for is_cold_reaction. warranty void if assumption not met. - if(competitor.required_temp <= selected_reaction.required_temp) - selected_reaction = competitor - else - if(competitor.required_temp >= selected_reaction.required_temp) - selected_reaction = competitor - var/list/cached_required_reagents = selected_reaction.required_reagents - var/list/cached_results = selected_reaction.results - var/list/multiplier = INFINITY - for(var/B in cached_required_reagents) - multiplier = min(multiplier, round(get_reagent_amount(B) / cached_required_reagents[B])) - - for(var/B in cached_required_reagents) - remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1) - - for(var/P in selected_reaction.results) - multiplier = max(multiplier, 1) //this shouldn't happen ... - SSblackbox.record_feedback("tally", "chemical_reaction", cached_results[P]*multiplier, P) - add_reagent(P, cached_results[P]*multiplier, null, chem_temp) - - var/list/seen = viewers(4, get_turf(my_atom)) - var/iconhtml = icon2html(cached_my_atom, seen) + for(var/req_reagent in cached_required_reagents) + if(!has_reagent(req_reagent, (cached_required_reagents[req_reagent]*granularity))) + break + total_matching_reagents++ + for(var/_catalyst in cached_required_catalysts) + if(!has_reagent(_catalyst, (cached_required_catalysts[_catalyst]*granularity))) + break + total_matching_catalysts++ if(cached_my_atom) - if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, TRUE) + if(!reaction.required_container) + matching_container = TRUE + else + if(cached_my_atom.type == reaction.required_container) + matching_container = TRUE + if (isliving(cached_my_atom) && !reaction.mob_react) //Makes it so certain chemical reactions don't occur in mobs + matching_container = FALSE + if(!reaction.required_other) + matching_other = TRUE - for(var/mob/M in seen) - to_chat(M, "[iconhtml] [selected_reaction.mix_message]") + else if(istype(cached_my_atom, /obj/item/slime_extract)) + var/obj/item/slime_extract/extract = cached_my_atom - if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." + if(extract.Uses > 0) // added a limit to slime cores -- Muskets requested this + matching_other = TRUE + else + if(!reaction.required_container) + matching_container = TRUE + if(!reaction.required_other) + matching_other = TRUE - selected_reaction.on_reaction(src, multiplier) - reaction_occurred = TRUE + if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp)) + meets_temp_requirement = TRUE + + if(((ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) + meets_ph_requirement = TRUE + + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) + if(meets_temp_requirement && meets_ph_requirement) + possible_reactions += reaction + else + LAZYADD(failed_but_capable_reactions, reaction) + + update_previous_reagent_list() + //This is the point where we have all the possible reactions from a reagent/catalyst point of view, so we set up the reaction list + for(var/_possible_reaction in possible_reactions) + var/datum/chemical_reaction/selected_reaction = _possible_reaction + if((selected_reaction.reaction_flags & REACTION_INSTANT) || (flags & REAGENT_HOLDER_INSTANT_REACT)) //If we have instant reactions, we process them here + instant_react(selected_reaction) .++ + update_total() + continue + else + var/exists = FALSE + for(var/_equilibrium in reaction_list) + var/datum/equilibrium/E_exist = _equilibrium + if(ispath(E_exist.reaction.type, selected_reaction.type)) //Don't add duplicates + exists = TRUE + + //Add it if it doesn't exist in the list + if(!exists) + is_reacting = TRUE//Prevent any on_reaction() procs from infinite looping + var/datum/equilibrium/equilibrium = new (selected_reaction, src) //Otherwise we add them to the processing list. + if(equilibrium.to_delete)//failed startup checks + qdel(equilibrium) + else + //Adding is done in new(), deletion is in qdel + equilibrium.reaction.on_reaction(equilibrium, src, equilibrium.multiplier) + equilibrium.react_timestep(1)//Get an initial step going so there's not a delay between setup and start - DO NOT ADD THIS TO equilibrium.NEW() + + if(LAZYLEN(reaction_list)) + is_reacting = TRUE //We've entered the reaction phase - this is set here so any reagent handling called in on_reaction() doesn't cause infinite loops + START_PROCESSING(SSreagents, src) //see process() to see how reactions are handled + else + is_reacting = FALSE - while(reaction_occurred) - update_total() if(.) SEND_SIGNAL(src, COMSIG_REAGENTS_REACTED, .) +/* +* Main Reaction loop handler, Do not call this directly +* +* Checks to see if there's a reaction, then processes over the reaction list, removing them if flagged +* If any are ended, it displays the reaction message and removes it from the reaction list +* If the list is empty at the end it finishes reacting. +* Arguments: +* * delta_time - the time between each time step +*/ +/datum/reagents/process(delta_time) + if(!is_reacting) + force_stop_reacting() + stack_trace("[src] | [my_atom] was forced to stop reacting. This might be unintentional.") + //sum of output messages. + var/list/mix_message = list() + //Process over our reaction list + //See equilibrium.dm for mechanics + var/num_reactions = 0 + for(var/_equilibrium in reaction_list) + var/datum/equilibrium/equilibrium = _equilibrium + //Continue reacting + equilibrium.react_timestep(delta_time) + num_reactions++ + //if it's been flagged to delete + if(equilibrium.to_delete) + var/temp_mix_message = end_reaction(equilibrium) + if(!text_in_list(temp_mix_message, mix_message)) + mix_message += temp_mix_message + continue + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[equilibrium.reaction.type] total reaction steps") + + if(num_reactions) + SEND_SIGNAL(src, COMSIG_REAGENTS_REACTION_STEP, num_reactions, delta_time) + + if(length(mix_message)) //This is only at the end + my_atom.audible_message("[icon2html(my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [mix_message.Join()]") + + if(!LAZYLEN(reaction_list)) + finish_reacting() + else + update_total() + handle_reactions() + +/* +* This ends a single instance of an ongoing reaction +* +* Arguments: +* * E - the equilibrium that will be ended +* Returns: +* * mix_message - the associated mix message of a reaction +*/ +/datum/reagents/proc/end_reaction(datum/equilibrium/equilibrium) + if(!equilibrium.holder || !equilibrium.reaction) //Somehow I'm getting empty equilibrium. This is here to handle them + LAZYREMOVE(reaction_list, equilibrium) + qdel(equilibrium) + stack_trace("The equilibrium datum currently processing in this reagents datum had a nulled holder or nulled reaction. src holder:[my_atom] || src type:[my_atom.type] ") //Shouldn't happen. Does happen + return + if(equilibrium.holder != src) //When called from Destroy() eqs are nulled in smoke. This is very strange. This is probably causing it to spam smoke because of the runtime interupting the removal. + stack_trace("The equilibrium datum currently processing in this reagents datum had a desynced holder to the ending reaction. src holder:[my_atom] | equilibrium holder:[equilibrium.holder.my_atom] || src type:[my_atom.type] | equilibrium holder:[equilibrium.holder.my_atom.type]") + LAZYREMOVE(reaction_list, equilibrium) + equilibrium.reaction.reaction_finish(src, equilibrium.reacted_vol) + var/reaction_message = equilibrium.reaction.mix_message + if(equilibrium.reaction.mix_sound) + playsound(get_turf(my_atom), equilibrium.reaction.mix_sound, 80, TRUE) + qdel(equilibrium) + update_total() + SEND_SIGNAL(src, COMSIG_REAGENTS_REACTED, .) + return reaction_message + +/* +* This stops the holder from processing at the end of a series of reactions (i.e. when all the equilibriums are completed) +* +* Also resets reaction variables to be null/empty/FALSE so that it can restart correctly in the future +*/ +/datum/reagents/proc/finish_reacting() + STOP_PROCESSING(SSreagents, src) + is_reacting = FALSE + //Cap off values + for(var/_reagent in reagent_list) + var/datum/reagent/reagent = _reagent + reagent.volume = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING)//To prevent runaways. + LAZYNULL(previous_reagent_list) //reset it to 0 - because any change will be different now. + update_total() + if(!QDELING(src)) + handle_reactions() //Should be okay without. Each step checks. + +/* +* Force stops the current holder/reagents datum from reacting +* +* Calls end_reaction() for each equlilbrium datum in reaction_list and finish_reacting() +* Usually only called when a datum is transfered into a NO_REACT container +*/ +/datum/reagents/proc/force_stop_reacting() + var/list/mix_message = list() + for(var/_equilibrium in reaction_list) + var/datum/equilibrium/equilibrium = _equilibrium + mix_message += end_reaction(equilibrium) + if(length(mix_message)) + my_atom.audible_message("[icon2html(my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [mix_message.Join()]") + finish_reacting() + +/* +* Force stops a specific reagent's associated reaction if it exists +* +* Mostly used if a reagent is being taken out by trans_id_to +* Might have some other applciations +* Returns TRUE if it stopped something, FALSE if it didn't +* Arguments: +* * reagent - the reagent PRODUCT that we're seeking reactions for, any and all found will be shut down +*/ +/datum/reagents/proc/force_stop_reagent_reacting(datum/reagent/reagent) + var/any_stopped = FALSE + var/list/mix_message = list() + for(var/_equilibrium in reaction_list) + var/datum/equilibrium/equilibrium = _equilibrium + for(var/result in equilibrium.reaction.results) + if(result == reagent.type) + mix_message += end_reaction(equilibrium) + any_stopped = TRUE + if(length(mix_message)) + my_atom.audible_message("[icon2html(my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [mix_message.Join()]") + return any_stopped + +/* +* Transfers the reaction_list to a new reagents datum +* +* Arguments: +* * target - the datum/reagents that this src is being transfered into +*/ +/datum/reagents/proc/transfer_reactions(datum/reagents/target) + if(QDELETED(target)) + CRASH("transfer_reactions() had a [target] ([target.type]) passed to it when it was set to qdel, or it isn't a reagents datum.") + if(!reaction_list) + return + for(var/reaction in reaction_list) + var/datum/equilibrium/reaction_source = reaction + var/exists = FALSE + for(var/reaction2 in target.reaction_list) //Don't add duplicates + var/datum/equilibrium/reaction_target = reaction2 + if(reaction_source.reaction.type == reaction_target.reaction.type) + exists = TRUE + if(exists) + continue + if(!reaction_source.holder) + CRASH("reaction_source is missing a holder in transfer_reactions()!") + + var/datum/equilibrium/new_E = new (reaction_source.reaction, target)//addition to reaction_list is done in new() + if(new_E.to_delete)//failed startup checks + qdel(new_E) + + target.previous_reagent_list = LAZYLISTDUPLICATE(previous_reagent_list) + target.is_reacting = is_reacting + + +///Checks to see if the reagents has a difference in reagents_list and previous_reagent_list (I.e. if there's a difference between the previous call and the last) +///Also checks to see if the saved reactions in failed_but_capable_reactions can start as a result of temp/pH change +/datum/reagents/proc/has_changed_state() + //Check if reagents are different + var/total_matching_reagents = 0 + for(var/reagent in previous_reagent_list) + if(has_reagent(reagent)) + total_matching_reagents++ + if(total_matching_reagents != reagent_list.len) + return TRUE + + //Check our last reactions + for(var/_reaction in failed_but_capable_reactions) + var/datum/chemical_reaction/reaction = _reaction + if(reaction.is_cold_recipe) + if(reaction.required_temp < chem_temp) + return TRUE + else + if(reaction.required_temp < chem_temp) + return TRUE + if(((ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) + return TRUE + return FALSE + +/datum/reagents/proc/update_previous_reagent_list() + LAZYNULL(previous_reagent_list) + for(var/_reagent in reagent_list) + var/datum/reagent/reagent = _reagent + LAZYADD(previous_reagent_list, reagent.type) + +///Old reaction mechanics, edited to work on one only +///This is changed from the old - purity of the reagents will affect yield +/datum/reagents/proc/instant_react(datum/chemical_reaction/selected_reaction) + var/list/cached_required_reagents = selected_reaction.required_reagents + var/list/cached_results = selected_reaction.results + var/datum/cached_my_atom = my_atom + var/multiplier = INFINITY + for(var/reagent in cached_required_reagents) + multiplier = min(multiplier, round(get_reagent_amount(reagent) / cached_required_reagents[reagent])) + + if(multiplier == 0)//Incase we're missing reagents - usually from on_reaction being called in an equlibrium when the results.len == 0 handlier catches a misflagged reaction + return FALSE + var/sum_purity = 0 + for(var/_reagent in cached_required_reagents) + var/datum/reagent/reagent = has_reagent(_reagent) + sum_purity += reagent.purity + remove_reagent(_reagent, (multiplier * cached_required_reagents[_reagent]), safety = 1) + sum_purity /= cached_required_reagents.len + + for(var/product in selected_reaction.results) + multiplier = max(multiplier, 1) //this shouldn't happen ... + var/yield = (cached_results[product]*multiplier)*sum_purity + SSblackbox.record_feedback("tally", "chemical_reaction", yield, product) + add_reagent(product, yield, null, chem_temp, sum_purity) + + var/list/seen = viewers(4, get_turf(my_atom)) + var/iconhtml = icon2html(cached_my_atom, seen) + if(cached_my_atom) + if(!ismob(cached_my_atom)) // No bubbling mobs + if(selected_reaction.mix_sound) + playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, TRUE) + + my_atom.audible_message("[iconhtml] [selected_reaction.mix_message]") + + if(istype(cached_my_atom, /obj/item/slime_extract)) + var/obj/item/slime_extract/extract = my_atom + extract.Uses-- + if(extract.Uses <= 0) // give the notification that the slime core is dead + my_atom.visible_message("[iconhtml] \The [my_atom]'s power is consumed in the reaction.") + extract.name = "used slime extract" + extract.desc = "This extract has been used up." + + selected_reaction.on_reaction(null, src, multiplier) + +///Possibly remove - see if multiple instant reactions is okay (Though, this "sorts" reactions by temp decending) +///Presently unused +/datum/reagents/proc/get_priority_instant_reaction(list/possible_reactions) + if(!length(possible_reactions)) + return FALSE + var/datum/chemical_reaction/selected_reaction = possible_reactions[1] + //select the reaction with the most extreme temperature requirements + for(var/_reaction in possible_reactions) + var/datum/chemical_reaction/competitor = _reaction + if(selected_reaction.is_cold_recipe) + if(competitor.required_temp <= selected_reaction.required_temp) + selected_reaction = competitor + else + if(competitor.required_temp >= selected_reaction.required_temp) + selected_reaction = competitor + return selected_reaction + +/*Processes the reagents in the holder and converts them, only called in a mob/living/carbon on addition +* +* Arguments: +* * reagent - the added reagent datum/object +* * added_volume - the volume of the reagent that was added (since it can already exist in a mob) +* * added_purity - the purity of the added volume +*/ +/datum/reagents/proc/process_mob_reagent_purity(_reagent, added_volume, added_purity) + var/datum/reagent/R = has_reagent(_reagent) + if(!R) + stack_trace("Tried to process reagent purity for [_reagent], but 0 volume was found right after it was added!") //This can happen from smoking, where the volume is 0 after adding? + return + if (R.purity == 1) + return + if(R.chemical_flags & REAGENT_DONOTSPLIT) + R.purity = 1 + return + if(R.purity < 0) + stack_trace("Purity below 0 for chem: [type]!") + R.purity = 0 + + if ((R.inverse_chem_val > R.purity) && (R.inverse_chem))//Turns all of a added reagent into the inverse chem + remove_reagent(R.type, added_volume, FALSE) + add_reagent(R.inverse_chem, added_volume, FALSE, added_purity = 1-R.creation_purity) + var/datum/reagent/inverse_reagent = has_reagent(R.inverse_chem) + if(inverse_reagent.chemical_flags & REAGENT_SNEAKYNAME) + inverse_reagent.name = R.name//Negative effects are hidden + if(inverse_reagent.chemical_flags & REAGENT_INVISIBLE) + inverse_reagent.chemical_flags |= (REAGENT_INVISIBLE) + else if (R.impure_chem) + var/impureVol = added_volume * (1 - R.purity) //turns impure ratio into impure chem + if(!(R.chemical_flags & REAGENT_SPLITRETAINVOL)) + remove_reagent(R.type, impureVol, FALSE) + add_reagent(R.impure_chem, impureVol, FALSE, added_purity = 1-R.creation_purity) + R.purity = 1 //prevent this process from repeating (this is why creation_purity exists) /// Updates [/datum/reagents/var/total_volume] /datum/reagents/proc/update_total() @@ -835,10 +1176,14 @@ total_volume = 0 for(var/reagent in cached_reagents) var/datum/reagent/R = reagent - if(R.volume < 0.05) + if((R.volume < 0.05) && !is_reacting) + del_reagent(R.type) + else if(R.volume <= CHEMICAL_VOLUME_MINIMUM)//For clarity del_reagent(R.type) else total_volume += R.volume + recalculate_sum_ph() + /** * Applies the relevant expose_ proc for every reagent in this holder @@ -896,6 +1241,15 @@ return round(R.volume, CHEMICAL_QUANTISATION_LEVEL) return 0 +/// Get the purity of this reagent +/datum/reagents/proc/get_reagent_purity(reagent) + var/list/cached_reagents = reagent_list + for(var/_reagent in cached_reagents) + var/datum/reagent/R = _reagent + if (R.type == reagent) + return round(R.purity, 0.01) + return 0 + /// Get a comma separated string of every reagent name in this holder. UNUSED /datum/reagents/proc/get_reagent_names() var/list/names = list() @@ -1041,6 +1395,65 @@ chem_temp = _temperature SEND_SIGNAL(src, COMSIG_REAGENTS_TEMP_CHANGE, _temperature, .) +/* +* Adjusts the base pH of all of the reagents in a beaker +* +* - moves it towards acidic +* + moves it towards basic +* Arguments: +* * value - How much to adjust the base pH by +*/ +/datum/reagents/proc/adjust_all_reagents_ph(value, lower_limit = 0, upper_limit = 14) + for(var/reagent in reagent_list) + var/datum/reagent/R = reagent + R.ph = clamp(R.ph + value, lower_limit, upper_limit) + +/* +* Adjusts the base pH of all of the listed types +* +* - moves it towards acidic +* + moves it towards basic +* Arguments: +* * input_reagents_list - list of reagents to adjust +* * value - How much to adjust the base pH by +*/ +/datum/reagents/proc/adjust_specific_reagent_list_ph(list/input_reagents_list, value, lower_limit = 0, upper_limit = 14) + for(var/reagent in input_reagents_list) + var/datum/reagent/R = get_reagent(reagent) + if(!R) //We can call this with missing reagents. + continue + R.ph = clamp(R.ph + value, lower_limit, upper_limit) + +/* +* Adjusts the base pH of a specific type +* +* - moves it towards acidic +* + moves it towards basic +* Arguments: +* * input_reagent - type path of the reagent +* * value - How much to adjust the base pH by +* * lower_limit - how low the pH can go +* * upper_limit - how high the pH can go +*/ +/datum/reagents/proc/adjust_specific_reagent_ph(input_reagent, value, lower_limit = 0, upper_limit = 14) + var/datum/reagent/R = get_reagent(input_reagent) + if(!R) //We can call this with missing reagents. + return FALSE + R.ph = clamp(R.ph + value, lower_limit, upper_limit) + +/* +* Updates the reagents datum pH based off the volume weighted sum of the reagent_list's reagent pH +*/ +/datum/reagents/proc/recalculate_sum_ph() + if(!reagent_list || !total_volume) //Ensure that this is true + ph = CHEMICAL_NORMAL_PH + return + var/total_ph = 0 + for(var/reagent in reagent_list) + var/datum/reagent/R = get_reagent(reagent) //we need the specific instance + total_ph += (R.ph * R.volume) + //Keep limited + ph = clamp(total_ph/total_volume, 0, 14) /** * Used in attack logs for reagents in pills and such diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm new file mode 100644 index 00000000000..d4f7bf6fdfd --- /dev/null +++ b/code/modules/reagents/chemistry/items.dm @@ -0,0 +1,164 @@ +///if the ph_meter gives a detailed output +#define DETAILED_CHEM_OUTPUT 1 +///if the pH meter gives a shorter output +#define SHORTENED_CHEM_OUTPUT 0 + +/* +* a pH booklet that contains pH paper pages that will change color depending on the pH of the reagents datum it's attacked onto +*/ +/obj/item/ph_booklet + name = "pH indicator booklet" + desc = "A booklet containing paper soaked in universal indicator." + icon_state = "pHbooklet" + icon = 'icons/obj/chemical.dmi' + item_flags = NOBLUDGEON + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY + ///How many pages the booklet holds + var/number_of_pages = 50 + +//A little janky with pockets +/obj/item/ph_booklet/attack_hand(mob/user) + if(user.get_held_index_of_item(src))//Does this check pockets too..? + if(number_of_pages == 50) + icon_state = "pHbooklet_open" + if(!number_of_pages) + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return + var/obj/item/ph_paper/page = new(get_turf(user)) + page.add_fingerprint(user) + user.put_in_active_hand(page) + to_chat(user, "You take [page] out of \the [src].") + number_of_pages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) + add_fingerprint(user) + if(!number_of_pages) + icon_state = "pHbooklet_empty" + return + var/I = user.get_active_held_item() + if(!I) + user.put_in_active_hand(src) + return ..() + +/obj/item/ph_booklet/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + var/mob/living/user = usr + if(!isliving(user)) + return + if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + return + if(!number_of_pages) + to_chat(user, "[src] is empty!") + add_fingerprint(user) + return + if(number_of_pages == 50) + icon_state = "pHbooklet_open" + var/obj/item/ph_paper/P = new(get_turf(user)) + P.add_fingerprint(user) + user.put_in_active_hand(P) + to_chat(user, "You take [P] out of \the [src].") + number_of_pages-- + playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) + add_fingerprint(user) + if(!number_of_pages) + icon_state = "pHbookletEmpty" + +/* +* pH paper will change color depending on the pH of the reagents datum it's attacked onto +*/ +/obj/item/ph_paper + name = "pH indicator strip" + desc = "A piece of paper that will change colour depending on the pH of a solution." + icon_state = "pHpaper" + icon = 'icons/obj/chemical.dmi' + item_flags = NOBLUDGEON + color = "#f5c352" + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY + ///If the paper was used, and therefore cannot change color again + var/used = FALSE + +/obj/item/ph_paper/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + var/obj/item/reagent_containers/cont = target + if(!istype(cont)) + return + if(used == TRUE) + to_chat(user, "[src] has already been used!") + return + if(!LAZYLEN(cont.reagents.reagent_list)) + return + switch(round(cont.reagents.ph, 1)) + if(14 to INFINITY) + color = "#462c83" + if(13 to 14) + color = "#63459b" + if(12 to 13) + color = "#5a51a2" + if(11 to 12) + color = "#3853a4" + if(10 to 11) + color = "#3f93cf" + if(9 to 10) + color = "#0bb9b7" + if(8 to 9) + color = "#23b36e" + if(7 to 8) + color = "#3aa651" + if(6 to 7) + color = "#4cb849" + if(5 to 6) + color = "#b5d335" + if(4 to 5) + color = "#f7ec1e" + if(3 to 4) + color = "#fbc314" + if(2 to 3) + color = "#f26724" + if(1 to 2) + color = "#ef1d26" + if(-INFINITY to 1) + color = "#c6040c" + desc += " The paper looks to be around a pH of [round(cont.reagents.ph, 1)]" + name = "used [name]" + used = TRUE + +/* +* pH meter that will give a detailed or truncated analysis of all the reagents in of an object with a reagents datum attached to it. Only way of detecting purity for now. +*/ +/obj/item/ph_meter + name = "Chemistry Analyser" + desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays nothing." + icon_state = "pHmeter" + icon = 'icons/obj/chemical.dmi' + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_TINY + ///level of detail for output for the meter + var/scanmode = DETAILED_CHEM_OUTPUT + +/obj/item/ph_meter/attack_self(mob/user) + if(scanmode == SHORTENED_CHEM_OUTPUT) + to_chat(user, "You switch the chemical analyzer to provide a detailed description of each reagent.") + scanmode = DETAILED_CHEM_OUTPUT + else + to_chat(user, "You switch the chemical analyzer to not include reagent descriptions in it's report.") + scanmode = SHORTENED_CHEM_OUTPUT + +/obj/item/ph_meter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!istype(target, /obj/item/reagent_containers)) + return + var/obj/item/reagent_containers/cont = target + if(LAZYLEN(cont.reagents.reagent_list) == null) + return + var/list/out_message = list() + to_chat(user, "The chemistry meter beeps and displays:") + out_message += "Total volume: [round(cont.volume, 0.01)] Current temperature: [round(cont.reagents.chem_temp, 0.1)]K Total pH: [round(cont.reagents.ph, 0.01)]\n" + out_message += "Chemicals found in the beaker:\n" + if(cont.reagents.is_reacting) + out_message += "A reaction appears to be occuring currently.\n" + for(var/datum/reagent/R in cont.reagents.reagent_list) + out_message += "[round(R.volume, 0.01)]u of [R.name], Purity: [round(R.purity, 0.01)], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [initial(R.ph)], Current pH: [R.ph].":"Current pH: [R.ph].")]\n" + if(scanmode) + out_message += "Analysis: [R.description]\n" + to_chat(user, "[out_message.Join()]") + desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays detected vol: [round(cont.volume, 0.01)] detected pH:[round(cont.reagents.ph, 0.1)]." diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index c34ef0a88c1..e790d2243d0 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -29,6 +29,8 @@ var/amount = 30 var/recharge_amount = 10 var/recharge_counter = 0 + ///If the UI has the pH meter shown + var/show_ph = TRUE var/mutable_appearance/beaker_overlay var/working_state = "dispenser_working" var/nopower_state = "dispenser_nopower" @@ -234,23 +236,26 @@ data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. data["maxEnergy"] = cell.maxcharge * powerefficiency data["isBeakerLoaded"] = beaker ? 1 : 0 + data["showpH"] = show_ph var/beakerContents[0] var/beakerCurrentVolume = 0 if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... + beakerContents.Add(list(list("name" = R.name, "volume" = round(R.volume, 0.01), "pH" = R.ph, "purity" = R.purity))) // list in a list because Byond merges the first list... beakerCurrentVolume += R.volume data["beakerContents"] = beakerContents if (beaker) - data["beakerCurrentVolume"] = beakerCurrentVolume + data["beakerCurrentVolume"] = round(beakerCurrentVolume, 0.01) data["beakerMaxVolume"] = beaker.volume data["beakerTransferAmounts"] = beaker.possible_transfer_amounts + data["beakerCurrentpH"] = round(beaker.reagents.ph, 0.01) else data["beakerCurrentVolume"] = null data["beakerMaxVolume"] = null data["beakerTransferAmounts"] = null + data["beakerCurrentpH"] = null var/chemicals[0] var/is_hallucinating = FALSE @@ -262,7 +267,7 @@ var/chemname = temp.name if(is_hallucinating && prob(5)) chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" - chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name)))) + chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name), "pH" = temp.ph, "pHCol" = ConvertpHToCol(temp.ph)))) data["chemicals"] = chemicals data["recipes"] = saved_recipes @@ -465,6 +470,32 @@ update_icon() return TRUE +//Converts the pH into a tgui readable color +/obj/machinery/chem_dispenser/proc/ConvertpHToCol(pH) + switch(pH) + if(-INFINITY to 1) + return "red" + if(1 to 2) + return "orange" + if(2 to 3) + return "average" + if(3 to 4) + return "yellow" + if(4 to 5) + return "olive" + if(5 to 6) + return "good" + if(6 to 8) + return "green" + if(8 to 9.5) + return "teal" + if(9.5 to 11) + return "blue" + if(11 to 12.5) + return "violet" + if(12.5 to INFINITY) + return "purple" + /obj/machinery/chem_dispenser/on_deconstruction() cell = null if(beaker) @@ -518,6 +549,7 @@ working_state = null nopower_state = null pass_flags = PASSTABLE + show_ph = FALSE dispensable_reagents = list( /datum/reagent/water, /datum/reagent/consumable/ice, diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 17d3a56fed7..b0de5e7e9ee 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -1,5 +1,17 @@ +#define ENABLE_FLASHING -1 + +///Tutorial states +#define TUT_NO_BUFFER 50 +#define TUT_START 1 +#define TUT_HAS_REAGENTS 2 +#define TUT_IS_ACTIVE 3 +#define TUT_IS_REACTING 4 +#define TUT_FAIL 4.5 +#define TUT_COMPLETE 5 +#define TUT_MISSING 10 + /obj/machinery/chem_heater - name = "chemical heater" + name = "reaction chamber" //Maybe this name is more accurate? density = TRUE icon = 'icons/obj/chemical.dmi' icon_state = "mixer0b" @@ -12,11 +24,29 @@ var/target_temperature = 300 var/heater_coefficient = 0.05 var/on = FALSE + var/dispense_volume = 1 + + //The list of active clients using this heater, so that we can update the UI on a reaction_step. I assume there are multiple clients possible. + var/list/ui_client_list + ///If the user has the tutorial enabled + var/tutorial_active = FALSE + ///What state we're at in the tutorial + var/tutorial_state = 0 +/obj/machinery/chem_heater/Initialize() + . = ..() + create_reagents(200, NO_REACT)//Lets save some calculations here + reagents.add_reagent(/datum/reagent/reaction_agent/basic_buffer, 20) + reagents.add_reagent(/datum/reagent/reaction_agent/acidic_buffer, 20) + //TODO: comsig reaction_start and reaction_end to enable/disable the UI autoupdater - this doesn't work presently as there's a hard divide between instant and processed reactions + /obj/machinery/chem_heater/Destroy() - QDEL_NULL(beaker) + if(beaker) + UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) + QDEL_NULL(beaker) return ..() + /obj/machinery/chem_heater/handle_atom_del(atom/A) . = ..() if(A == beaker) @@ -40,9 +70,11 @@ return FALSE if(beaker) try_put_in_hand(beaker, user) + UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) beaker = null if(new_beaker) beaker = new_beaker + RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, .proc/on_reaction_step) update_icon() return TRUE @@ -58,14 +90,60 @@ /obj/machinery/chem_heater/process(delta_time) ..() + //Tutorial logics + if(tutorial_active) + switch(tutorial_state) + if(TUT_NO_BUFFER) + if(reagents.has_reagent(/datum/reagent/reaction_agent/basic_buffer, 5) && reagents.has_reagent(/datum/reagent/reaction_agent/acidic_buffer, 5)) + tutorial_state = TUT_START + + if(TUT_START) + if(!reagents.has_reagent(/datum/reagent/reaction_agent/basic_buffer, 5) || !reagents.has_reagent(/datum/reagent/reaction_agent/acidic_buffer, 5)) + tutorial_state = TUT_NO_BUFFER + return + if(beaker?.reagents.has_reagent(/datum/reagent/mercury, 10) || beaker?.reagents.has_reagent(/datum/reagent/chlorine, 10)) + tutorial_state = TUT_HAS_REAGENTS + + if(TUT_HAS_REAGENTS) + if(!(beaker?.reagents.has_reagent(/datum/reagent/mercury, 9)) || !(beaker?.reagents.has_reagent(/datum/reagent/chlorine, 9))) + tutorial_state = TUT_MISSING + return + if(beaker?.reagents.chem_temp > 374)//If they heated it up as asked + tutorial_state = TUT_IS_ACTIVE + target_temperature = 375 + beaker.reagents.chem_temp = 375 + + if(TUT_IS_ACTIVE) + if(!(beaker?.reagents.has_reagent(/datum/reagent/mercury)) || !(beaker?.reagents.has_reagent(/datum/reagent/chlorine))) //Slightly concerned that people might take ages to read and it'll react anyways + tutorial_state = TUT_MISSING + return + if(length(beaker?.reagents.reaction_list) == 1)//Only fudge numbers for our intentful reaction + beaker.reagents.chem_temp = 375 + + if(target_temperature >= 390) + tutorial_state = TUT_IS_REACTING + + if(TUT_IS_REACTING) + if(!(beaker?.reagents.has_reagent(/datum/reagent/mercury)) || !(beaker?.reagents.has_reagent(/datum/reagent/chlorine))) + tutorial_state = TUT_COMPLETE + + if(TUT_COMPLETE) + if(beaker?.reagents.has_reagent(/datum/reagent/consumable/failed_reaction)) + tutorial_state = TUT_FAIL + return + if(!beaker?.reagents.has_reagent(/datum/reagent/medicine/calomel)) + tutorial_state = TUT_MISSING + if(machine_stat & NOPOWER) return if(on) if(beaker?.reagents.total_volume) + if(beaker.reagents.is_reacting)//on_reaction_step() handles this + return //keep constant with the chemical acclimator please beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) beaker.reagents.handle_reactions() - + /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)) return @@ -83,33 +161,208 @@ updateUsrDialog() update_icon() return + + if(beaker) + if(istype(I, /obj/item/reagent_containers/dropper)) + var/obj/item/reagent_containers/dropper/D = I + D.afterattack(beaker, user, 1) + return + if(istype(I, /obj/item/reagent_containers/syringe)) + var/obj/item/reagent_containers/syringe/S = I + S.afterattack(beaker, user, 1) + return + return ..() /obj/machinery/chem_heater/on_deconstruction() replace_beaker() return ..() +///Forces a UI update every time a reaction step happens inside of the beaker it contains. This is so the UI is in sync with the reaction since it's important that the output matches the current conditions for pH adjustment and temperature. +/obj/machinery/chem_heater/proc/on_reaction_step(datum/reagents/holder, num_reactions, delta_time) + SIGNAL_HANDLER + if(on) + holder.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume * (rand(8,11) * 0.1))//Give it a little wiggle room since we're actively reacting + for(var/ui_client in ui_client_list) + var/datum/tgui/ui = ui_client + if(!ui) + stack_trace("Warning: UI in UI client list is missing in [src] (chem_heater)") + remove_ui_client_list(ui) + continue + ui.send_update() + /obj/machinery/chem_heater/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "ChemHeater", name) ui.open() + add_ui_client_list(ui) -/obj/machinery/chem_heater/ui_data() +/obj/machinery/chem_heater/ui_close(mob/user) + for(var/ui_client in ui_client_list) + var/datum/tgui/ui = ui_client + if(ui.user == user) + remove_ui_client_list(ui) + return ..() + +/* +*This adds an open ui client to the list - so that it can be force updated from reaction mechanisms. +* After adding it to the list, it enables a signal incase the ui is deleted - which will call a method to remove it from the list +* This is mostly to ensure we don't have defunct ui instances stored from any condition. +*/ +/obj/machinery/chem_heater/proc/add_ui_client_list(new_ui) + LAZYADD(ui_client_list, new_ui) + RegisterSignal(new_ui, COMSIG_PARENT_QDELETING, .proc/on_ui_deletion) + +///This removes an open ui instance from the ui list and deregsiters the signal +/obj/machinery/chem_heater/proc/remove_ui_client_list(old_ui) + UnregisterSignal(old_ui, COMSIG_PARENT_QDELETING) + LAZYREMOVE(ui_client_list, old_ui) + +///This catches a signal and uses it to delete the ui instance from the list +/obj/machinery/chem_heater/proc/on_ui_deletion(datum/tgui/source, force) + SIGNAL_HANDLER + remove_ui_client_list(source) + +/obj/machinery/chem_heater/ui_assets() + . = ..() || list() + . += get_asset_datum(/datum/asset/simple/tutorial_advisors) + +/obj/machinery/chem_heater/ui_data(mob/user) var/data = list() data["targetTemp"] = target_temperature data["isActive"] = on data["isBeakerLoaded"] = beaker ? 1 : 0 data["currentTemp"] = beaker ? beaker.reagents.chem_temp : null - data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null + data["beakerCurrentVolume"] = beaker ? round(beaker.reagents.total_volume, 0.01) : null data["beakerMaxVolume"] = beaker ? beaker.volume : null + data["currentpH"] = beaker ? round(beaker.reagents.ph, 0.01) : null + var/upgrade_level = heater_coefficient*10 + data["upgradeLevel"] = upgrade_level + + var/list/beaker_contents = list() + for(var/r in beaker?.reagents.reagent_list) + var/datum/reagent/reagent = r + beaker_contents.len++ + beaker_contents[length(beaker_contents)] = list("name" = reagent.name, "volume" = round(reagent.volume, 0.01)) + data["beakerContents"] = beaker_contents + + var/list/active_reactions = list() + var/flashing = 14 //for use with alertAfter - since there is no alertBefore, I set the after to 0 if true, or to the max value if false + for(var/_reaction in beaker?.reagents.reaction_list) + var/datum/equilibrium/equilibrium = _reaction + if(!length(beaker.reagents.reaction_list))//I'm not sure why when it explodes it causes the gui to fail (it's missing danger (?) ) + stack_trace("how is this happening??") + continue + if(!equilibrium.reaction.results)//Incase of no result reactions + continue + var/_reagent = equilibrium.reaction.results[1] + var/datum/reagent/reagent = beaker?.reagents.get_reagent(_reagent) //Reactions are named after their primary products + if(!reagent) + continue + var/overheat = FALSE + var/danger = FALSE + var/purity_alert = 2 //same as flashing + if(reagent.purity < equilibrium.reaction.purity_min) + purity_alert = ENABLE_FLASHING//Because 0 is seen as null + danger = TRUE + if(!(flashing == ENABLE_FLASHING))//So that the pH meter flashes for ANY reactions out of optimal + if(equilibrium.reaction.optimal_ph_min > beaker?.reagents.ph || equilibrium.reaction.optimal_ph_max < beaker?.reagents.ph) + flashing = ENABLE_FLASHING + if(equilibrium.reaction.is_cold_recipe) + if(equilibrium.reaction.overheat_temp > beaker?.reagents.chem_temp) + danger = TRUE + overheat = TRUE + else + if(equilibrium.reaction.overheat_temp < beaker?.reagents.chem_temp) + danger = TRUE + overheat = TRUE + if(equilibrium.reaction.reaction_flags & REACTION_COMPETITIVE) //We have a compeitive reaction - concatenate the results for the different reactions + for(var/entry in active_reactions) + if(entry["name"] == reagent.name) //If we have multiple reaction methods for the same result - combine them + entry["reactedVol"] = equilibrium.reacted_vol + entry["targetVol"] = round(equilibrium.target_vol, 1)//Use the first result reagent to name the reaction detected + entry["quality"] = (entry["quality"] + equilibrium.reaction_quality) /2 + continue + active_reactions.len++ + active_reactions[length(active_reactions)] = list("name" = reagent.name, "danger" = danger, "purityAlert" = purity_alert, "quality" = equilibrium.reaction_quality, "overheat" = overheat, "inverse" = reagent.inverse_chem_val, "minPure" = equilibrium.reaction.purity_min, "reactedVol" = equilibrium.reacted_vol, "targetVol" = round(equilibrium.target_vol, 1))//Use the first result reagent to name the reaction detected + data["activeReactions"] = active_reactions + data["isFlashing"] = flashing + + data["acidicBufferVol"] = reagents.get_reagent_amount(/datum/reagent/reaction_agent/acidic_buffer) + data["basicBufferVol"] = reagents.get_reagent_amount(/datum/reagent/reaction_agent/basic_buffer) + data["dispenseVolume"] = dispense_volume + + data["tutorialMessage"] = null + //Tutorial output + if(tutorial_active) + switch(tutorial_state) + if(TUT_NO_BUFFER)//missing buffer + data["tutorialMessage"] = {"It looks like you’re a little low on buffers, here’s how to make more: + +Acidic buffer: 2 parts Sodium + 2 parts Hydrogen + 2 parts Ethanol + 2 parts Water + +Basic buffer: 3 parts Ammonia + 2 parts Chlorine + 2 parts Hydrogen + 2 parts Oxygen + +Heat either up to speed up the reaction. + +When the reactions are done, refill your chamber by pressing the Draw all buttons, to the right of the respective volume indicators. + +To continue with the tutorial, fill both of your acidic and alkaline volumes to at least 5u."} + if(TUT_START)//Default start + data["tutorialMessage"] = {"Hello and welcome to the exciting world of chemistry! This help option will teach you the basic of reactions by guiding you through a calomel reaction. + +For the majority of reactions, the overheat temperature is 900K, and the pH range is 5-9, though it's always worth looking up the ranges as these are changing. Calomel is no different. + +To continue the tutorial, insert a beaker with at least 10u mercury and 10u chlorine added."} + if(TUT_HAS_REAGENTS) //10u Hg and Cl + data["tutorialMessage"] = {"Good job! You'll see that at present this isn't reacting. That's because this reaction needs a minimum temperature of 375K. + +For the most part the hotter your reaction is, the faster it will react when it’s past it’s minimum temperature. But be careful to not heat it too much! "If your reaction is slow, your temperature is too low"! + +When you’re ready, set your temperature to 375K and heat up the beaker to that amount."} + if(TUT_IS_ACTIVE) //heat 375K + data["tutorialMessage"] = {"Great! You should see your reaction slowly progressing. + +Notice the pH dial on the right; the sum pH should be slowly drifting towards the left on the dial. How pure your solution is at the end depends on how well you keep your reaction within the optimal pH range. The dial will flash if any of the present reactions are outside their optimal. "If you're getting sludge, give your pH a nudge"! + +In a moment, we’ll increase the temperature so that our rate is faster. It’s up to you to keep your pH within the limits, so keep an eye on that dial, and get ready to add basic buffer using the injection button to the left of the volume indicator. + +To continue set your target temperature to 390K."} + if(TUT_IS_REACTING) //Heat 390K + data["tutorialMessage"] = "Stay focused on the reaction! You can do it!" + if(TUT_FAIL) //Sludge + data["tutorialMessage"] = "Ah, unfortunately your purity was too low and the reaction fell apart into errant sludge. Don't worry, you can always try again! Be careful though, for some reactions, failing isn't nearly as forgiving." + if(TUT_COMPLETE) //Complete + var/datum/reagent/calo = beaker?.reagents.has_reagent(/datum/reagent/medicine/calomel) + if(!calo) + tutorial_state = TUT_COMPLETE + return + switch(calo.purity) + if(-INFINITY to 0.25) + data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. That's pretty close to the fail purity of 0.15 - which can often make some reactions explode. This chem will invert into Toxic sludge when ingested by another person, and will not cause of calomel's normal effects. Sneaky, huh?" + if(0.25 to 0.6) + data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. Normally, this reaction will resolve above 0.7 without intervention. Are you praticing impure reactions? The lower you go, the higher change you have of getting dangerous effects during a reaction. In some more dangerous reactions, you're riding a fine line between death and an inverse chem, don't forget you can always chill your reaction to give yourself more time to manage it!" + if(0.6 to 0.75) + data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. Normally, this reaction will resolve above 0.7 without intervention. Did you maybe add too much basic buffer and go past 9? If you like - you're welcome to try again. Just double press the help button!" + if(0.75 to 0.85) + data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. You got pretty close to optimal! Feel free to try again if you like by double pressing the help button." + if(0.75 to 0.99) + data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. You got pretty close to optimal! Feel free to try again if you like by double pressing the help button, but this is a respectable purity." + if(0.99 to 1) + data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. Your calomel is as pure as they come! You've mastered the basics of chemistry, but there's plenty more challenges on the horizon. Good luck!" + user.client?.give_award(/datum/award/achievement/misc/chemistry_tut, user) + data["tutorialMessage"] += "\n\nDid you notice that your temperature increased past 390K while reacting too? That's because this reaction is exothermic (heat producing), so for some reactions you might have to adjust your target to compensate. Oh, and you can check your purity by researching and printing off a chemical analyzer at the medlathe (for now)!" + if(TUT_MISSING) //Missing + data["tutorialMessage"] = "Uh oh, something went wrong. Did you take the beaker out, heat it up too fast, or have other things in the beaker? Try restarting the tutorial by double pressing the help button." - var/beakerContents[0] - if(beaker) - for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... - data["beakerContents"] = beakerContents return data /obj/machinery/chem_heater/ui_act(action, params) @@ -128,6 +381,103 @@ if(.) target_temperature = clamp(target, 0, 1000) if("eject") - on = FALSE + //Eject doesn't turn it off, so you can preheat for beaker swapping replace_beaker(usr) . = TRUE + if("acidBuffer") + var/target = params["target"] + if(text2num(target) != null) + target = text2num(target) + . = TRUE + if(.) + move_buffer("acid", target) + if("basicBuffer") + var/target = params["target"] + if(text2num(target) != null) + target = text2num(target) //Because the input is flipped + . = TRUE + if(.) + move_buffer("basic", target) + if("disp_vol") + var/target = params["target"] + if(text2num(target) != null) + target = text2num(target) //Because the input is flipped + . = TRUE + if(.) + dispense_volume = target + if("help") + tutorial_active = !tutorial_active + if(tutorial_active) + tutorial_state = 1 + return + tutorial_state = 0 + //Refresh window size + ui_close(usr) + ui_interact(usr, null) + + +///Moves a type of buffer from the heater to the beaker, or vice versa +/obj/machinery/chem_heater/proc/move_buffer(buffer_type, volume) + if(!beaker) + say("No beaker found!") + return + if(buffer_type == "acid") + if(volume < 0) + var/datum/reagent/acid_reagent = beaker.reagents.get_reagent(/datum/reagent/reaction_agent/acidic_buffer) + if(!acid_reagent) + say("Unable to find acidic buffer in beaker to draw from! Please insert a beaker containing acidic buffer.") + return + var/datum/reagent/acid_reagent_heater = reagents.get_reagent(/datum/reagent/reaction_agent/acidic_buffer) + var/cur_vol = 0 + if(acid_reagent_heater) + cur_vol = acid_reagent_heater.volume + volume = 100 - cur_vol + beaker.reagents.trans_id_to(src, acid_reagent.type, volume)//negative because we're going backwards + return + //We must be positive here + reagents.trans_id_to(beaker, /datum/reagent/reaction_agent/acidic_buffer, dispense_volume) + return + + if(buffer_type == "basic") + if(volume < 0) + var/datum/reagent/basic_reagent = beaker.reagents.get_reagent(/datum/reagent/reaction_agent/basic_buffer) + if(!basic_reagent) + say("Unable to find basic buffer in beaker to draw from! Please insert a beaker containing basic buffer.") + return + var/datum/reagent/basic_reagent_heater = reagents.get_reagent(/datum/reagent/reaction_agent/basic_buffer) + var/cur_vol = 0 + if(basic_reagent_heater) + cur_vol = basic_reagent_heater.volume + volume = 100 - cur_vol + beaker.reagents.trans_id_to(src, basic_reagent.type, volume)//negative because we're going backwards + return + reagents.trans_id_to(beaker, /datum/reagent/reaction_agent/basic_buffer, dispense_volume) + return + + +/obj/machinery/chem_heater/proc/get_purity_color(datum/equilibrium/equilibrium) + var/_reagent = equilibrium.reaction.results[1] + var/datum/reagent/reagent = equilibrium.holder.get_reagent(_reagent) + switch(reagent.purity) + if(1 to INFINITY) + return "blue" + if(0.8 to 1) + return "green" + if(reagent.inverse_chem_val to 0.8) + return "olive" + if(equilibrium.reaction.purity_min to reagent.inverse_chem_val) + return "orange" + if(-INFINITY to equilibrium.reaction.purity_min) + return "red" + +//Has a lot of buffer and is upgraded +/obj/machinery/chem_heater/debug + name = "Debug Reaction Chamber" + desc = "Now with even more buffers!" + +/obj/machinery/chem_heater/debug/Initialize() + . = ..() + reagents.maximum_volume = 2000 + reagents.add_reagent(/datum/reagent/reaction_agent/basic_buffer, 980) + reagents.add_reagent(/datum/reagent/reaction_agent/acidic_buffer, 980) + heater_coefficient = 0.4 //hack way to upgrade diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 627ef2a3a22..425d111c1d5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -195,7 +195,7 @@ /obj/machinery/chem_master/ui_data(mob/user) var/list/data = list() data["isBeakerLoaded"] = beaker ? 1 : 0 - data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null + data["beakerCurrentVolume"] = beaker ? round(beaker.reagents.total_volume, 0.01) : null data["beakerMaxVolume"] = beaker ? beaker.volume : null data["mode"] = mode data["condi"] = condi @@ -213,13 +213,13 @@ var/beaker_contents[0] if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) - beaker_contents.Add(list(list("name" = R.name, "id" = ckey(R.name), "volume" = R.volume))) // list in a list because Byond merges the first list... + beaker_contents.Add(list(list("name" = R.name, "id" = ckey(R.name), "volume" = round(R.volume, 0.01)))) // list in a list because Byond merges the first list... data["beakerContents"] = beaker_contents var/buffer_contents[0] if(reagents.total_volume) for(var/datum/reagent/N in reagents.reagent_list) - buffer_contents.Add(list(list("name" = N.name, "id" = ckey(N.name), "volume" = N.volume))) // ^ + buffer_contents.Add(list(list("name" = N.name, "id" = ckey(N.name), "volume" = round(N.volume, 0.01)))) // ^ data["bufferContents"] = buffer_contents //Calculated at init time as it never changes @@ -261,9 +261,15 @@ if (!beaker) return FALSE if (to_container == "buffer") + var/datum/reagent/R = beaker.reagents.get_reagent(reagent) + if(!check_reactions(R, beaker.reagents)) + return FALSE beaker.reagents.trans_id_to(src, reagent, amount) return TRUE if (to_container == "beaker" && mode) + var/datum/reagent/R = reagents.get_reagent(reagent) + if(!check_reactions(R, reagents)) + return FALSE reagents.trans_id_to(beaker, reagent, amount) return TRUE return FALSE @@ -324,7 +330,7 @@ "Maximum [vol_each_max] units per item.", "How many units to fill?", vol_each_max)) - vol_each = clamp(vol_each, 0, vol_each_max) + vol_each = round(clamp(vol_each, 0, vol_each_max), 0.01) if(vol_each <= 0) return FALSE // Get item name @@ -420,7 +426,7 @@ state = "Gas" var/const/P = 3 //The number of seconds between life ticks var/T = initial(R.metabolization_rate) * (60 / P) - analyze_vars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold)) + analyze_vars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "pH" = initial(R.ph)) screen = "analyze" return TRUE @@ -569,6 +575,25 @@ container.lefthand_file = style["lefthand_file"] container.righthand_file = style["righthand_file"] + +//Checks to see if the target reagent is being created (reacting) and if so prevents transfer +//Only prevents reactant from being moved so that people can still manlipulate input reagents +/obj/machinery/chem_master/proc/check_reactions(datum/reagent/reagent, datum/reagents/holder) + if(!reagent) + return FALSE + var/canMove = TRUE + for(var/e in holder.reaction_list) + var/datum/equilibrium/E = e + if(E.reaction.reaction_flags & REACTION_COMPETITIVE) + continue + for(var/result in E.reaction.required_reagents) + var/datum/reagent/R = result + if(R == reagent.type) + canMove = FALSE + if(!canMove) + say("Cannot move arrested chemical reaction reagents!") + return canMove + /** * Machine that allows to identify and separate reagents in fitting container * as well as to create new containers with separated reagents in it. diff --git a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm new file mode 100644 index 00000000000..30bdf93ef11 --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm @@ -0,0 +1,129 @@ +/* +* A debug chem tester that will process through all recipies automatically and try to react them. +* Highlights low purity reactions and and reactions that don't happen +*/ +/obj/machinery/chem_recipe_debug + name = "chemical reaction tester" + density = TRUE + icon = 'icons/obj/chemical.dmi' + icon_state = "HPLC" + use_power = IDLE_POWER_USE + idle_power_usage = 40 + resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE + ///List of every reaction in the game kept locally for easy access + var/list/cached_reactions = list() + ///What index in the cached_reactions we're in + var/index = 1 + ///If the machine is currently processing through the list + var/processing = FALSE + ///Final output that highlights all of the reactions with inoptimal purity/voolume at base + var/problem_string + ///Final output that highlights all of the reactions with inoptimal purity/voolume at base + var/impure_string + ///The count of reactions that resolve between 1 - 0.9 purity + var/minorImpurity + ///The count of reactions that resolve below 0.9 purity + var/majorImpurity + ///If we failed to react this current chem so use a lower temp + var/failed = 0 + +///Create reagents datum +/obj/machinery/chem_recipe_debug/Initialize() + . = ..() + create_reagents(9000)//I want to make sure everything fits + +///Enable the machine +/obj/machinery/chem_recipe_debug/attackby(obj/item/I, mob/user, params) + . = .() + if(processing) + say("currently processing reaction [index]: [cached_reactions[index]] of [cached_reactions.len]") + return + say("Starting processing") + setup_reactions() + begin_processing() + +///Enable the machine +/obj/machinery/chem_recipe_debug/AltClick(mob/living/user) + . = ..() + if(processing) + say("currently processing reaction [index]: [cached_reactions[index]] of [cached_reactions.len]") + return + say("Starting processing") + setup_reactions() + begin_processing() + +///Resets the index, and creates the cached_reaction list from all possible reactions +/obj/machinery/chem_recipe_debug/proc/setup_reactions() + cached_reactions = list() + for(var/V in GLOB.chemical_reactions_list) + if(is_type_in_list(GLOB.chemical_reactions_list[V], cached_reactions)) + continue + cached_reactions += GLOB.chemical_reactions_list[V] + reagents.clear_reagents() + index = 1 + processing = TRUE + +/* +* The main loop that sets up, creates and displays results from a reaction +* warning: this code is a hot mess +*/ +/obj/machinery/chem_recipe_debug/process(delta_time) + if(processing == FALSE) + setup_reactions() + if(reagents.is_reacting == TRUE) + return + if(index >= cached_reactions.len) + say("Completed testing, missing reactions products (may have exploded) are:") + say("[problem_string]") + say("Problem with results are:") + say("[impure_string]") + say("Reactions with minor impurity: [minorImpurity], reactions with major impurity: [majorImpurity]") + processing = FALSE + end_processing() + if(reagents.reagent_list) + say("Reaction completed for [cached_reactions[index]] final temperature = [reagents.chem_temp], ph = [reagents.ph].") + var/datum/chemical_reaction/C = cached_reactions[index] + for(var/R in C.results) + var/datum/reagent/R2 = reagents.get_reagent(R) + if(!R2) + say("Unable to find product [R] in holder after reaction! reagents found are:") + for(var/R3 in reagents.reagent_list) + say("[R3]") + var/obj/item/reagent_containers/glass/beaker/bluespace/B = new /obj/item/reagent_containers/glass/beaker/bluespace(loc) + reagents.trans_to(B) + B.name = "[cached_reactions[index]]" + if(failed > 0) + problem_string += "[cached_reactions[index]] Unable to find product [R] in holder after reaction! index:[index]\n" + failed++ + continue + say("Reaction has a product [R] [R2.volume]u purity of [R2.purity]") + if(R2.purity < 0.9) + impure_string += "Reaction [cached_reactions[index]] has a product [R] [R2.volume]u purity of [R2.purity] index:[index]\n" + majorImpurity++ + else if (R2.purity < 1) + impure_string += "Reaction [cached_reactions[index]] has a product [R] [R2.volume]u purity of [R2.purity] index:[index]\n" + minorImpurity++ + if(R2.volume < C.results[R]) + impure_string += "Reaction [cached_reactions[index]] has a product [R] [R2.volume]u purity of [R2.purity] index:[index]\n" + reagents.clear_reagents() + if(failed > 1) + index++ + failed = 0 + if(failed == 0) + index++ + var/datum/chemical_reaction/C = cached_reactions[index] + if(!C) + say("Unable to find reaction on index: [index]") + for(var/R in C.required_reagents) + reagents.add_reagent(R, C.required_reagents[R]*20) + for(var/cat in C.required_catalysts) + reagents.add_reagent(cat, C.required_catalysts[cat]) + if(failed == 0) + reagents.chem_temp = C.optimal_temp + if(failed == 1) + reagents.chem_temp = C.required_temp+25 + failed++ + say("Reacting [cached_reactions[index]] starting pH: [reagents.ph] index [index] of [cached_reactions.len]") + if(C.reaction_flags & REACTION_INSTANT) + say("This reaction is instant") + diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 480f5f949f2..59d04f3d8f0 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -44,6 +44,12 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/current_cycle = 0 ///pretend this is moles var/volume = 0 + /// pH of the reagent + var/ph = 7 + ///Purity of the reagent - for use with internal reaction mechanics only. Use below (creation_purity) if you're writing purity effects into a reagent's use mechanics. + var/purity = 1 + ///the purity of the reagent on creation (i.e. when it's added to a mob and it's purity split it into 2 chems; the purity of the resultant chems are kept as 1, this tracks what the purity was before that) + var/creation_purity = 1 /// color it looks in containers etc var/color = "#000000" // rgb: 0, 0, 0 /// can this reagent be synthesized? (for example: odysseus syringe gun) @@ -76,6 +82,17 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/list/reagent_removal_skip_list = list() ///The set of exposure methods this penetrates skin with. var/penetrates_skin = VAPOR + /// See fermi_readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_INVISIBLE, REAGENT_SNEAKYNAME, REAGENT_SPLITRETAINVOL + var/chemical_flags = NONE + ///impure chem values (see fermi_readme.dm for more details on impure/inverse/failed mechanics): + /// What chemical path is made when metabolised as a function of purity + var/impure_chem = /datum/reagent/impurity + /// If the impurity is below 0.5, replace ALL of the chem with inverse_chem upon metabolising + var/inverse_chem_val = 0.25 + /// What chem is metabolised when purity is below inverse_chem_val + var/inverse_chem = /datum/reagent/impurity/toxic + ///what chem is made at the end of a reaction IF the purity is below the recipies purity_min at the END of a reaction only + var/failed_chem = /datum/reagent/consumable/failed_reaction /datum/reagent/New() SHOULD_CALL_PARENT(TRUE) @@ -128,13 +145,19 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) return holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. +/* +Used to run functions before a reagent is transfered. Returning TRUE will block the transfer attempt. +Primarily used in reagents/reaction_agents +*/ +/datum/reagent/proc/intercept_reagents_transfer(datum/reagents/target) + return FALSE + ///Called after a reagent is transfered /datum/reagent/proc/on_transfer(atom/A, methods=TOUCH, trans_volume) return - /// Called when this reagent is first added to a mob -/datum/reagent/proc/on_mob_add(mob/living/L) +/datum/reagent/proc/on_mob_add(mob/living/L, amount) return /// Called when this reagent is removed while inside a mob @@ -149,6 +172,15 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) /datum/reagent/proc/on_mob_end_metabolize(mob/living/L) return +/// Called when a reagent is inside of a mob when they are dead +/datum/reagent/proc/on_mob_dead(mob/living/carbon/C) + if(!(chemical_flags & REAGENT_DEAD_PROCESS)) + return + current_cycle++ + if(length(reagent_removal_skip_list)) + return + holder.remove_reagent(type, metabolization_rate * C.metabolism_efficiency) + /// Called by [/datum/reagents/proc/conditional_update_move] /datum/reagent/proc/on_move(mob/M) return @@ -158,7 +190,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) return /// Called when two reagents of the same are mixing. -/datum/reagent/proc/on_merge(data) +/datum/reagent/proc/on_merge(data, amount) return /// Called by [/datum/reagents/proc/conditional_update] diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 2857ea5830c..8056540ccd6 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -14,6 +14,7 @@ nutriment_factor = 0 taste_description = "alcohol" metabolization_rate = 0.5 * REAGENTS_METABOLISM + ph = 7.33 var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning /* @@ -89,6 +90,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "piss water" glass_name = "glass of beer" glass_desc = "A freezing pint of beer." + ph = 4 // Beer is a chemical composition of alcohol and various other things. It's a garbage nutrient but hey, it's still one. Also alcohol is bad, mmmkay? @@ -105,6 +107,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "dish water" glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." + ph = 5 /datum/reagent/consumable/ethanol/beer/maltliquor name = "Malt Liquor" @@ -113,6 +116,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "sweet corn beer and the hood life" glass_name = "glass of malt liquor" glass_desc = "A freezing pint of malt liquor." + ph = 4.8 /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" @@ -122,6 +126,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "greenbeerglass" glass_name = "glass of green beer" glass_desc = "A freezing pint of green beer. Festive." + ph = 6 /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M) @@ -141,6 +146,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of RR coffee liquor" glass_desc = "DAMN, THIS THING LOOKS ROBUST!" shot_glass_icon_state = "shotglasscream" + ph = 6 /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M) M.dizziness = max(0,M.dizziness-5) @@ -161,6 +167,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." shot_glass_icon_state = "shotglassbrown" + ph = 4.5 /datum/reagent/consumable/ethanol/whiskey/kong name = "Kong" @@ -285,6 +292,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of vodka" glass_desc = "The glass contain wodka. Xynta." shot_glass_icon_state = "shotglassclear" + ph = 8.1 /datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M) M.radiation = max(M.radiation-2,0) @@ -317,6 +325,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "threemileislandglass" glass_name = "Three Mile Island Ice Tea" glass_desc = "A glass of this is sure to prevent a meltdown." + ph = 3.5 /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -331,6 +340,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginvodkaglass" glass_name = "glass of gin" glass_desc = "A crystal clear glass of Griffeater gin." + ph = 6.9 /datum/reagent/consumable/ethanol/rum name = "Rum" @@ -342,6 +352,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of rum" glass_desc = "Now you want to Pray for a pirate suit, don't you?" shot_glass_icon_state = "shotglassbrown" + ph = 6.5 /datum/reagent/consumable/ethanol/tequila name = "Tequila" @@ -353,6 +364,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of tequila" glass_desc = "Now all that's missing is the weird colored shades!" shot_glass_icon_state = "shotglassgold" + ph = 4 /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" @@ -364,6 +376,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of vermouth" glass_desc = "You wonder why you're even drinking this straight." shot_glass_icon_state = "shotglassclear" + ph = 3.25 /datum/reagent/consumable/ethanol/wine name = "Wine" @@ -375,6 +388,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of wine" glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" + ph = 3.45 /datum/reagent/consumable/ethanol/wine/on_merge(data) . = ..() @@ -396,6 +410,7 @@ All effects don't start immediately, but rather get worse over time; the rate is boozepwr = 45 quality = DRINK_FANTASTIC taste_description = "scaley sweetness" + ph = 3 /datum/reagent/consumable/ethanol/grappa name = "Grappa" @@ -406,6 +421,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grappa" glass_name = "glass of grappa" glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." + ph = 3.5 /datum/reagent/consumable/ethanol/amaretto name = "Amaretto" @@ -428,6 +444,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." shot_glass_icon_state = "shotglassbrown" + ph = 3.5 /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" @@ -471,6 +488,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aleglass" glass_name = "glass of ale" glass_desc = "A freezing pint of delicious Ale." + ph = 4.5 /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" @@ -532,6 +550,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of patron" glass_desc = "Drinking patron in the bar, with all the subpar ladies." shot_glass_icon_state = "shotglassclear" + ph = 4.5 /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" @@ -543,6 +562,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gintonicglass" glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." + ph = 3 /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" @@ -554,6 +574,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "Rum and Coke" glass_desc = "The classic go-to of space-fratboys." + ph = 4 /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -744,6 +765,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." overdose_threshold = 40 var/datum/brain_trauma/special/beepsky/B + ph = 2 /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) @@ -1657,6 +1679,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Bastion Bourbon" glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." shot_glass_icon_state = "shotglassgreen" + ph = 4 /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/L) var/heal_points = 10 @@ -1987,6 +2010,7 @@ All effects don't start immediately, but rather get worse over time; the rate is can_synth = FALSE var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. var/list/tastes = list("bad coding" = 1) //List of tastes. See above. + ph = 4 /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) names = data["names"] @@ -1996,6 +2020,7 @@ All effects don't start immediately, but rather get worse over time; the rate is generate_data_info(data) /datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) + ..() var/diff = (amount/volume) if(diff < 1) color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. @@ -2079,7 +2104,6 @@ All effects don't start immediately, but rather get worse over time; the rate is flavor += english_list(secondary_tastes) taste_description = flavor - /datum/reagent/consumable/ethanol/champagne //How the hell did we not have champagne already!? name = "Champagne" description = "A sparkling wine known for its ability to strike fast and hard." diff --git a/code/modules/reagents/chemistry/reagents/catalyst_reagents.dm b/code/modules/reagents/chemistry/reagents/catalyst_reagents.dm new file mode 100644 index 00000000000..6e4e2b56c7e --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/catalyst_reagents.dm @@ -0,0 +1,48 @@ +///These alter reaction conditions while they're in the beaker +/datum/reagent/catalyst_agent + name ="Catalyst agent" + ///The typepath of the reagent they that they affect + var/target_reagent_type + ///The minimumvolume required in the beaker for them to have an effect + var/min_volume = 10 + ///The value in which the associated type is modified + var/modifier = 1 + +/datum/reagent/catalyst_agent/proc/consider_catalyst(datum/equilibrium/equilibrium) + for(var/_product in equilibrium.reaction.results) + if(ispath(_product, target_reagent_type)) + return TRUE + return FALSE + +/datum/reagent/catalyst_agent/speed + name ="Speed catalyst agent" + +/datum/reagent/catalyst_agent/speed/consider_catalyst(datum/equilibrium/equilibrium) + . = ..() + if(.) + equilibrium.speed_mod = creation_purity*modifier //So a purity 1 = the modifier, and a purity 0 = the inverse modifier. For this we don't want a negative speed_mod (I have no idea what happens if we do) + equilibrium.time_deficit += (creation_purity)*(0.05 * modifier) //give the reaction a little boost too (40% faster) + +/datum/reagent/catalyst_agent/ph + name ="pH catalyst agent" + +/datum/reagent/catalyst_agent/ph/consider_catalyst(datum/equilibrium/equilibrium) + . = ..() + if(.) + equilibrium.h_ion_mod = ((creation_purity-0.5)*2)*modifier //So a purity 1 = the modifier, and a purity 0 = the inverse modifier + +/datum/reagent/catalyst_agent/temperature + name = "Temperature catalyst agent" + +/datum/reagent/catalyst_agent/temperature/consider_catalyst(datum/equilibrium/equilibrium) + . = ..() + if(.) + equilibrium.thermic_mod = ((creation_purity-0.5)*2)*modifier //So a purity 1 = the modifier, and a purity 0 = the inverse modifier + +///These affect medicines +/datum/reagent/catalyst_agent/speed/medicine + name = "Palladium synthate catalyst" + target_reagent_type = /datum/reagent/medicine + modifier = 2 + ph = 2 //drift towards acidity + color = "#b1b1b1" diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 6e0bb7c6e37..cae3737431e 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -12,6 +12,7 @@ glass_icon_state = "glass_orange" glass_name = "glass of orange juice" glass_desc = "Vitamins! Yay!" + ph = 3.3 /datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/M) if(M.getOxyLoss() && prob(30)) @@ -42,6 +43,7 @@ glass_icon_state = "glass_green" glass_name = "glass of lime juice" glass_desc = "A glass of sweet-sour lime juice." + ph = 2.2 /datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M) if(M.getToxLoss() && prob(20)) @@ -84,6 +86,7 @@ description = "The sweet juice of an apple, fit for all ages." color = "#ECFF56" // rgb: 236, 255, 86 taste_description = "apples" + ph = 3.2 // ~ 2.7 -> 3.7 /datum/reagent/consumable/poisonberryjuice name = "Poison Berry Juice" @@ -116,6 +119,7 @@ glass_icon_state = "lemonglass" glass_name = "glass of lemon juice" glass_desc = "Sour..." + ph = 2 /datum/reagent/consumable/banana name = "Banana Juice" @@ -199,6 +203,7 @@ glass_icon_state = "glass_white" glass_name = "glass of milk" glass_desc = "White and nutritious goodness!" + ph = 6.5 // Milk is good for humans, but bad for plants. The sugars cannot be used by plants, and the milk fat harms growth. Not shrooms though. I can't deal with this now... /datum/reagent/consumable/milk/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 0137d78c981..3ebae322563 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -13,6 +13,7 @@ description = "An illegal chemical compound used as drug." color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 30 + ph = 9 /datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/M) M.set_drugginess(15) @@ -43,6 +44,7 @@ trippy = FALSE overdose_threshold=15 metabolization_rate = 0.125 * REAGENTS_METABOLISM + ph = 8 //Nicotine is used as a pesticide IRL. /datum/reagent/drug/nicotine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -77,6 +79,7 @@ color = "#FA00C8" overdose_threshold = 20 addiction_threshold = 10 + ph = 10 /datum/reagent/drug/crank/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -126,6 +129,7 @@ color = "#0064B4" overdose_threshold = 20 addiction_threshold = 15 + ph = 9 /datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/M) @@ -178,6 +182,7 @@ overdose_threshold = 20 addiction_threshold = 10 metabolization_rate = 0.75 * REAGENTS_METABOLISM + ph = 5 /datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L) ..() @@ -263,6 +268,7 @@ addiction_threshold = 10 taste_description = "salt" // because they're bathsalts? var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage + ph = 8.2 /datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L) ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 0d6db2360bd..edac90b89ef 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -13,6 +13,10 @@ taste_mult = 4 var/nutriment_factor = 1 * REAGENTS_METABOLISM var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes + impure_chem = /datum/reagent/water + inverse_chem_val = 0.1 + inverse_chem = /datum/reagent/water + failed_chem = /datum/reagent/consumable/nutriment /datum/reagent/consumable/on_mob_life(mob/living/carbon/M) current_cycle++ @@ -78,6 +82,7 @@ data = counterlist_normalise(supplied_data) /datum/reagent/consumable/nutriment/on_merge(list/newdata, newvolume) + . = ..() if(!islist(newdata) || !newdata.len) return @@ -272,6 +277,7 @@ description = "A special oil that noticeably chills the body. Extracted from chilly peppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" + ph = 13 //HMM! I wonder /datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M) var/cooling = 0 @@ -320,6 +326,7 @@ color = "#B31008" // rgb: 179, 16, 8 taste_description = "scorching agony" penetrates_skin = NONE + ph = 7.4 /datum/reagent/consumable/condensedcapsaicin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -395,6 +402,7 @@ color = "#E700E7" // rgb: 231, 0, 231 metabolization_rate = 0.2 * REAGENTS_METABOLISM taste_description = "mushroom" + ph = 11 /datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/M) if(!M.slurring) @@ -638,6 +646,7 @@ description = "A blinding substance extracted from certain onions." color = "#c0c9a0" taste_description = "bitterness" + ph = 5 /datum/reagent/consumable/tearjuice/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -681,6 +690,7 @@ description = "An ichor, derived from a certain mushroom, makes for a bad time." color = "#1d043d" taste_description = "bitter mushroom" + ph = 12 /datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M) if(current_cycle >= 10) @@ -701,6 +711,7 @@ description = "A stimulating ichor which causes luminescent fungi to grow on the skin. " color = "#b5a213" taste_description = "tingling mushroom" + ph = 11.2 //Lazy list of mobs affected by the luminosity of this reagent. var/list/mobs_affected @@ -734,6 +745,7 @@ color = "#d3a308" nutriment_factor = 3 * REAGENTS_METABOLISM taste_description = "fruity mushroom" + ph = 10.4 /datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M) if(prob(80)) @@ -748,6 +760,7 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#eef442" // rgb: 238, 244, 66 taste_description = "mournful honking" + ph = 9.2 /datum/reagent/consumable/liquidelectricity @@ -799,6 +812,7 @@ quality = FOOD_AMAZING taste_mult = 100 can_synth = FALSE + ph = 6.1 /datum/reagent/consumable/nutriment/peptides name = "Peptides" diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm new file mode 100644 index 00000000000..92cea81f3df --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -0,0 +1,39 @@ +//Reagents produced by metabolising/reacting fermichems inoptimally, i.e. inverse_chems or impure_chems +//Inverse = Splitting +//Invert = Whole conversion + +//Causes slight liver damage, and that's it. +/datum/reagent/impurity + name = "Chemical Isomers" + description = "Impure chemical isomers made from inoptimal reactions. Causes mild liver damage" + //by default, it will stay hidden on splitting, but take the name of the source on inverting. Cannot be fractioned down either if the reagent is somehow isolated. + chemical_flags = REAGENT_INVISIBLE | REAGENT_SNEAKYNAME | REAGENT_DONOTSPLIT + ph = 3 + overdose_threshold = 0 //So that they're shown as a problem (?) + +/datum/reagent/impurity/on_mob_life(mob/living/carbon/C) + var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) + if(!L)//Though, lets be safe + C.adjustToxLoss(1, FALSE)//Incase of no liver! + return ..() + C.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.5*REM) + return ..() + +/datum/reagent/impurity/toxic + name = "Toxic sludge" + description = "Toxic chemical isomers made from impure reactions. Causes toxin damage" + ph = 2 + +/datum/reagent/impurity/toxic/on_mob_life(mob/living/carbon/C) + C.adjustToxLoss(1, FALSE) + return ..() + +//technically not a impure chem, but it's here because it can only be made with a failed impure reaction +/datum/reagent/consumable/failed_reaction + name = "Viscous sludge" + description = "A off smelling sludge that's created when a reaction gets too impure." + nutriment_factor = -1 + quality = -1 + ph = 1.5 + taste_description = "an awful, strongly chemical taste" + color = "#270d03" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index f9c760893ac..874e8f5dc96 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -19,6 +19,7 @@ /datum/reagent/medicine/leporazine name = "Leporazine" description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." + ph = 8.4 color = "#DB90C6" /datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M) @@ -109,6 +110,7 @@ name = "Synaptizine" description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." color = "#FF00FF" + ph = 4 /datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) @@ -129,6 +131,7 @@ name = "Diphen-Synaptizine" description = "Reduces drowsiness, hallucinations, and Histamine from body." color = "#EC536D" // rgb: 236, 83, 109 + ph = 5.2 /datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) @@ -147,6 +150,7 @@ description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly." color = "#0000C8" taste_description = "blue" + ph = 11 /datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M) var/power = -0.00003 * (M.bodytemperature ** 2) + 3 @@ -175,6 +179,7 @@ description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone." color = "#3D3DC6" taste_description = "muscle" + ph = 13 metabolization_rate = 1.5 * REAGENTS_METABOLISM /datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M) @@ -190,6 +195,7 @@ description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." color = "#f7832a" taste_description = "spicy jelly" + ph = 12 /datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M) if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) @@ -222,6 +228,7 @@ reagent_state = SOLID color = "#669900" // rgb: 102, 153, 0 overdose_threshold = 30 + ph = 12.2 taste_description = "fish" /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) @@ -253,6 +260,7 @@ description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with. Also reduces infection in serious burns." color = "#E1F2E6" metabolization_rate = 0.1 * REAGENTS_METABOLISM + ph = 8.1 //Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. @@ -263,6 +271,7 @@ color = "#1E8BFF" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 + ph = 10.7 /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) if(M.getFireLoss() > 25) @@ -289,6 +298,7 @@ var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick + ph = 5.5 /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) if(last_added) @@ -326,6 +336,7 @@ reagent_state = LIQUID color = "#6D6374" metabolization_rate = 0.4 * REAGENTS_METABOLISM + ph = 2.6 /datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C) C.hal_screwyhud = SCREWYHUD_HEALTHY @@ -367,6 +378,7 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 var/healing = 0.5 + ph = 2 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-healing*REM, 0) @@ -397,6 +409,7 @@ color = "#19C832" metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "acid" + ph = 1.5 /datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/toxin/R in M.reagents.reagent_list) @@ -412,6 +425,7 @@ reagent_state = LIQUID color = "#BAA15D" metabolization_rate = 2 * REAGENTS_METABOLISM + ph = 12 //It's a reducing agent /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M) if(M.radiation > 0) @@ -424,6 +438,7 @@ reagent_state = LIQUID color = "#E6FFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM + ph = 1 //One of the best buffers, NEVERMIND! /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M) M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50 @@ -441,6 +456,7 @@ color = "#D2D2D2" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 + ph = 2.1 /datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M) if(M.getBruteLoss() > 25) @@ -462,6 +478,7 @@ reagent_state = LIQUID color = "#00FFFF" metabolization_rate = 0.25 * REAGENTS_METABOLISM + ph = 2 /datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M) M.adjustOxyLoss(-3*REM, 0) @@ -478,6 +495,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 30 addiction_threshold = 25 + ph = 12 /datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L) ..() @@ -571,6 +589,7 @@ reagent_state = LIQUID color = "#64FFE6" metabolization_rate = 0.5 * REAGENTS_METABOLISM + ph = 11.5 /datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -587,6 +606,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 30 addiction_threshold = 25 + ph = 8.96 /datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L) ..() @@ -656,6 +676,7 @@ color = "#404040" //oculine is dark grey, inacusiate is light grey metabolization_rate = 0.25 * REAGENTS_METABOLISM taste_description = "dull toxin" + ph = 10 /datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/M) var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) @@ -680,6 +701,7 @@ name = "Inacusiate" description = "Rapidly repairs damage to the patient's ears to cure deafness, assuming the source of said deafness isn't from genetic mutations, chronic deafness, or a total defecit of ears." //by "chronic" deafness, we mean people with the "deaf" quirk color = "#606060" // ditto + ph = 2 /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) @@ -693,6 +715,7 @@ color = "#1D3535" //slightly more blue, like epinephrine metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 35 + ph = 12 /datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M) if(M.health <= M.crit_threshold) @@ -721,6 +744,7 @@ color = "#D2FFFA" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + ph = 10.2 /datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/M) ..() @@ -769,6 +793,7 @@ metabolization_rate = 1.25 * REAGENTS_METABOLISM taste_description = "magnets" harmful = TRUE + ph = 0.5 // FEED ME SEYMOUR @@ -810,6 +835,7 @@ name = "Mannitol" description = "Efficiently restores brain damage." color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey + ph = 10.4 /datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C) C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM) @@ -841,6 +867,7 @@ description = "Removes jitteriness and restores genetic defects." color = "#5096C8" taste_description = "acid" + ph = 2 /datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M) M.jitteriness = 0 @@ -854,6 +881,7 @@ description = "Purges alcoholic substance from the patient's body and eliminates its side effects." color = "#00B4C8" taste_description = "raw egg" + ph = 4 /datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M) M.dizziness = 0 @@ -874,6 +902,7 @@ color = "#78008C" metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 + ph = 8.7 /datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) ..() @@ -910,6 +939,7 @@ reagent_state = LIQUID color = "#FFFFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM + ph = 6.7 /datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M) if(M.AdjustSleeping(-20)) @@ -924,6 +954,7 @@ description = "Stabilizes the breathing of patients. Good for those in critical condition." reagent_state = LIQUID color = "#A4D8D8" + ph = 8.5 /datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M) if(M.losebreath >= 5) @@ -961,6 +992,7 @@ reagent_state = SOLID color = "#555555" overdose_threshold = 30 + ph = 11 /datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment. @@ -985,6 +1017,7 @@ color = "#FFAF00" metabolization_rate = 0.4 //Math is based on specific metab rate so we want this to be static AKA if define or medicine metab rate changes, we want this to stay until we can rework calculations. overdose_threshold = 25 + ph = 11 /datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M) if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE @@ -1036,6 +1069,7 @@ reagent_state = LIQUID color = "#27870a" metabolization_rate = 0.4 * REAGENTS_METABOLISM + ph = 4.3 /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M) for(var/datum/reagent/drug/R in M.reagents.reagent_list) @@ -1155,6 +1189,7 @@ overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested) taste_description = "salt" // it actually does taste salty var/overdose_progress = 0 // to track overdose progress + ph = 7.89 /datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/M) ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type) @@ -1217,6 +1252,7 @@ color = "#07E79E" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + ph = 9.12 /datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/L) ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 6aa79bdd1aa..46dad657c11 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -10,6 +10,7 @@ glass_desc = "Are you sure this is tomato juice?" shot_glass_icon_state = "shotglassred" penetrates_skin = NONE + ph = 7.4 /datum/reagent/blood/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) . = ..() @@ -94,7 +95,8 @@ description = "You don't even want to think about what's in here." taste_description = "gross iron" shot_glass_icon_state = "shotglassred" - //material = /datum/material/meat //SKYRAT EDIT REMOVAL + material = /datum/material/meat + ph = 7.45 /datum/reagent/vaccine //data must contain virus type @@ -217,6 +219,7 @@ glass_name = "glass of holy water" glass_desc = "A glass of holy water." self_consuming = TRUE //divine intervention won't be limited by the lack of a liver + ph = 7.5 //God is alkaline /datum/reagent/water/holywater/on_mob_metabolize(mob/living/L) ..() @@ -297,6 +300,7 @@ glass_name = "glass of oxygenated water" glass_desc = "The father of all refreshments. Surely it tastes great, right?" shot_glass_icon_state = "shotglassclear" + ph = 6.2 /* * Water reaction to turf @@ -323,6 +327,7 @@ taste_description = "suffering" metabolization_rate = 2.5 * REAGENTS_METABOLISM //1u/tick penetrates_skin = TOUCH|VAPOR + ph = 6.5 /datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M) if(iscultist(M)) @@ -347,6 +352,7 @@ name = "Hell Water" description = "YOUR FLESH! IT BURNS!" taste_description = "burning" + ph = 0.1 /datum/reagent/hellwater/on_mob_life(mob/living/carbon/M) M.set_fire_stacks(min(5, M.fire_stacks + 3)) @@ -389,6 +395,7 @@ metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle. taste_description = "sour oranges" + ph = 5 /datum/reagent/spraytan/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) . = ..() @@ -699,6 +706,7 @@ color = "#202040" // rgb: 20, 20, 40 metabolization_rate = 0.25 * REAGENTS_METABOLISM taste_description = "bitterness" + ph = 10 /datum/reagent/serotrotium/on_mob_life(mob/living/carbon/M) if(ishuman(M)) @@ -712,6 +720,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_mult = 0 // oderless and tasteless + ph = 9.2//It's acutally a huge range and very dependant on the chemistry but ph is basically a made up var in it's implementation anyways /datum/reagent/oxygen/expose_turf(turf/open/exposed_turf, reac_volume) @@ -727,6 +736,7 @@ reagent_state = SOLID color = "#6E3B08" // rgb: 110, 59, 8 taste_description = "metal" + ph = 5.5 /datum/reagent/copper/expose_obj(obj/exposed_obj, reac_volume) . = ..() @@ -757,6 +767,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_mult = 0 + ph = 0.1//Now I'm stuck in a trap of my own design. Maybe I should make -ve phes? (not 0 so I don't get div/0 errors) /datum/reagent/potassium name = "Potassium" @@ -785,6 +796,7 @@ reagent_state = SOLID color = "#BF8C00" // rgb: 191, 140, 0 taste_description = "rotten eggs" + ph = 4.5 /datum/reagent/carbon name = "Carbon" @@ -792,6 +804,7 @@ reagent_state = SOLID color = "#1C1300" // rgb: 30, 20, 0 taste_description = "sour chalk" + ph = 5 /datum/reagent/carbon/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -808,6 +821,7 @@ reagent_state = GAS color = "#FFFB89" //pale yellow? let's make it light gray taste_description = "chlorine" + ph = 7.4 // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial @@ -832,6 +846,7 @@ reagent_state = GAS color = "#808080" // rgb: 128, 128, 128 taste_description = "acid" + ph = 2 // You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial /datum/reagent/fluorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -853,6 +868,7 @@ reagent_state = SOLID color = "#808080" // rgb: 128, 128, 128 taste_description = "salty metal" + ph = 11.6 /datum/reagent/phosphorus name = "Phosphorus" @@ -860,6 +876,7 @@ reagent_state = SOLID color = "#832828" // rgb: 131, 40, 40 taste_description = "vinegar" + ph = 6.5 // Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. /datum/reagent/phosphorus/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -875,6 +892,7 @@ reagent_state = SOLID color = "#808080" // rgb: 128, 128, 128 taste_description = "metal" + ph = 11.3 /datum/reagent/lithium/on_mob_life(mob/living/carbon/M) if(!HAS_TRAIT(M, TRAIT_IMMOBILIZED) && !isspaceturf(M.loc)) @@ -888,12 +906,14 @@ description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." color = "#D3B913" taste_description = "sweetness" + ph = 9 /datum/reagent/space_cleaner/sterilizine name = "Sterilizine" description = "Sterilizes wounds in preparation for surgery." color = "#D0EFEE" // space cleaner but lighter taste_description = "bitterness" + ph = 10.5 /datum/reagent/space_cleaner/sterilizine/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) . = ..() @@ -912,6 +932,7 @@ material = /datum/material/iron color = "#606060" //pure iron? let's make it violet of course + ph = 6 /datum/reagent/iron/on_mob_life(mob/living/carbon/C) if(C.blood_volume < BLOOD_VOLUME_NORMAL) @@ -941,6 +962,7 @@ color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother? taste_description = "the inside of a reactor" var/irradiation_level = 1 + ph = 4 material = /datum/material/uranium /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) @@ -974,6 +996,7 @@ taste_description = "the colour blue and regret" irradiation_level = 2*REM material = null + ph = 10 /datum/reagent/uranium/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) . = ..() @@ -988,6 +1011,7 @@ color = "#0000CC" taste_description = "fizzling blue" material = /datum/material/bluespace + ph = 12 /datum/reagent/bluespace/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -1019,6 +1043,7 @@ color = "#A8A8A8" // rgb: 168, 168, 168 taste_mult = 0 material = /datum/material/glass + ph = 10 /datum/reagent/fuel name = "Welding fuel" @@ -1029,6 +1054,7 @@ glass_name = "glass of welder fuel" glass_desc = "Unless you're an industrial tool, this is probably not safe for consumption." penetrates_skin = NONE + ph = 4 /datum/reagent/fuel/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite! . = ..() @@ -1048,6 +1074,7 @@ reagent_weight = 0.6 //so it sprays further penetrates_skin = NONE var/clean_types = CLEAN_WASH + ph = 5.5 /datum/reagent/space_cleaner/expose_obj(obj/exposed_obj, reac_volume) . = ..() @@ -1079,6 +1106,7 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "acid" penetrates_skin = VAPOR + ph = 2 /datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(3.33) @@ -1098,6 +1126,7 @@ color = "#ADB5DB" //i hate default violets and 'crypto' keeps making me think of cryo so it's light blue now metabolization_rate = 1.5 * REAGENTS_METABOLISM taste_description = "sourness" + ph = 11.9 /datum/reagent/cryptobiolin/on_mob_life(mob/living/carbon/M) M.Dizzy(1) @@ -1109,6 +1138,7 @@ description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." color = "#E07DDD" // pink = happy = dumb taste_description = "numbness" + ph = 9.1 /datum/reagent/impedrezene/on_mob_life(mob/living/carbon/M) M.jitteriness = max(M.jitteriness-5,0) @@ -1153,6 +1183,7 @@ can_synth = FALSE taste_description = "slime" penetrates_skin = NONE + ph = 11 /datum/reagent/fungalspores/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() @@ -1166,6 +1197,7 @@ taste_description = "goo" can_synth = FALSE //special orange man request penetrates_skin = NONE + ph = 11 /datum/reagent/snail/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() @@ -1177,6 +1209,7 @@ description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." color = "#9E6B38" // rgb: 158, 107, 56 taste_description = "metal" + ph = 11 /datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. name = "Foaming agent" @@ -1184,6 +1217,7 @@ reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" + ph = 11.5 /datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. name = "Smart foaming agent" @@ -1191,6 +1225,7 @@ reagent_state = SOLID color = "#664B63" // rgb: 102, 75, 99 taste_description = "metal" + ph = 11.8 /datum/reagent/ammonia name = "Ammonia" @@ -1198,6 +1233,7 @@ reagent_state = GAS color = "#404030" // rgb: 64, 64, 48 taste_description = "mordant" + ph = 11.6 /datum/reagent/ammonia/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) . = ..() @@ -1213,6 +1249,7 @@ description = "A secondary amine, mildly corrosive." color = "#604030" // rgb: 96, 64, 48 taste_description = "iron" + ph = 12 // This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. The new trade off is it culls stability. /datum/reagent/diethylamine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -1230,6 +1267,7 @@ description = "A gas commonly produced by burning carbon fuels. You're constantly producing this in your lungs." color = "#B0B0B0" // rgb : 192, 192, 192 taste_description = "something unknowable" + ph = 6 /datum/reagent/carbondioxide/expose_turf(turf/open/exposed_turf, reac_volume) if(istype(exposed_turf)) @@ -1244,6 +1282,7 @@ metabolization_rate = 1.5 * REAGENTS_METABOLISM color = "#808080" taste_description = "sweetness" + ph = 5.8 /datum/reagent/nitrous_oxide/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() @@ -1273,6 +1312,7 @@ metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because stimulum/nitryl/freon/hypernoblium are handled through gas breathing, metabolism must be lower for breathcode to keep up color = "E1A116" taste_description = "sourness" + ph = 1.8 /datum/reagent/stimulum/on_mob_metabolize(mob/living/L) ..() @@ -1296,6 +1336,7 @@ metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because stimulum/nitryl/freon/hypernoblium are handled through gas breathing, metabolism must be lower for breathcode to keep up color = "90560B" taste_description = "burning" + ph = 2 /datum/reagent/nitryl/on_mob_metabolize(mob/living/L) ..() @@ -1404,18 +1445,21 @@ colorname = "red" color = "#DA0000" // red random_color_list = list("#FC7474") + ph = 0.5 /datum/reagent/colorful_reagent/powder/orange name = "Orange Powder" colorname = "orange" color = "#FF9300" // orange random_color_list = list("#FF9300") + ph = 2 /datum/reagent/colorful_reagent/powder/yellow name = "Yellow Powder" colorname = "yellow" color = "#FFF200" // yellow random_color_list = list("#FFF200") + ph = 5 /datum/reagent/colorful_reagent/powder/green name = "Green Powder" @@ -1428,12 +1472,14 @@ colorname = "blue" color = "#00B7EF" // blue random_color_list = list("#71CAE5") + ph = 10 /datum/reagent/colorful_reagent/powder/purple name = "Purple Powder" colorname = "purple" color = "#DA00FF" // purple random_color_list = list("#BD8FC4") + ph = 13 /datum/reagent/colorful_reagent/powder/invisible name = "Invisible Powder" @@ -1497,6 +1543,7 @@ color = "#000000" // RBG: 0, 0, 0 var/tox_prob = 0 taste_description = "plant food" + ph = 3 /datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/M) if(prob(tox_prob)) @@ -1586,6 +1633,7 @@ color = "#2D2D2D" taste_description = "bitterness" taste_mult = 1.5 + ph = 1.5 /datum/reagent/stable_plasma/on_mob_life(mob/living/carbon/C) C.adjustPlasma(10) @@ -1597,6 +1645,7 @@ reagent_state = LIQUID color = "#BC8A00" taste_description = "metal" + ph = 4.5 /datum/reagent/carpet name = "Carpet" @@ -1701,6 +1750,7 @@ reagent_state = LIQUID color = "#D35415" taste_description = "chemicals" + ph = 7.8 /datum/reagent/pentaerythritol name = "Pentaerythritol" @@ -1738,6 +1788,7 @@ reagent_state = LIQUID color = "#E7EA91" taste_description = "acid" + ph = 5.5 /datum/reagent/ash name = "Ash" @@ -1745,6 +1796,7 @@ reagent_state = LIQUID color = "#515151" taste_description = "ash" + ph = 6.5 // Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer /datum/reagent/ash/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -1878,6 +1930,7 @@ reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 taste_description = "cool salt" + ph = 11.2 // Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants /datum/reagent/saltpetre/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -1895,6 +1948,7 @@ reagent_state = LIQUID color = "#FFFFD6" // very very light yellow taste_description = "acid" + ph = 11.9 /datum/reagent/drying_agent name = "Drying agent" @@ -1902,6 +1956,7 @@ reagent_state = LIQUID color = "#A70FFF" taste_description = "dryness" + ph = 10.7 /datum/reagent/drying_agent/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() @@ -1968,6 +2023,7 @@ description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." color = "#00ff80" taste_description = "strange honey" + ph = 3 /datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M) if(prob(2)) @@ -1988,6 +2044,7 @@ metabolization_rate = INFINITY can_synth = FALSE taste_description = "brains" + ph = 0.5 /datum/reagent/romerol/expose_mob(mob/living/carbon/human/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -2044,6 +2101,7 @@ description = "the petroleum based components of plastic." color = "#f7eded" taste_description = "plastic" + ph = 6 /datum/reagent/glitter name = "generic glitter" @@ -2082,6 +2140,7 @@ color = "#AAAAAA55" taste_description = "water" metabolization_rate = 0.25 * REAGENTS_METABOLISM + ph = 15 /datum/reagent/pax/on_mob_metabolize(mob/living/L) ..() @@ -2184,6 +2243,7 @@ var/yuck_cycle = 0 //! The `current_cycle` when puking starts. /datum/reagent/yuck/on_mob_add(mob/living/L) + . = ..() if(HAS_TRAIT(L, TRAIT_NOHUNGER)) //they can't puke holder.del_reagent(type) @@ -2302,6 +2362,7 @@ /datum/reagent/gravitum/on_mob_add(mob/living/L) L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless + return ..() /datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) L.RemoveElement(/datum/element/forced_gravity, 0) @@ -2374,3 +2435,4 @@ M.adjustOxyLoss(2, FALSE) M.adjustBruteLoss(2, FALSE) ..() + diff --git a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm new file mode 100644 index 00000000000..26aa514e7ac --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm @@ -0,0 +1,124 @@ +/datum/reagent/reaction_agent + name = "reaction agent" + description = "Hello! I am a bugged reagent. Please report me for my crimes. Thank you!!" + +/datum/reagent/reaction_agent/intercept_reagents_transfer(datum/reagents/target, amount) + if(!target) + return FALSE + if(target.flags & NO_REACT) + return FALSE + if(target.has_reagent(/datum/reagent/stabilizing_agent)) + return FALSE + if(LAZYLEN(target.reagent_list) == 0) + return FALSE + if(LAZYLEN(target.reagent_list) == 1) + if(target.has_reagent(type)) //Allow dispensing into self + return FALSE + return TRUE + +/datum/reagent/reaction_agent/acidic_buffer + name = "Strong acidic buffer" + description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." + color = "#fbc314" + ph = 0 + ///The strength of the buffer where (volume/holder.total_volume)*strength. So for 1u added to 50u the ph will decrease by 0.5 + var/strength = 30 + +//Consumes self on addition and shifts ph +/datum/reagent/reaction_agent/acidic_buffer/intercept_reagents_transfer(datum/reagents/target, amount) + . = ..() + if(!.) + return + if(target.ph <= ph) + target.my_atom.audible_message("The beaker froths as the buffer is added, to no effect.") + playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) + holder.remove_reagent(type, amount)//Remove from holder because it's not transfered + return + var/ph_change = -((amount/target.total_volume)*strength) + target.adjust_all_reagents_ph(ph_change, ph, 14) + target.my_atom.audible_message("The beaker fizzes as the ph changes!") + playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) + holder.remove_reagent(type, amount) + +/datum/reagent/reaction_agent/basic_buffer + name = "Strong basic buffer" + description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." + color = "#3853a4" + ph = 14 + ///The strength of the buffer where (volume/holder.total_volume)*strength. So for 1u added to 50u the ph will increase by 0.5 + var/strength = 30 + +/datum/reagent/reaction_agent/basic_buffer/intercept_reagents_transfer(datum/reagents/target, amount) + . = ..() + if(!.) + return + if(target.ph >= ph) + target.my_atom.audible_message("The beaker froths as the buffer is added, to no effect.") + playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) + holder.remove_reagent(type, amount)//Remove from holder because it's not transfered + return + var/ph_change = (amount/target.total_volume)*strength + target.adjust_all_reagents_ph(ph_change, 0, ph) + target.my_atom.audible_message("The beaker froths as the ph changes!") + playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) + holder.remove_reagent(type, amount) + +//purity testor/reaction agent prefactors + +/datum/reagent/prefactor_a + name = "Interim product alpha" + description = "This reagent is a prefactor to the purity tester reagent, and will react with stable plasma to create it" + color = "#bafa69" + +/datum/reagent/prefactor_b + name = "Interim product beta" + description = "This reagent is a prefactor to the reaction speed agent reagent, and will react with stable plasma to create it" + color = "#8a3aa9" + +/datum/reagent/reaction_agent/purity_tester + name = "Purity tester" + description = "This reagent will consume itself and violently react if there is a highly impure reagent in the beaker." + ph = 3 + color = "#ffffff" + +/datum/reagent/reaction_agent/purity_tester/intercept_reagents_transfer(datum/reagents/target, amount) + . = ..() + if(!.) + return + var/is_inverse = FALSE + for(var/_reagent in target.reagent_list) + var/datum/reagent/reaction_agent/reagent = _reagent + if(reagent.purity <= reagent.inverse_chem_val) + is_inverse = TRUE + if(is_inverse) + target.my_atom.audible_message("The beaker bubbles violently as the reagent is added!") + playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) + else + target.my_atom.audible_message("The added reagent doesn't seem to do much.") + holder.remove_reagent(type, amount) + +/datum/reagent/reaction_agent/speed_agent + name = "Tempomyocin" + description = "This reagent will consume itself and speed up an ongoing reaction, modifying the current reaction's purity by it's own." + ph = 10 + color = "#e61f82" + ///How much the reaction speed is sped up by - for 5u added to 100u, an additional step of 1 will be done up to a max of 2x + var/strength = 20 + + +/datum/reagent/reaction_agent/speed_agent/intercept_reagents_transfer(datum/reagents/target, amount) + . = ..() + if(!.) + return FALSE + if(!length(target.reaction_list))//you can add this reagent to a beaker with no ongoing reactions, so this prevents it from being used up. + return FALSE + amount /= target.reaction_list.len + for(var/_reaction in target.reaction_list) + var/datum/equilibrium/reaction = _reaction + if(!reaction) + CRASH("[_reaction] is in the reaction list, but is not an equilibrium") + var/power = (amount/reaction.target_vol)*strength + power *= creation_purity + power = clamp(power, 0, 2) + reaction.react_timestep(power, creation_purity) + holder.remove_reagent(type, amount) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 0e480cd9995..1f5fc5b6c9f 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -29,6 +29,7 @@ color = "#792300" // rgb: 121, 35, 0 toxpwr = 2.5 taste_description = "mushroom" + ph = 13 /datum/reagent/toxin/mutagen name = "Unstable mutagen" @@ -37,6 +38,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 0.9 + ph = 2.3 /datum/reagent/toxin/mutagen/expose_mob(mob/living/carbon/exposed_mob, methods=TOUCH, reac_volume) . = ..() @@ -72,6 +74,7 @@ toxpwr = 3 material = /datum/material/plasma penetrates_skin = NONE + ph = 4 /datum/reagent/toxin/plasma/on_new(data) . = ..() @@ -139,6 +142,7 @@ color = "#7DC3A0" toxpwr = 0 taste_description = "acid" + ph = 1.2 /datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C) . = TRUE @@ -160,6 +164,7 @@ toxpwr = 0 taste_description = "slime" taste_mult = 1.3 + ph = 10 /datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M) if(prob(10)) @@ -177,6 +182,7 @@ color = "#CF3600" // rgb: 207, 54, 0 toxpwr = 0 taste_description = "mint" + ph = 8 /datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M) if(HAS_TRAIT(M, TRAIT_FAT)) @@ -190,6 +196,7 @@ color = "#003333" // rgb: 0, 51, 51 toxpwr = 2 taste_description = "fish" + ph = 12 /datum/reagent/toxin/carpotoxin/on_mob_life(mob/living/carbon/M) . = ..() @@ -206,6 +213,7 @@ taste_description = "death" penetrates_skin = NONE var/fakedeath_active = FALSE + ph = 13 /datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/L) ..() @@ -247,6 +255,7 @@ color = "#664700" // rgb: 102, 71, 0 toxpwr = 0.8 taste_description = "death" + ph = 14.5 /datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/L) ..() @@ -267,6 +276,7 @@ color = "#B31008" // rgb: 139, 166, 233 toxpwr = 0 taste_description = "sourness" + ph = 11 /datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M) M.hallucination += 5 @@ -279,6 +289,7 @@ toxpwr = 1 taste_mult = 1 penetrates_skin = NONE + ph = 2.7 // Plant-B-Gone is just as bad /datum/reagent/toxin/plantbgone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -311,6 +322,7 @@ name = "Weed Killer" description = "A harmful toxic mixture to kill weeds. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 + ph = 3 //Weed Spray /datum/reagent/toxin/plantbgone/weedkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -325,6 +337,7 @@ description = "A harmful toxic mixture to kill pests. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 toxpwr = 1 + ph = 3.2 //Pest Spray /datum/reagent/toxin/pestkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -359,6 +372,7 @@ description = "A natural toxin produced by blob spores that inhibits vision when ingested." color = "#9ACD32" toxpwr = 1 + ph = 11 /datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C) C.damageoverlaytemp = 60 @@ -372,6 +386,7 @@ color = "#9ACD32" toxpwr = 0.5 taste_description = "burning" + ph = 13 /datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M) M.adjust_fire_stacks(2) @@ -386,6 +401,7 @@ color = "#000067" // rgb: 0, 0, 103 toxpwr = 0 metabolization_rate = 1.5 * REAGENTS_METABOLISM + ph = 11 /datum/reagent/toxin/chloralhydrate/on_mob_life(mob/living/carbon/M) switch(current_cycle) @@ -410,6 +426,7 @@ glass_icon_state = "beerglass" glass_name = "glass of beer" glass_desc = "A freezing pint of beer." + ph = 2 /datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M) switch(current_cycle) @@ -426,6 +443,7 @@ reagent_state = SOLID color = "#5B2E0D" // rgb: 91, 46, 13 toxpwr = 0.5 + ph = 4.2 /datum/reagent/toxin/teapowder name = "Ground Tea Leaves" @@ -434,6 +452,7 @@ color = "#7F8400" // rgb: 127, 132, 0 toxpwr = 0.1 taste_description = "green tea" + ph = 4.9 /datum/reagent/toxin/mutetoxin //the new zombie powder. name = "Mute Toxin" @@ -442,6 +461,7 @@ color = "#F0F8FF" // rgb: 240, 248, 255 toxpwr = 0 taste_description = "silence" + ph = 12.2 /datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M) M.silent = max(M.silent, 3) @@ -850,6 +870,7 @@ var/acidpwr = 10 //the amount of protection removed from the armour taste_description = "acid" self_consuming = TRUE + ph = 2.75 // ...Why? I mean, clearly someone had to have done this and thought, well, acid doesn't hurt plants, but what brought us here, to this point? /datum/reagent/toxin/acid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -892,6 +913,7 @@ color = "#5050FF" toxpwr = 2 acidpwr = 42.0 + ph = 1.3 // SERIOUSLY /datum/reagent/toxin/acid/fluacid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -912,6 +934,7 @@ color = "#5050FF" toxpwr = 3 acidpwr = 5.0 + ph = 3.3 /datum/reagent/toxin/acid/nitracid/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(volume/10, FALSE) //here you go nervar @@ -962,6 +985,7 @@ /datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M) M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) + return ..() /datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M) M.adjustStaminaLoss(7.5, 0) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index a8e0074c0c8..13fe4af901d 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -21,15 +21,42 @@ ///Determines if a chemical reaction can occur inside a mob var/mob_react = TRUE - ///Required temperature for the reaction to begin - var/required_temp = 0 - /// Set to TRUE if you want the recipe to only react when it's BELOW the required temp. - var/is_cold_recipe = FALSE + ///The message shown to nearby people upon mixing, if applicable var/mix_message = "The solution begins to bubble." ///The sound played upon mixing, if applicable var/mix_sound = 'sound/effects/bubbles.ogg' + /// Set to TRUE if you want the recipe to only react when it's BELOW the required temp. + var/is_cold_recipe = FALSE + ///FermiChem! - See fermi_readme.md + ///Required temperature for the reaction to begin, for fermimechanics it defines the lower area of bell curve for determining heat based rate reactions, aka the minimum + var/required_temp = 100 + /// Upper end for above (i.e. the end of the curve section defined by temp_exponent_factor) + var/optimal_temp = 500 + /// Temperature at which reaction explodes - If any reaction is this hot, it explodes! + var/overheat_temp = 900 + /// Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) + var/optimal_ph_min = 5 + /// Higest value for above + var/optimal_ph_max = 9 + /// How far out pH wil react, giving impurity place (Exponential phase) + var/determin_ph_range = 4 + /// How sharp the temperature exponential curve is (to the power of value) + var/temp_exponent_factor = 2 + /// How sharp the pH exponential curve is (to the power of value) + var/ph_exponent_factor = 2 + /// How much the temperature will change (with no intervention) (i.e. for 30u made the temperature will increase by 100, same with 300u. The final temp will always be start + this value, with the exception con beakers with different specific heats) + var/thermic_constant = 50 + /// pH change per 1u reaction + var/H_ion_release = 0.01 + /// Optimal/max rate possible if all conditions are perfect + var/rate_up_lim = 30 + /// If purity is below 0.15, it calls OverlyImpure() too. Set to 0 to disable this. + var/purity_min = 0.15 + /// bitflags for clear conversions; REACTION_CLEAR_IMPURE, REACTION_CLEAR_INVERSE, REACTION_CLEAR_RETAIN, REACTION_INSTANT + var/reaction_flags = NONE + /datum/chemical_reaction/New() . = ..() SSticker.OnRoundstart(CALLBACK(src,.proc/update_info)) @@ -44,8 +71,14 @@ /datum/chemical_reaction/proc/update_info() return +///REACTION PROCS + /** * Shit that happens on reaction + * Only procs at the START of a reaction + * use reaction_step() for each step of a reaction + * or reaction_end() when the reaction stops + * If reaction_flags & REACTION_INSTANT then this is the only proc that is called. * * Proc where the additional magic happens. * You dont want to handle mob spawning in this since there is a dedicated proc for that.client @@ -53,10 +86,131 @@ * * holder - the datum that holds this reagent, be it a beaker or anything else * * created_volume - volume created when this is mixed. look at 'var/list/results'. */ -/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/proc/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) return //I recommend you set the result amount to the total volume of all components. +/** + * Stuff that occurs in the middle of a reaction + * Only procs DURING a reaction + * If reaction_flags & REACTION_INSTANT then this isn't called + * returning END_REACTION will END the reaction + * + * Arguments: + * * reaction - the equilibrium reaction holder that is reaction is processed within - use this to edit delta_t and delta + * * holder - the datum that holds this reagent, be it a beaker or anything else + * * created_volume - volume created per step + * * added_purity - how pure the created volume is per step + * + * Outputs: + * * returning END_REACTION will end the associated reaction - flagging it for deletion and preventing any reaction in that timestep from happening. Make sure to set the vars in the holder to one that can't start it from starting up again. + */ +/datum/chemical_reaction/proc/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol) + return + +/** + * Stuff that occurs at the end of a reaction. This will proc if the beaker is forced to stop and start again (say for sudden temperature changes). + * Only procs at the END of reaction + * If reaction_flags & REACTION_INSTANT then this isn't called + * if reaction_flags REACTION_CLEAR_IMPURE then the impurity chem is handled here, producing the result in the beaker instead of in a mob + * Likewise for REACTION_CLEAR_INVERSE the inverse chem is produced at the end of the reaction in the beaker + * You should be calling ..() if you're writing a child function of this proc otherwise purity methods won't work correctly + * + * Proc where the additional magic happens. + * You dont want to handle mob spawning in this since there is a dedicated proc for that.client + * Arguments: + * * holder - the datum that holds this reagent, be it a beaker or anything else + * * react_volume - volume created across the whole reaction + */ +/datum/chemical_reaction/proc/reaction_finish(datum/reagents/holder, react_vol) + //failed_chem handler + var/cached_temp = holder.chem_temp + for(var/id in results) + var/datum/reagent/reagent = holder.has_reagent(id) + if(!reagent) + continue + //Split like this so it's easier for people to edit this function in a child + convert_into_failed(reagent, holder) + reaction_clear_check(reagent, holder) + holder.chem_temp = cached_temp + +/** + * Converts a reagent into the type specified by the failed_chem var of the input reagent + * + * Arguments: + * * reagent - the target reagent to convert + */ +/datum/chemical_reaction/proc/convert_into_failed(datum/reagent/reagent, datum/reagents/holder) + if(reagent.purity < purity_min) + var/cached_volume = reagent.volume + holder.remove_reagent(reagent.type, cached_volume, FALSE) + holder.add_reagent(reagent.failed_chem, cached_volume, FALSE, added_purity = 1) + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[type] failed reactions") + +/** + * REACTION_CLEAR handler + * If the reaction has the REACTION_CLEAR flag, then it will split using purity methods in the beaker instead + * + * Arguments: + * * reagent - the target reagent to convert + */ +/datum/chemical_reaction/proc/reaction_clear_check(datum/reagent/reagent, datum/reagents/holder) + if(!reagent)//Failures can delete R + return + if(reaction_flags & (REACTION_CLEAR_IMPURE | REACTION_CLEAR_INVERSE)) + if(reagent.purity == 1) + return + + var/cached_volume = reagent.volume + if((reaction_flags & REACTION_CLEAR_INVERSE) && reagent.inverse_chem) + if(reagent.inverse_chem_val > reagent.purity) + holder.remove_reagent(reagent.type, cached_volume, FALSE) + holder.add_reagent(reagent.inverse_chem, cached_volume, FALSE, added_purity = 1) + + if((reaction_flags & REACTION_CLEAR_IMPURE) && reagent.impure_chem) + var/impureVol = cached_volume * (1 - reagent.purity) + holder.remove_reagent(reagent.type, (impureVol), FALSE) + holder.add_reagent(reagent.impure_chem, impureVol, FALSE, added_purity = 1) + reagent.creation_purity = reagent.purity + reagent.purity = 1 + +/** + * Occurs when a reation is overheated (i.e. past it's overheatTemp) + * Will be called every tick in the reaction that it is overheated + * If you want this to be a once only proc (i.e. the reaction is stopped after) set reaction.toDelete = TRUE + * The above is useful if you're writing an explosion + * By default the parent proc will reduce the final yield slightly. If you don't want that don't add ..() + * + * Arguments: + * * holder - the datum that holds this reagent, be it a beaker or anything else + * * equilibrium - the equilibrium datum that contains the equilibrium reaction properties and methods + */ +/datum/chemical_reaction/proc/overheated(datum/reagents/holder, datum/equilibrium/equilibrium) + for(var/id in results) + var/datum/reagent/reagent = holder.get_reagent(id) + if(!reagent) + return + reagent.volume = round((reagent.volume*0.98), 0.01) //Slowly lower yield per tick + +/** + * Occurs when a reation is too impure (i.e. it's below purity_min) + * Will be called every tick in the reaction that it is too impure + * If you want this to be a once only proc (i.e. the reaction is stopped after) set reaction.toDelete = TRUE + * The above is useful if you're writing an explosion + * By default the parent proc will reduce the purity of all reagents involved in the reaction in the beaker slightly. If you don't want that don't add ..() + * + * Arguments: + * * holder - the datum that holds this reagent, be it a beaker or anything else + * * equilibrium - the equilibrium datum that contains the equilibrium reaction properties and methods + */ +/datum/chemical_reaction/proc/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium) + var/affected_list = results + required_reagents + for(var/_reagent in affected_list) + var/datum/reagent/reagent = holder.get_reagent(_reagent) + if(!reagent) + continue + reagent.purity = clamp((reagent.purity-0.01), 0, 1) //slowly reduce purity of reagents + /** * Magical mob spawning when chemicals react * @@ -132,3 +286,107 @@ else if(step_towards(X, T) && moving_power > 1) addtimer(CALLBACK(GLOBAL_PROC, .proc/_step_towards, X, T), 2) + +//////////////////Generic explosions/failures//////////////////// +// It is HIGHLY, HIGHLY recomended that you consume all/a good volume of the reagents/products in an explosion - because it will just keep going forever until the reaction stops +//If you have competitive reactions - it's a good idea to consume ALL reagents in a beaker (or product+reactant), otherwise it'll swing back with the deficit and blow up again + + +//Spews out the inverse of the chems in the beaker of the products/reactants only +/datum/chemical_reaction/proc/explode_invert_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, clear_products = TRUE, clear_reactants = TRUE) + var/datum/reagents/invert_reagents = new (2100, NO_REACT)//I think the biggest size we can get is 2100? + var/datum/effect_system/smoke_spread/chem/smoke = new() + var/sum_volume = 0 + invert_reagents.my_atom = holder.my_atom //Give the gas a fingerprint + for(var/datum/reagent/reagent as anything in holder.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding + if(!(reagent.type in required_reagents) || !(reagent.type in results)) + continue + if(reagent.inverse_chem) + invert_reagents.add_reagent(reagent.inverse_chem, reagent.volume, no_react = TRUE) + holder.remove_reagent(reagent.type, reagent.volume) + continue + invert_reagents.add_reagent(reagent.type, reagent.volume, added_purity = reagent.purity, no_react = TRUE) + sum_volume += reagent.volume + holder.remove_reagent(reagent.type, reagent.volume) + if(invert_reagents.reagent_list) + smoke.set_up(invert_reagents, (sum_volume/5), holder.my_atom) + smoke.start() + holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!") + if(clear_reactants) + clear_reactants(holder) + if(clear_products) + clear_products(holder) + +//Spews out the corrisponding reactions reagents (products/required) of the beaker in a smokecloud. Doesn't spew catalysts +/datum/chemical_reaction/proc/explode_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, clear_products = TRUE, clear_reactants = TRUE) + var/datum/reagents/reagents = new/datum/reagents(2100, NO_REACT)//Lets be safe first + var/datum/effect_system/smoke_spread/chem/smoke = new() + reagents.my_atom = holder.my_atom //fingerprint + var/sum_volume = 0 + for (var/datum/reagent/reagent as anything in holder.reagent_list) + if((reagent.type in required_reagents) || (reagent.type in results)) + reagents.add_reagent(reagent.type, reagent.volume, added_purity = reagent.purity, no_react = TRUE) + holder.remove_reagent(reagent.type, reagent.volume) + if(reagents.reagent_list) + smoke.set_up(reagents, (sum_volume/5), holder.my_atom) + smoke.start() + holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!") + if(clear_reactants) + clear_reactants(holder) + if(clear_products) + clear_products(holder) + +//Pushes everything out, and damages mobs with 10 brute damage. +/datum/chemical_reaction/proc/explode_shockwave(datum/reagents/holder, datum/equilibrium/equilibrium) + var/turf/this_turf = get_turf(holder.my_atom) + holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, sending a shockwave rippling through the air!") + playsound(this_turf, 'sound/chemistry/shockwave_explosion.ogg', 80, TRUE) + //Modified goonvortex + for(var/atom/movable/movey in orange(3, this_turf)) + if(isliving(movey)) + var/mob/living/live = movey + live.apply_damage(5)//Since this can be called multiple times + if(movey.anchored) + continue + if(iseffect(movey) || iscameramob(movey) || isdead(movey)) + continue + var/distance = get_dist(movey, this_turf) + var/moving_power = max(4 - distance, 1)//Make sure we're thrown out of range of the next one + var/atom/throw_target = get_edge_target_turf(movey, get_dir(movey, get_step_away(movey, this_turf))) + movey.throw_at(throw_target, moving_power, 1) + + +//Creates a ring of fire in a set range around the beaker location +/datum/chemical_reaction/proc/explode_fire(datum/reagents/holder, datum/equilibrium/equilibrium, range) + explosion(holder.my_atom, 0, 0, 0, 0, flame_range = 3) + holder.my_atom.audible_message("The [holder.my_atom] suddenly errupts in flames!") + +//Clears the beaker of the reagents only +/datum/chemical_reaction/proc/clear_reactants(datum/reagents/holder, volume = null) + if(!holder) + return FALSE + for(var/datum/reagent/reagent as anything in holder.reagent_list) + if(!(reagent.type in required_reagents)) + continue + if(!volume) + holder.remove_reagent(reagent.type, reagent.volume) + else + holder.remove_reagent(reagent.type, volume) + +//Clears the beaker of the product only +/datum/chemical_reaction/proc/clear_products(datum/reagents/holder, volume = null) + if(!holder) + return FALSE + for(var/datum/reagent/reagent as anything in holder.reagent_list) + if(!(reagent.type in results)) + continue + if(!volume) + holder.remove_reagent(reagent.type, reagent.volume) + else + holder.remove_reagent(reagent.type, volume) + +//Clears the beaker of ALL reagents inside +/datum/chemical_reaction/proc/clear_reagents(datum/reagents/holder, volume = null) + if(!holder) + return FALSE + holder.remove_all(volume) diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm index c266828f1e1..a707915787c 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -1,65 +1,67 @@ - /*****BRUTE*****/ -/datum/chemical_reaction/helbital +/datum/chemical_reaction/medicine/helbital results = list(/datum/reagent/medicine/c2/helbital = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1) mix_message = "The mixture turns into a thick, yellow powder." -/datum/chemical_reaction/libital +/datum/chemical_reaction/medicine/libital results = list(/datum/reagent/medicine/c2/libital = 3) required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1) -/datum/chemical_reaction/probital +/datum/chemical_reaction/medicine/probital results = list(/datum/reagent/medicine/c2/probital = 4) required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) /*****BURN*****/ -/datum/chemical_reaction/lenturi +/datum/chemical_reaction/medicine/lenturi results = list(/datum/reagent/medicine/c2/lenturi = 5) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) -/datum/chemical_reaction/aiuri +/datum/chemical_reaction/medicine/aiuri results = list(/datum/reagent/medicine/c2/aiuri = 4) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2) -/datum/chemical_reaction/hercuri +/datum/chemical_reaction/medicine/hercuri results = list(/datum/reagent/medicine/c2/hercuri = 5) required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) required_temp = 47 is_cold_recipe = TRUE + optimal_temp = 10 + overheat_temp = 5 + thermic_constant = -50 /*****OXY*****/ -/datum/chemical_reaction/convermol +/datum/chemical_reaction/medicine/convermol results = list(/datum/reagent/medicine/c2/convermol = 3) required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) required_temp = 370 mix_message = "The mixture rapidly turns into a dense pink liquid." -/datum/chemical_reaction/tirimol +/datum/chemical_reaction/medicine/tirimol results = list(/datum/reagent/medicine/c2/tirimol = 5) required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) required_catalysts = list(/datum/reagent/toxin/acid = 1) /*****TOX*****/ -/datum/chemical_reaction/seiver +/datum/chemical_reaction/medicine/seiver results = list(/datum/reagent/medicine/c2/seiver = 3) required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1) -/datum/chemical_reaction/multiver +/datum/chemical_reaction/medicine/multiver results = list(/datum/reagent/medicine/c2/multiver = 2) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/salt = 1) mix_message = "The mixture yields a fine black powder." required_temp = 380 -/datum/chemical_reaction/syriniver +/datum/chemical_reaction/medicine/syriniver results = list(/datum/reagent/medicine/c2/syriniver = 5) required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2) -/datum/chemical_reaction/penthrite +/datum/chemical_reaction/medicine/penthrite results = list(/datum/reagent/medicine/c2/penthrite = 3) required_reagents = list(/datum/reagent/pentaerythritol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1 , /datum/reagent/wittel = 1) diff --git a/code/modules/reagents/chemistry/recipes/catalysts.dm b/code/modules/reagents/chemistry/recipes/catalysts.dm new file mode 100644 index 00000000000..7f723dfecb2 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/catalysts.dm @@ -0,0 +1,26 @@ + +///////////////////////////MEDICINES//////////////////////////// + +/datum/chemical_reaction/medical_speed_catalyst + results = list(/datum/reagent/catalyst_agent/speed/medicine = 2) + required_reagents = list(/datum/reagent/medicine/c2/libital = 3, /datum/reagent/medicine/c2/probital = 4, /datum/reagent/toxin/plasma = 2) + mix_message = "The reaction evaporates slightly as the mixture solidifies" + mix_sound = 'sound/chemistry/catalyst.ogg' + required_temp = 320 + optimal_temp = 600 + overheat_temp = 800 + optimal_ph_min = 5 + optimal_ph_max = 6 + determin_ph_range = 5 + temp_exponent_factor = 0.5 + ph_exponent_factor = 4 + thermic_constant = 1000 + H_ion_release = -0.25 + rate_up_lim = 1 + purity_min = 0 + +/datum/chemical_reaction/medical_speed_catalyst/overheated(datum/reagents/holder, datum/equilibrium/equilibrium) + explode_invert_smoke(holder, equilibrium) //Will be better when the inputs have proper invert chems + +/datum/chemical_reaction/medical_speed_catalyst/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium) + explode_invert_smoke(holder, equilibrium) diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 5b46a68cb5f..2d58aed05cf 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -14,10 +14,71 @@ mix_message = "The mixture dries into a pale blue powder." required_temp = 380 + /datum/chemical_reaction/methamphetamine results = list(/datum/reagent/drug/methamphetamine = 4) required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/iodine = 1, /datum/reagent/phosphorus = 1, /datum/reagent/hydrogen = 1) - required_temp = 374 + required_temp = 372 + optimal_temp = 376//Wow this is tight + overheat_temp = 380 + optimal_ph_min = 6.5 + optimal_ph_max = 7.5 + determin_ph_range = 5 + temp_exponent_factor = 1 + ph_exponent_factor = 1.4 + thermic_constant = 0.1 //exothermic nature is equal to impurty + H_ion_release = -0.025 + rate_up_lim = 12.5 + purity_min = 0.5 //100u will natrually just dip under this w/ no buffer + reaction_flags = REACTION_HEAT_ARBITARY //Heating up is arbitary because of submechanics of this reaction. + +//The less pure it is, the faster it heats up. tg please don't hate me for making your meth even more dangerous +/datum/chemical_reaction/methamphetamine/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol) + var/datum/reagent/meth = holder.get_reagent(/datum/reagent/drug/methamphetamine) + if(!meth)//First step + reaction.thermic_mod = (1-delta_ph)*5 + return + reaction.thermic_mod = (1-meth.purity)*5 + +/datum/chemical_reaction/methamphetamine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium) + . = ..() + temp_meth_explosion(holder, equilibrium.reacted_vol) + +/datum/chemical_reaction/methamphetamine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium) + . = ..() + temp_meth_explosion(holder, equilibrium.reacted_vol) + +/datum/chemical_reaction/methamphetamine/reaction_finish(datum/reagents/holder, react_vol) + var/datum/reagent/meth = holder.get_reagent(/datum/reagent/drug/methamphetamine) + if(!meth)//Other procs before this can already blow us up + return ..() + if(meth.purity < purity_min) + temp_meth_explosion(holder, react_vol) + return + return ..() + +//Refactoring of explosions is coming later, this is till then so it still explodes +/datum/chemical_reaction/methamphetamine/proc/temp_meth_explosion(datum/reagents/holder, explode_vol) + var/power = 5 + round(explode_vol/12, 1) //meth strengthdiv is 12 + if(power <= 0) + return + var/turf/T = get_turf(holder.my_atom) + var/inside_msg + if(ismob(holder.my_atom)) + var/mob/M = holder.my_atom + inside_msg = " inside [ADMIN_LOOKUPFLW(M)]" + var/lastkey = holder.my_atom.fingerprintslast + var/touch_msg = "N/A" + if(lastkey) + var/mob/toucher = get_mob_by_key(lastkey) + touch_msg = "[ADMIN_LOOKUPFLW(toucher)]" + if(!istype(holder.my_atom, /obj/machinery/plumbing)) //excludes standard plumbing equipment from spamming admins with this shit + message_admins("Reagent explosion reaction occurred at [ADMIN_VERBOSEJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].") + log_game("Reagent explosion reaction occurred at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(power, T, 0, 0) + e.start() + holder.clear_reagents() /datum/chemical_reaction/bath_salts results = list(/datum/reagent/drug/bath_salts = 7) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 0b940900c72..b542601975f 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -1,181 +1,190 @@ -/datum/chemical_reaction/leporazine +/datum/chemical_reaction/medicine + required_reagents = null //Don't add this to master list + optimal_temp = 700 + optimal_ph_max = 10 + temp_exponent_factor = 1.2 + ph_exponent_factor = 0.8 + purity_min = 0.1 + rate_up_lim = 35 + +/datum/chemical_reaction/medicine/leporazine results = list(/datum/reagent/medicine/leporazine = 2) required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) -/datum/chemical_reaction/rezadone +/datum/chemical_reaction/medicine/rezadone results = list(/datum/reagent/medicine/rezadone = 3) required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) -/datum/chemical_reaction/spaceacillin +/datum/chemical_reaction/medicine/spaceacillin results = list(/datum/reagent/medicine/spaceacillin = 2) required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) -/datum/chemical_reaction/oculine +/datum/chemical_reaction/medicine/oculine results = list(/datum/reagent/medicine/oculine = 3) required_reagents = list(/datum/reagent/medicine/c2/multiver = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) mix_message = "The mixture bubbles noticeably and becomes a dark grey color!" -/datum/chemical_reaction/inacusiate +/datum/chemical_reaction/medicine/inacusiate results = list(/datum/reagent/medicine/inacusiate = 2) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/multiver = 1) mix_message = "The mixture sputters loudly and becomes a light grey color!" -/datum/chemical_reaction/synaptizine +/datum/chemical_reaction/medicine/synaptizine results = list(/datum/reagent/medicine/synaptizine = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) -/datum/chemical_reaction/salglu_solution +/datum/chemical_reaction/medicine/salglu_solution results = list(/datum/reagent/medicine/salglu_solution = 3) required_reagents = list(/datum/reagent/consumable/salt = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) -/datum/chemical_reaction/mine_salve +/datum/chemical_reaction/medicine/mine_salve results = list(/datum/reagent/medicine/mine_salve = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) -/datum/chemical_reaction/mine_salve2 +/datum/chemical_reaction/medicine/mine_salve2 results = list(/datum/reagent/medicine/mine_salve = 15) required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these -/datum/chemical_reaction/synthflesh +/datum/chemical_reaction/medicine/synthflesh results = list(/datum/reagent/medicine/c2/synthflesh = 3) required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/libital = 1) -/datum/chemical_reaction/calomel +/datum/chemical_reaction/medicine/calomel results = list(/datum/reagent/medicine/calomel = 2) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1) required_temp = 374 -/datum/chemical_reaction/potass_iodide +/datum/chemical_reaction/medicine/potass_iodide results = list(/datum/reagent/medicine/potass_iodide = 2) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/iodine = 1) -/datum/chemical_reaction/pen_acid +/datum/chemical_reaction/medicine/pen_acid results = list(/datum/reagent/medicine/pen_acid = 6) required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1) -/datum/chemical_reaction/sal_acid +/datum/chemical_reaction/medicine/sal_acid results = list(/datum/reagent/medicine/sal_acid = 5) required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) -/datum/chemical_reaction/oxandrolone +/datum/chemical_reaction/medicine/oxandrolone results = list(/datum/reagent/medicine/oxandrolone = 6) required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) -/datum/chemical_reaction/salbutamol +/datum/chemical_reaction/medicine/salbutamol results = list(/datum/reagent/medicine/salbutamol = 5) required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1) -/datum/chemical_reaction/ephedrine +/datum/chemical_reaction/medicine/ephedrine results = list(/datum/reagent/medicine/ephedrine = 4) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1) mix_message = "The solution fizzes and gives off toxic fumes." -/datum/chemical_reaction/diphenhydramine +/datum/chemical_reaction/medicine/diphenhydramine results = list(/datum/reagent/medicine/diphenhydramine = 4) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) mix_message = "The mixture dries into a pale blue powder." -/datum/chemical_reaction/atropine +/datum/chemical_reaction/medicine/atropine results = list(/datum/reagent/medicine/atropine = 5) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) -/datum/chemical_reaction/epinephrine +/datum/chemical_reaction/medicine/epinephrine results = list(/datum/reagent/medicine/epinephrine = 6) required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) -/datum/chemical_reaction/strange_reagent +/datum/chemical_reaction/medicine/strange_reagent results = list(/datum/reagent/medicine/strange_reagent = 3) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) -/datum/chemical_reaction/strange_reagent/alt +/datum/chemical_reaction/medicine/strange_reagent/alt results = list(/datum/reagent/medicine/strange_reagent = 2) required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) -/datum/chemical_reaction/mannitol +/datum/chemical_reaction/medicine/mannitol results = list(/datum/reagent/medicine/mannitol = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 1, /datum/reagent/water = 1) mix_message = "The solution slightly bubbles, becoming thicker." -/datum/chemical_reaction/neurine +/datum/chemical_reaction/medicine/neurine results = list(/datum/reagent/medicine/neurine = 3) required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1) -/datum/chemical_reaction/mutadone +/datum/chemical_reaction/medicine/mutadone results = list(/datum/reagent/medicine/mutadone = 3) required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1) -/datum/chemical_reaction/antihol +/datum/chemical_reaction/medicine/antihol results = list(/datum/reagent/medicine/antihol = 3) required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/c2/multiver = 1, /datum/reagent/copper = 1) -/datum/chemical_reaction/cryoxadone +/datum/chemical_reaction/medicine/cryoxadone results = list(/datum/reagent/medicine/cryoxadone = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1) -/datum/chemical_reaction/pyroxadone +/datum/chemical_reaction/medicine/pyroxadone results = list(/datum/reagent/medicine/pyroxadone = 2) required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1) -/datum/chemical_reaction/clonexadone +/datum/chemical_reaction/medicine/clonexadone results = list(/datum/reagent/medicine/clonexadone = 2) required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) required_catalysts = list(/datum/reagent/toxin/plasma = 5) -/datum/chemical_reaction/haloperidol +/datum/chemical_reaction/medicine/haloperidol results = list(/datum/reagent/medicine/haloperidol = 5) required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1) -/datum/chemical_reaction/regen_jelly +/datum/chemical_reaction/medicine/regen_jelly results = list(/datum/reagent/medicine/regen_jelly = 2) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/toxin/slimejelly = 1) -/datum/chemical_reaction/higadrite +/datum/chemical_reaction/medicine/higadrite results = list(/datum/reagent/medicine/higadrite = 3) required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1) -/datum/chemical_reaction/morphine +/datum/chemical_reaction/medicine/morphine results = list(/datum/reagent/medicine/morphine = 2) required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1) required_temp = 480 -/datum/chemical_reaction/modafinil +/datum/chemical_reaction/medicine/modafinil results = list(/datum/reagent/medicine/modafinil = 5) required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1) required_catalysts = list(/datum/reagent/bromine = 1) // as close to the real world synthesis as possible -/datum/chemical_reaction/psicodine +/datum/chemical_reaction/medicine/psicodine results = list(/datum/reagent/medicine/psicodine = 5) required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) -/datum/chemical_reaction/granibitaluri +/datum/chemical_reaction/medicine/granibitaluri results = list(/datum/reagent/medicine/granibitaluri = 3) required_reagents = list(/datum/reagent/consumable/salt = 1, /datum/reagent/carbon = 1, /datum/reagent/toxin/acid = 1) required_catalysts = list(/datum/reagent/iron = 5) ///medical stacks -/datum/chemical_reaction/medsuture +/datum/chemical_reaction/medicine/medsuture required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15) //This might be a bit much, reagent cost should be reviewed after implementation. -/datum/chemical_reaction/medsuture/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/medicine/medsuture/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/medical/suture/medicated(location) -/datum/chemical_reaction/medmesh +/datum/chemical_reaction/medicine/medmesh required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) -/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/medicine/medmesh/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/medical/mesh/advanced(location) -/datum/chemical_reaction/poultice +/datum/chemical_reaction/medicine/poultice required_reagents = list(/datum/reagent/toxin/bungotoxin = 20, /datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20) -/datum/chemical_reaction/poultice/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/medicine/poultice/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i in 1 to created_volume) new /obj/item/stack/medical/poultice(location) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 978e23daa6d..e9ffa8a4f4b 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -39,8 +39,9 @@ /datum/chemical_reaction/plasma_solidification required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 20) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/plasma_solidification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/plasma_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/sheet/mineral/plasma(location) @@ -48,8 +49,9 @@ /datum/chemical_reaction/gold_solidification required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/gold = 20, /datum/reagent/iron = 1) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/gold_solidification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/gold_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/sheet/mineral/gold(location) @@ -57,8 +59,9 @@ /datum/chemical_reaction/uranium_solidification required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/uranium = 20, /datum/reagent/potassium = 1) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/uranium_solidification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/uranium_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/stack/sheet/mineral/uranium(location) @@ -71,8 +74,9 @@ required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles required_temp = 374 mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/soapification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/soap/homemade(location) @@ -81,8 +85,9 @@ required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/baldium = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/bluespace = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10) required_temp = 999 mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/omegasoapification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/omegasoapification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/soap/omega(location) @@ -91,8 +96,9 @@ required_reagents = list(/datum/reagent/liquidgibs = 5, /datum/reagent/oxygen = 5) // required_temp = 374 mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/candlefication/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/candle(location) @@ -100,8 +106,9 @@ /datum/chemical_reaction/meatification required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/consumable/nutriment = 10, /datum/reagent/carbon = 10) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/meatification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) new /obj/item/food/meat/slab/meatproduct(location) @@ -175,8 +182,9 @@ required_catalysts = list(/datum/reagent/blood = 1) var/level_min = 1 var/level_max = 2 + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/mix_virus/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B?.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] @@ -243,7 +251,7 @@ required_reagents = list(/datum/reagent/medicine/synaptizine = 1) required_catalysts = list(/datum/reagent/blood = 1) -/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B?.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] @@ -254,7 +262,7 @@ required_reagents = list(/datum/reagent/toxin/formaldehyde = 1) required_catalysts = list(/datum/reagent/blood = 1) -/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B?.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] @@ -269,33 +277,38 @@ /datum/chemical_reaction/surfactant results = list(/datum/reagent/fluorosurfactant = 5) required_reagents = list(/datum/reagent/fluorine = 2, /datum/reagent/carbon = 2, /datum/reagent/toxin/acid = 1) + reaction_flags = REACTION_INSTANT /datum/chemical_reaction/foam required_reagents = list(/datum/reagent/fluorosurfactant = 1, /datum/reagent/water = 1) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/foam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.create_foam(/datum/effect_system/foam_spread,2*created_volume,notification="The solution spews out foam!") /datum/chemical_reaction/metalfoam required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/metalfoam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,1,"The solution spews out a metallic foam!") /datum/chemical_reaction/smart_foam required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/smart_foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = TRUE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/smart_foam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.create_foam(/datum/effect_system/foam_spread/metal/smart,5*created_volume,1,"The solution spews out metallic foam!") /datum/chemical_reaction/ironfoam required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/ironfoam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,2,"The solution spews out a metallic foam!") /datum/chemical_reaction/foaming_agent @@ -313,6 +326,9 @@ /datum/chemical_reaction/ammonia results = list(/datum/reagent/ammonia = 3) required_reagents = list(/datum/reagent/hydrogen = 3, /datum/reagent/nitrogen = 1) + optimal_ph_min = 1 // Lets increase our range for this basic chem + optimal_ph_max = 12 + H_ion_release = -0.02 //handmade is more neutral /datum/chemical_reaction/diethylamine results = list(/datum/reagent/diethylamine = 2) @@ -321,6 +337,7 @@ /datum/chemical_reaction/space_cleaner results = list(/datum/reagent/space_cleaner = 2) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) + rate_up_lim = 40 /datum/chemical_reaction/plantbgone results = list(/datum/reagent/toxin/plantbgone = 5) @@ -329,6 +346,7 @@ /datum/chemical_reaction/weedkiller results = list(/datum/reagent/toxin/plantbgone/weedkiller = 5) required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/ammonia = 4) + H_ion_release = -0.05 // Push towards acidic /datum/chemical_reaction/pestkiller results = list(/datum/reagent/toxin/pestkiller = 5) @@ -408,22 +426,25 @@ /datum/chemical_reaction/life required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/blood = 1) required_temp = 374 + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/life/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN /datum/chemical_reaction/life_friendly required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/consumable/sugar = 1) required_temp = 374 + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/life_friendly/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) /datum/chemical_reaction/corgium required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1) required_temp = 374 + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/corgium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = rand(1, created_volume), i <= created_volume, i++) // More lulz. new /mob/living/simple_animal/pet/dog/corgi(location) @@ -433,12 +454,13 @@ /datum/chemical_reaction/monkey_powder results = list(/datum/reagent/monkey_powder = 5) required_reagents = list(/datum/reagent/consumable/banana = 1, /datum/reagent/consumable/nutriment=2,/datum/reagent/liquidgibs = 1) + reaction_flags = REACTION_INSTANT /datum/chemical_reaction/monkey required_reagents = list(/datum/reagent/monkey_powder = 50, /datum/reagent/water = 1) mix_message = "Expands into a brown mass before shaping itself into a monkey!." -/datum/chemical_reaction/monkey/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/monkey/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/mob/living/carbon/M = holder.my_atom var/location = get_turf(M) if(istype(M, /mob/living/carbon)) @@ -456,8 +478,9 @@ //butterflium /datum/chemical_reaction/butterflium required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1) + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/butterflium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = rand(1, created_volume), i <= created_volume, i++) new /mob/living/simple_animal/butterfly(location) @@ -466,8 +489,9 @@ /datum/chemical_reaction/scream required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/lizardwine = 5 ) required_temp = 374 + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/scream/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/scream/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) playsound(holder.my_atom, pick(list( 'sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg', 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg', 'sound/voice/human/wilhelm_scream.ogg')), created_volume*5,TRUE) /datum/chemical_reaction/hair_dye @@ -494,6 +518,7 @@ /datum/chemical_reaction/lye results = list(/datum/reagent/lye = 3) required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) + required_temp = 10 //So hercuri still shows life. /datum/chemical_reaction/lye2 results = list(/datum/reagent/lye = 2) @@ -510,8 +535,9 @@ /datum/chemical_reaction/plastic_polymers required_reagents = list(/datum/reagent/fuel/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3) required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/plastic_polymers/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i in 1 to created_volume) new /obj/item/stack/sheet/plastic(location) @@ -535,16 +561,18 @@ /datum/chemical_reaction/slime_extractification required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5) mix_message = "The mixture condenses into a ball." + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime_extractification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) new /obj/item/slime_extract/grey(location) /datum/chemical_reaction/metalgen_imprint required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) results = list(/datum/reagent/metalgen = 1) + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen) for(var/datum/reagent/R in holder.reagent_list) if(R.material && R.volume >= 40) @@ -590,8 +618,9 @@ required_reagents = list(/datum/reagent/silver = 20, /datum/reagent/carbon = 10) required_temp = 630 mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/silver_solidification/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/silver_solidification/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i in 1 to created_volume) new /obj/item/stack/sheet/mineral/silver(location) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 4e36b2e8314..a4ea6b5a926 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -1,8 +1,9 @@ /datum/chemical_reaction/reagent_explosion var/strengthdiv = 10 var/modifier = 0 + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) explode(holder, created_volume) /datum/chemical_reaction/reagent_explosion/proc/explode(datum/reagents/holder, created_volume) @@ -13,7 +14,7 @@ if(ismob(holder.my_atom)) var/mob/M = holder.my_atom inside_msg = " inside [ADMIN_LOOKUPFLW(M)]" - var/lastkey = holder.my_atom.fingerprintslast + var/lastkey = holder.my_atom.fingerprintslast //This can runtime (null.fingerprintslast) - due to plumbing? var/touch_msg = "N/A" if(lastkey) var/mob/toucher = get_mob_by_key(lastkey) @@ -31,7 +32,7 @@ required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/toxin/acid = 1) strengthdiv = 2 -/datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 25, CHEMICAL_QUANTISATION_LEVEL))) return @@ -50,7 +51,7 @@ required_temp = 404 strengthdiv = 8 -/datum/chemical_reaction/reagent_explosion/rdx/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/rdx/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return holder.remove_reagent(/datum/reagent/rdx, created_volume*2) @@ -67,7 +68,7 @@ strengthdiv = 3.5 //actually a decrease of 1 becaused of how explosions are calculated. This is due to the fact we require 2 reagents modifier = 4 -/datum/chemical_reaction/reagent_explosion/rdx_explosion2/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/rdx_explosion2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/fire_range = round(created_volume/30) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(fire_range,T)) @@ -81,7 +82,7 @@ modifier = 6 -/datum/chemical_reaction/reagent_explosion/rdx_explosion3/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/rdx_explosion3/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/fire_range = round(created_volume/20) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(fire_range,T)) @@ -98,7 +99,7 @@ /datum/chemical_reaction/reagent_explosion/tatp/update_info() required_temp = 450 + rand(-49,49) //this gets loaded only on round start -/datum/chemical_reaction/reagent_explosion/tatp/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/tatp/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 50, CHEMICAL_QUANTISATION_LEVEL))) // we like exotic stabilizer return holder.remove_reagent(/datum/reagent/tatp, created_volume) @@ -109,7 +110,7 @@ required_temp = 550 // this makes making tatp before pyro nades, and extreme pain in the ass to make strengthdiv = 3 -/datum/chemical_reaction/reagent_explosion/tatp_explosion/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/tatp_explosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/strengthdiv_adjust = created_volume / ( 2100 / initial(strengthdiv)) strengthdiv = max(initial(strengthdiv) - strengthdiv_adjust + 1.5 ,1.5) //Slightly better than nitroglycerin . = ..() @@ -135,7 +136,7 @@ required_reagents = list(/datum/reagent/water/holywater = 1, /datum/reagent/potassium = 1) strengthdiv = 20 -/datum/chemical_reaction/reagent_explosion/holyboom/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/holyboom/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(created_volume >= 150) strengthdiv = 8 ///turf where to play sound @@ -172,7 +173,7 @@ modifier = 5 mix_message = "Sparks start flying around the gunpowder!" -/datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) addtimer(CALLBACK(src, .proc/explode, holder, created_volume), rand(5,10) SECONDS) /datum/chemical_reaction/thermite @@ -182,7 +183,7 @@ /datum/chemical_reaction/emp_pulse required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense -/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/emp_pulse/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. @@ -193,7 +194,7 @@ /datum/chemical_reaction/beesplosion required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1) -/datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/beesplosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = holder.my_atom.drop_location() if(created_volume < 5) playsound(location,'sound/effects/sparks1.ogg', 100, TRUE) @@ -219,8 +220,9 @@ results = list(/datum/reagent/clf3 = 4) required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 3) required_temp = 424 + overheat_temp = 1050 -/datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/clf3/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) @@ -233,7 +235,7 @@ modifier = 5 mob_react = FALSE -/datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) @@ -248,7 +250,7 @@ results = list(/datum/reagent/sorium = 4) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1) -/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/sorium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return holder.remove_reagent(/datum/reagent/sorium, created_volume*4) @@ -260,7 +262,7 @@ required_reagents = list(/datum/reagent/sorium = 1) required_temp = 474 -/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/sorium_vortex/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) var/range = clamp(sqrt(created_volume), 1, 6) goonchem_vortex(T, 1, range) @@ -269,7 +271,7 @@ results = list(/datum/reagent/liquid_dark_matter = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/carbon = 1) -/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return holder.remove_reagent(/datum/reagent/liquid_dark_matter, created_volume*3) @@ -281,7 +283,7 @@ required_reagents = list(/datum/reagent/liquid_dark_matter = 1) required_temp = 474 -/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/ldm_vortex/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) var/range = clamp(sqrt(created_volume/2), 1, 6) goonchem_vortex(T, 0, range) @@ -289,8 +291,9 @@ /datum/chemical_reaction/flash_powder results = list(/datum/reagent/flash_powder = 3) required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/potassium = 1, /datum/reagent/sulfur = 1 ) + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/flash_powder/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return var/location = get_turf(holder.my_atom) @@ -311,7 +314,7 @@ required_reagents = list(/datum/reagent/flash_powder = 1) required_temp = 374 -/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) do_sparks(2, TRUE, location) var/range = created_volume/10 @@ -328,8 +331,9 @@ /datum/chemical_reaction/smoke_powder results = list(/datum/reagent/smoke_powder = 3) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/phosphorus = 1) + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/smoke_powder/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/smoke_powder/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return holder.remove_reagent(/datum/reagent/smoke_powder, created_volume*3) @@ -348,8 +352,9 @@ required_reagents = list(/datum/reagent/smoke_powder = 1) required_temp = 374 mob_react = FALSE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) var/smoke_radius = round(sqrt(created_volume / 2), 1) var/datum/effect_system/smoke_spread/chem/S = new @@ -365,7 +370,7 @@ results = list(/datum/reagent/sonic_powder = 3) required_reagents = list(/datum/reagent/oxygen = 1, /datum/reagent/consumable/space_cola = 1, /datum/reagent/phosphorus = 1) -/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/sonic_powder/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return holder.remove_reagent(/datum/reagent/sonic_powder, created_volume*3) @@ -378,7 +383,7 @@ required_reagents = list(/datum/reagent/sonic_powder = 1) required_temp = 374 -/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, TRUE) for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) @@ -388,7 +393,7 @@ results = list(/datum/reagent/phlogiston = 3) required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/stable_plasma = 1) -/datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/phlogiston/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) return var/turf/open/T = get_turf(holder.my_atom) @@ -404,8 +409,13 @@ /datum/chemical_reaction/cryostylane results = list(/datum/reagent/cryostylane = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/nitrogen = 1) + is_cold_recipe = TRUE //This is kind of a strange reaction that I will come back to tweak later + required_temp = 1000 + optimal_temp = 20 + overheat_temp = 1 + thermic_constant = -250 -/datum/chemical_reaction/cryostylane/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/cryostylane/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.chem_temp = 20 // cools the fuck down return @@ -413,8 +423,9 @@ results = list(/datum/reagent/cryostylane = 1) required_reagents = list(/datum/reagent/cryostylane = 1, /datum/reagent/oxygen = 1) mob_react = FALSE + thermic_constant = -1 -/datum/chemical_reaction/cryostylane_oxygen/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/cryostylane_oxygen/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.chem_temp = max(holder.chem_temp - 10*created_volume,0) /datum/chemical_reaction/pyrosium_oxygen @@ -422,14 +433,14 @@ required_reagents = list(/datum/reagent/pyrosium = 1, /datum/reagent/oxygen = 1) mob_react = FALSE -/datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.chem_temp += 10*created_volume /datum/chemical_reaction/pyrosium results = list(/datum/reagent/pyrosium = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1) -/datum/chemical_reaction/pyrosium/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/pyrosium/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.chem_temp = 20 // also cools the fuck down return @@ -452,7 +463,7 @@ mix_sound = 'sound/machines/defib_zap.ogg' var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN -/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison. var/T2 = created_volume * 50 var/T3 = created_volume * 120 @@ -483,7 +494,7 @@ required_temp = 575 modifier = 1 -/datum/chemical_reaction/reagent_explosion/nitrous_oxide/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/reagent_explosion/nitrous_oxide/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.remove_reagent(/datum/reagent/sorium, created_volume*2) var/turf/turfie = get_turf(holder.my_atom) //generally half as strong as sorium. @@ -499,3 +510,7 @@ required_reagents = list(/datum/reagent/stabilizing_agent = 1,/datum/reagent/fluorosurfactant = 1,/datum/reagent/carbon = 1) required_temp = 200 is_cold_recipe = 1 + optimal_temp = 50 + overheat_temp = 5 + thermic_constant= -1 + H_ion_release = -0.02 diff --git a/code/modules/reagents/chemistry/recipes/reaction_agents.dm b/code/modules/reagents/chemistry/recipes/reaction_agents.dm new file mode 100644 index 00000000000..4af750fbb61 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/reaction_agents.dm @@ -0,0 +1,115 @@ +/datum/chemical_reaction/basic_buffer + results = list(/datum/reagent/reaction_agent/basic_buffer = 10) + required_reagents = list(/datum/reagent/ammonia = 3, /datum/reagent/chlorine = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2) //vagely NH4OH + NH4Cl buffer + mix_message = "The solution fizzes in the beaker." + //FermiChem vars: + required_temp = 250 + optimal_temp = 500 + overheat_temp = 9999 + optimal_ph_min = 0 + optimal_ph_max = 14 + determin_ph_range = 0 + temp_exponent_factor = 4 + ph_exponent_factor = 0 + thermic_constant = 0 + H_ion_release = 0.01 + rate_up_lim = 15 + purity_min = 0 + +/datum/chemical_reaction/acidic_buffer + results = list(/datum/reagent/reaction_agent/acidic_buffer = 10) + required_reagents = list(/datum/reagent/sodium = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 2, /datum/reagent/water = 2) + mix_message = "The solution froths in the beaker." + required_temp = 250 + optimal_temp = 500 + overheat_temp = 9999 + optimal_ph_min = 0 + optimal_ph_max = 14 + determin_ph_range = 0 + temp_exponent_factor = 4 + ph_exponent_factor = 0 + thermic_constant = 0 + H_ion_release = -0.01 + rate_up_lim = 20 + purity_min = 0 + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// Example competitive reaction (REACTION_COMPETITIVE) ////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +/datum/chemical_reaction/prefactor_a + results = list(/datum/reagent/prefactor_a = 5) + required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/consumable/ethanol = 3, /datum/reagent/toxin/plasma = 1) + mix_message = "The solution's viscosity increases." + is_cold_recipe = TRUE + required_temp = 800 + optimal_temp = 300 + overheat_temp = -1 //no overheat + optimal_ph_min = 2 + optimal_ph_max = 12 + determin_ph_range = 5 + temp_exponent_factor = 1 + ph_exponent_factor = 0 + thermic_constant = -400 + H_ion_release = 0 + rate_up_lim = 4 + purity_min = 0.25 + + +/datum/chemical_reaction/prefactor_b + results = list(/datum/reagent/prefactor_b = 5) + required_reagents = list(/datum/reagent/prefactor_a = 5) + mix_message = "The solution's viscosity decreases." + mix_sound = 'sound/chemistry/bluespace.ogg' //Maybe use this elsewhere instead + required_temp = 50 + optimal_temp = 500 + overheat_temp = 500 + optimal_ph_min = 5 + optimal_ph_max = 8 + determin_ph_range = 5 + temp_exponent_factor = 1 + ph_exponent_factor = 2 + thermic_constant = -800 + H_ion_release = -0.02 + rate_up_lim = 6 + purity_min = 0.35 + reaction_flags = REACTION_COMPETITIVE //Competes with /datum/chemical_reaction/prefactor_a/competitive + +/datum/chemical_reaction/prefactor_b/reaction_step(datum/equilibrium/reaction, datum/reagents/holder, delta_t, delta_ph, step_reaction_vol) + . = ..() + if(holder.has_reagent(/datum/reagent/bluespace)) + holder.remove_reagent(/datum/reagent/bluespace, 1) + reaction.delta_t *= 5 + +/datum/chemical_reaction/prefactor_b/overheated(datum/reagents/holder, datum/equilibrium/equilibrium) + . = ..() + explode_shockwave(holder, equilibrium) + var/vol = max(20, holder.total_volume/5) //Not letting you have more than 5 + clear_reagents(holder, vol)//Lest we explode forever + +/datum/chemical_reaction/prefactor_b/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium) + explode_fire(holder, equilibrium) + var/vol = max(20, holder.total_volume/5) //Not letting you have more than 5 + clear_reagents(holder, vol) + +/datum/chemical_reaction/prefactor_a/competitive //So we have a back and forth reaction + results = list(/datum/reagent/prefactor_a = 5) + required_reagents = list(/datum/reagent/prefactor_b = 5) + rate_up_lim = 3 + reaction_flags = REACTION_COMPETITIVE //Competes with /datum/chemical_reaction/prefactor_b + +//The actual results +/datum/chemical_reaction/prefactor_a/purity_tester + results = list(/datum/reagent/reaction_agent/purity_tester = 5) + required_reagents = list(/datum/reagent/prefactor_a = 5, /datum/reagent/stable_plasma = 5) + H_ion_release = 0.05 + thermic_constant = 0 + +/datum/chemical_reaction/prefactor_b/speed_agent + results = list(/datum/reagent/reaction_agent/speed_agent = 5) + required_reagents = list(/datum/reagent/prefactor_b = 5, /datum/reagent/stable_plasma = 5) + H_ion_release = -0.15 + thermic_constant = 0 + +////////////////////////////////End example///////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 4dc292b5375..3102be75b35 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -1,8 +1,9 @@ /datum/chemical_reaction/slime var/deletes_extract = TRUE + reaction_flags = REACTION_INSTANT -/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) use_slime_core(holder) /datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder) @@ -21,7 +22,7 @@ required_container = /obj/item/slime_extract/grey required_other = TRUE -/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") ..() @@ -37,7 +38,7 @@ required_container = /obj/item/slime_extract/grey required_other = TRUE -/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) for(var/i in 1 to 3) new /obj/item/food/monkeycube(get_turf(holder.my_atom)) ..() @@ -67,7 +68,7 @@ required_container = /obj/item/slime_extract/metal required_other = TRUE -/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/plasteel(location, 5) new /obj/item/stack/sheet/iron(location, 15) @@ -78,7 +79,7 @@ required_container = /obj/item/slime_extract/metal required_other = TRUE -/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/rglass(location, 5) new /obj/item/stack/sheet/glass(location, 15) @@ -91,7 +92,7 @@ required_other = TRUE deletes_extract = FALSE //we do delete, but we don't do so instantly -/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) summon_mobs(holder, T) var/obj/item/slime_extract/M = holder.my_atom @@ -131,7 +132,7 @@ required_container = /obj/item/slime_extract/silver required_other = TRUE -/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimebork/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) //BORK BORK BORK var/turf/T = get_turf(holder.my_atom) @@ -173,7 +174,7 @@ required_container = /obj/item/slime_extract/blue required_other = TRUE -/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/stabilizer(get_turf(holder.my_atom)) ..() @@ -182,7 +183,7 @@ required_container = /obj/item/slime_extract/blue required_other = TRUE -/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) holder.create_foam(/datum/effect_system/foam_spread,80, "[src] spews out foam!") //Dark Blue @@ -192,7 +193,7 @@ required_other = TRUE deletes_extract = FALSE -/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) T.visible_message("The slime extract starts to feel extremely cold!") addtimer(CALLBACK(src, .proc/freeze, holder), 50) @@ -213,7 +214,7 @@ required_container = /obj/item/slime_extract/darkblue required_other = TRUE -/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom)) ..() @@ -230,7 +231,7 @@ required_other = TRUE deletes_extract = FALSE -/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimefire/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) T.visible_message("The slime extract begins to vibrate adorably!") addtimer(CALLBACK(src, .proc/slime_burn, holder), 50) @@ -258,7 +259,7 @@ required_container = /obj/item/slime_extract/yellow required_other = TRUE -/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) empulse(get_turf(holder.my_atom), 3, 7) ..() @@ -267,7 +268,7 @@ required_container = /obj/item/slime_extract/yellow required_other = TRUE -/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") new /obj/item/flashlight/slime(T) @@ -279,7 +280,7 @@ required_container = /obj/item/slime_extract/purple required_other = TRUE -/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/steroid(get_turf(holder.my_atom)) ..() @@ -295,7 +296,7 @@ required_container = /obj/item/slime_extract/darkpurple required_other = TRUE -/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3) ..() @@ -305,7 +306,7 @@ required_container = /obj/item/slime_extract/red required_other = TRUE -/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/mutator(get_turf(holder.my_atom)) ..() @@ -314,7 +315,7 @@ required_container = /obj/item/slime_extract/red required_other = TRUE -/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) if(slime.docile) //Undoes docility, but doesn't make rabid. slime.visible_message("[slime] forgets its training, becoming wild once again!") @@ -330,7 +331,7 @@ required_container = /obj/item/slime_extract/red required_other = TRUE -/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/speed(get_turf(holder.my_atom)) ..() @@ -340,7 +341,7 @@ required_container = /obj/item/slime_extract/pink required_other = TRUE -/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/docility/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/docility(get_turf(holder.my_atom)) ..() @@ -349,7 +350,7 @@ required_container = /obj/item/slime_extract/pink required_other = TRUE -/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/gender/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom)) ..() @@ -367,7 +368,7 @@ required_other = TRUE deletes_extract = FALSE -/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) var/lastkey = holder.my_atom.fingerprintslast var/touch_msg = "N/A" @@ -400,7 +401,7 @@ required_reagents = list(/datum/reagent/toxin/plasma = 1) required_other = TRUE -/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/sentience(get_turf(holder.my_atom)) ..() @@ -409,7 +410,7 @@ required_reagents = list(/datum/reagent/water = 1) required_other = TRUE -/datum/chemical_reaction/slime/renaming/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/renaming/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/renaming(holder.my_atom.drop_location()) ..() @@ -420,7 +421,7 @@ required_container = /obj/item/slime_extract/adamantine required_other = TRUE -/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/adamantine/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/stack/sheet/mineral/adamantine(get_turf(holder.my_atom)) ..() @@ -430,7 +431,7 @@ required_container = /obj/item/slime_extract/bluespace required_other = TRUE -/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25) ..() @@ -440,7 +441,7 @@ required_container = /obj/item/slime_extract/bluespace required_other = TRUE -/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/obj/item/stack/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom)) BC.visible_message("The [BC.name] appears out of thin air!") ..() @@ -450,7 +451,7 @@ required_container = /obj/item/slime_extract/bluespace required_other = TRUE -/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/slime/slimeradio(get_turf(holder.my_atom)) ..() @@ -460,7 +461,7 @@ required_container = /obj/item/slime_extract/cerulean required_other = TRUE -/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom)) ..() @@ -469,7 +470,7 @@ required_container = /obj/item/slime_extract/cerulean required_other = TRUE -/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom)) ..() @@ -479,7 +480,7 @@ required_container = /obj/item/slime_extract/sepia required_other = TRUE -/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimestop/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) addtimer(CALLBACK(src, .proc/slime_stop, holder), 5 SECONDS) /datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder) @@ -498,7 +499,7 @@ required_container = /obj/item/slime_extract/sepia required_other = TRUE -/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/camera(get_turf(holder.my_atom)) new /obj/item/camera_film(get_turf(holder.my_atom)) ..() @@ -508,7 +509,7 @@ required_container = /obj/item/slime_extract/sepia required_other = TRUE -/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25) ..() @@ -518,7 +519,7 @@ required_container = /obj/item/slime_extract/pyrite required_other = TRUE -/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/chosen = pick(subtypesof(/obj/item/paint)) new chosen(get_turf(holder.my_atom)) ..() @@ -528,7 +529,7 @@ required_container = /obj/item/slime_extract/pyrite required_other = TRUE -/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) new chosen(get_turf(holder.my_atom)) ..() @@ -539,7 +540,7 @@ required_other = TRUE required_container = /obj/item/slime_extract/rainbow -/datum/chemical_reaction/slime/slime_rng/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime/slime_rng/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) if(created_volume >= 5) var/obj/item/grenade/clusterbuster/slime/S = new (get_turf(holder.my_atom)) S.visible_message("Infused with plasma, the core begins to expand uncontrollably!") @@ -556,7 +557,7 @@ required_other = TRUE required_container = /obj/item/slime_extract/rainbow -/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/reagents/holder, created_volume) +/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) var/obj/item/grenade/clusterbuster/slime/volatile/S = new (T) S.visible_message("Infused with slime jelly, the core begins to expand uncontrollably!") @@ -577,7 +578,7 @@ required_other = TRUE required_container = /obj/item/slime_extract/rainbow -/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/slimepotion/transference(get_turf(holder.my_atom)) ..() @@ -586,6 +587,6 @@ required_other = TRUE required_container = /obj/item/slime_extract/rainbow -/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder) +/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/equilibrium/reaction, datum/reagents/holder, created_volume) new /obj/item/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom)) ..() diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index f257ea82141..a016d4c4b65 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -34,6 +34,13 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) /datum/chemical_reaction/randomized + //Increase default leniency because these are already hard enough + optimal_ph_min = 1 + optimal_ph_max = 13 + temp_exponent_factor = 0 + ph_exponent_factor = 1 + H_ion_release = 0 + var/persistent = FALSE var/persistence_period = 7 //Will reset every x days var/created //creation timestamp @@ -44,6 +51,22 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) var/randomize_req_temperature = TRUE var/min_temp = 1 var/max_temp = 600 + ///If the reaction can be exothermic or endothermic randomly too + var/exo_or_endothermic = FALSE + + ///If pH is randomised + var/randomize_req_ph = FALSE + ///Lowest pH value possible + var/min_ph = 0 + ///Highest pH value possible + var/max_ph = 14 + ///How much the range can deviate, and also affects impure range + var/inoptimal_range_ph = 3 + + ///If the impurity failure threshold is randomized between 0 - 0.4 + var/randomize_impurity_minimum = FALSE + ///If the impure/inverse/failure reagents are randomized + var/randomize_impurity_reagents = FALSE var/randomize_inputs = TRUE var/min_input_reagent_amount = 1 @@ -67,8 +90,39 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) if(randomize_container) required_container = pick(possible_containers) if(randomize_req_temperature) - required_temp = rand(min_temp,max_temp) is_cold_recipe = pick(TRUE,FALSE) + if(is_cold_recipe) + required_temp = rand(min_temp+50, max_temp) + optimal_temp = rand(min_temp+25, required_temp-10) + overheat_temp = rand(min_temp, optimal_temp-10) + if(overheat_temp >= 200) //Otherwise it can disappear when you're mixing and I don't want this to happen here + overheat_temp = 200 + if(exo_or_endothermic) + thermic_constant = (rand(-200, 200)) + else + required_temp = rand(min_temp, max_temp-50) + optimal_temp = rand(required_temp+10, max_temp-25) + overheat_temp = rand(optimal_temp, max_temp+50) + if(overheat_temp <= 400) + overheat_temp = 400 + if(exo_or_endothermic) + thermic_constant = (rand(-200, 200)) + + if(randomize_req_ph) + optimal_ph_min = min_ph + rand(0, inoptimal_range_ph) + optimal_ph_max = max((max_ph + rand(0, inoptimal_range_ph)), (min_ph + 1)) //Always ensure we've a window of 1 + determin_ph_range = inoptimal_range_ph + H_ion_release = (rand(0, 25)/100)// 0 - 0.25 + + if(randomize_impurity_minimum) + purity_min = (rand(0, 4)/10) + + if(randomize_impurity_reagents) + for(var/rid in required_reagents) + var/datum/reagent/R = GLOB.chemical_reagents_list[rid] + R.impure_chem = get_random_reagent_id() + R.inverse_chem = get_random_reagent_id() + R.failed_chem = get_random_reagent_id() if(randomize_results) results = list() @@ -141,8 +195,18 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) return FALSE required_catalysts = req_catalysts - required_temp = recipe_data["required_temp"] is_cold_recipe = recipe_data["is_cold_recipe"] + required_temp = recipe_data["required_temp"] + optimal_temp = recipe_data["optimal_temp"] + overheat_temp = recipe_data["overheat_temp"] + thermic_constant = recipe_data["thermic_constant"] + + optimal_ph_min = recipe_data["optimal_ph_min"] + optimal_ph_max = recipe_data["optimal_ph_max"] + determin_ph_range = recipe_data["determin_ph_range"] + H_ion_release = recipe_data["H_ion_release"] + + purity_min = recipe_data["purity_min"] var/temp_results = unwrap_reagent_list(recipe_data["results"]) if(!temp_results) @@ -226,15 +290,28 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) var/datum/reagent/R = GLOB.chemical_reagents_list[rid] dat += "
  • [recipe.required_catalysts[rid]]u of [R.name]
  • " dat += "" - dat += "Mix slowly" + dat += "Mix slowly
      " if(recipe.required_container) var/obj/item/I = recipe.required_container - dat += " in [initial(I.name)]" + dat += "
    • in a [initial(I.name)]
    • " if(recipe.required_temp != 0) if(recipe.is_cold_recipe) - dat += " below [recipe.required_temp] degrees" + dat += "
    • cooling it below [recipe.required_temp] degrees" + dat += " but not below [recipe.overheat_temp] degrees
    • " else - dat += " above [recipe.required_temp] degrees" + dat += "
    • heating it above [recipe.required_temp] degrees" + dat += " but not above [recipe.overheat_temp] degrees" + if(recipe.thermic_constant > 0) + dat += "
    • taking care of it's exothermic nature
    • " + else if(recipe.thermic_constant < 0) + dat += "
    • taking care of it's endothermic nature
    • " + var/datum/chemical_reaction/randomized/random_recipe = recipe + if(random_recipe) + if(random_recipe.randomize_req_ph) + dat += "
    • keeping your pH between [recipe.optimal_ph_min] and [recipe.optimal_ph_max]
    • " + if(random_recipe.randomize_impurity_minimum) + dat += "
    • and your purity above [recipe.purity_min]
    • " + dat += "
    " dat += "." info = dat.Join("") update_icon() diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index ee7515e36d2..dc84a712ebb 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -48,6 +48,7 @@ results = list(/datum/reagent/toxin/plasma = 12) //One sheet of hot ice makes 200m of plasma required_reagents = list(/datum/reagent/toxin/hot_ice = 1) required_temp = T0C + 30 //Don't burst into flames when you melt + thermic_constant = -200//Counter the heat /datum/chemical_reaction/chloralhydrate results = list(/datum/reagent/toxin/chloralhydrate = 1) diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 0780ba5173a..a3dc843946d 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -207,6 +207,31 @@ desc = "A small bottle of atropine." list_reagents = list(/datum/reagent/medicine/atropine = 30) +/obj/item/reagent_containers/glass/bottle/random_buffer + name = "Buffer bottle" + desc = "A small bottle of chemical buffer." + +/obj/item/reagent_containers/glass/bottle/random_buffer/Initialize() + . = ..() + if(prob(50)) + name = "Acidic buffer bottle" + desc = "A small bottle of acidic buffer." + reagents.add_reagent(/datum/reagent/reaction_agent/acidic_buffer, 30) + else + name = "Basic buffer bottle" + desc = "A small bottle of basic buffer." + reagents.add_reagent(/datum/reagent/reaction_agent/basic_buffer, 30) + +/obj/item/reagent_containers/glass/bottle/acidic_buffer + name = "Acidic buffer bottle" + desc = "A small bottle of acidic buffer." + list_reagents = list(/datum/reagent/reaction_agent/acidic_buffer = 30) + +/obj/item/reagent_containers/glass/bottle/basic_buffer + name = "Basic buffer bottle" + desc = "A small bottle of basic buffer." + list_reagents = list(/datum/reagent/reaction_agent/basic_buffer = 30) + /obj/item/reagent_containers/glass/bottle/romerol name = "romerol bottle" desc = "A small bottle of Romerol. The REAL zombie powder." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 1f4f7e9fd29..0eb508e6c16 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -71,6 +71,15 @@ build_path = /obj/item/reagent_containers/glass/beaker/meta category = list("Medical Designs") +/datum/design/ph_meter + name = "Chemical analyser" + id = "ph_meter" + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + materials = list(/datum/material/glass = 2500, /datum/material/gold = 1000, /datum/material/titanium = 1000) + build_path = /obj/item/ph_meter + category = list("Medical Designs") + /datum/design/bluespacesyringe name = "Bluespace Syringe" desc = "An advanced syringe that can hold 60 units of chemicals" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 4adebd49e30..ea02de3c91a 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -76,7 +76,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "detective_scanner", "defibrillator_compact") + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "detective_scanner", "defibrillator_compact", "ph_meter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/bio_process diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 7ec18430995..2b6bb87102a 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -105,6 +105,21 @@ if(damage > maxHealth)//cap liver damage damage = maxHealth +/obj/item/organ/liver/on_death() + . = ..() + var/mob/living/carbon/carbon_owner = owner + if(!owner)//If we're outside of a mob + return + if(!iscarbon(carbon_owner)) + CRASH("on_death() called for [src] ([type]) with invalid owner ([isnull(owner) ? "null" : owner.type])") + if(carbon_owner.stat != DEAD) + CRASH("on_death() called for [src] ([type]) with not-dead owner ([owner])") + if((organ_flags & ORGAN_FAILING) && HAS_TRAIT(carbon_owner, TRAIT_NOMETABOLISM))//can't process reagents with a failing liver + return + for(var/reagent in carbon_owner.reagents.reagent_list) + var/datum/reagent/R = reagent + R.on_mob_dead(carbon_owner) + #undef HAS_SILENT_TOXIN #undef HAS_NO_TOXIN #undef HAS_PAINFUL_TOXIN diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 4f0b62cef33..3aca8f7f0c3 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -407,7 +407,8 @@ /obj/item/storage/backpack/chemistry = 2, /obj/item/storage/backpack/satchel/chem = 2, /obj/item/storage/backpack/duffelbag/chemistry = 2, - /obj/item/storage/bag/chemistry = 2) + /obj/item/storage/bag/chemistry = 2, + /obj/item/ph_booklet = 3) contraband = list(/obj/item/reagent_containers/spray/syndicate = 2) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe payment_department = ACCOUNT_MED diff --git a/icons/UI_Icons/Achievements/Misc/chem_tut.png b/icons/UI_Icons/Achievements/Misc/chem_tut.png new file mode 100644 index 0000000000000000000000000000000000000000..4edc877f7e5c1df350a4edec8afbc24b6a5386a8 GIT binary patch literal 25969 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

    lJfdKmHcRM}QGu+E6Z#7tX@< z>P=}UYi(=wX(mM(XUm)53Y-s!0ID9dC*X*1T?DQ-$1bfBOuWTG$rIp!oR7AQh=V*i z=y!vsw()x~%E*A;^0Zp>SHDTSb<@Km$$Fr-BOmsu z&Ga7_{pt*u0=S`^EGKRIRm6m<=c(uA)fY92ggsD(;Vt;FbJ zd@2c*F_8E$GD=kB{_@rVm|F9XgXG3an0Z6{^ zENWW@woQg@qqctOivzXVu1`PdU5cyJmfZl44Zw=Xa==8x(_K^5M>MR8UU5G}h^89Nm>_7Aym_$TC6FXb5b?X6^m}(NEhOeT4dPQmz zwXLq7WB9Z&sQDDUrY{T7hH@-qNXw&WC+nw%Pqh@U*DWaytAe-eg9ZG45Qm_3Mb#`P z*9D1(JuaKgg{`*^!H(>M7;H=i)8KMu@?_e>OJLHu-AB(P15Y-KKBtA!mqB3F^@{?; ztWFZ9cq%cLv)E3g@ATlbuy?pdjz(|aj@YP%1)_Y&%Fh57+b#@P z2^OobgZL5gP$0*k0ak^EMumwfA61I#nu>L<`1Y7Ql-lw&U=hPF8vUA2CDFx2{=I1P zJc{->@?GlkDVdsl>UvEoprNG=LQx5>50e8Q*S*q4`9)_|!Hx81VD7+!>60-=ff;i; zb^uu`T=Ilv^lLcOq<$2EAhDv}kPLiXY*x*Bew9ip3R_!QF{eIzxBN#wR+Nepz+wB( zfkPpFw@1?uPR4~mt0}|4sjmwNik?6p^@@J*Y0)}JQvY62P3HJt@v$NWU{s^&0h8 zUv)IT;+(eq{@+IlTVA zDpiMLqu8)IJO^mMq2j~07(Vg9PJ&#f29Uf6-Gl2m*8ku0;oDE4!E_S;b3d&tm(T3q VL<$B6n5h-_K0|t+b)ES8{{v5oNGkvU literal 0 HcmV?d00001 diff --git a/icons/UI_Icons/Advisors/chem_help_advisor.gif b/icons/UI_Icons/Advisors/chem_help_advisor.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bb2959974b2478e4bd5efde4cf4773285409c8e GIT binary patch literal 5318 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

    R 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 E0CjVuvj6}9 literal 49796 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

    Qu zDrQK3^xPI)EXH?in$I@JtiAY_Sq-H#XZ(;yEmD}HrlT4)M9r{$o%b)e%L{X5OdqlA z-Z7eX^h_m7_MOj9xY$~pn(TF&WRo8ZgINw8@I-GH2Q;6=scjkgs3skaVo>i1-unCs zJY5;&ZQ1#e*XW1I8I|n~K9W65X>B5(LKt3`rhX7kR1tCaa-6V--DtwfAPz(;-L%F- z)rMZHp`jVLd^crPv{*%3d+R>Kw-ff8T9K#_Gg2<{L}lpeyqp68O_+r5#WUb|>RDuF4;<67^&j60ygAt2 z!zW|FA<@62sYBr>ySA_<^xb-8FWC+9JQ$C(!w}g2?hwL)qXB92Q!E?dkSm z;dqC?bw~E>YO8)n)6v6D67vRrW}7=jC-eL0$Ep~aYGf!Q|dM zzc1?NL-I~U)U30p*982vm`APUoN68%Z*gU)paFqsXqM2D(Ai00T9^!a$WjsWZ}UJK z9k;jjcNp^g89>wv8t9D{%Iq@$%=#b_pU^I~SPsf!Up|7Cqn-Zt75V?cgO-+$WcrW) zsGOCUehv0(SoN%&}!qXP9%L*CNW_bF}5}1`@B?06w|kW9NfLAXAInF z2mqhx3MKXzM+4~17@l`-A1>Fw(7+_e@lACCha26Q8K$Ec5t1Y<`wL`tSE%$)5)jXT z>sRpeBwpjzABBZ@@mE!9#^6Xauwqe{uZlgd5O%2cU{B-ugp)vwf8g0d*c5n8rPb&j z!HcX2fbUn5aWr3hwr;PV$|qSd`Xa8Nd9~NMfecyBHab0MQlD;ZlwG>4h^Lo7Z|0dW z7T*~xt*lQN4QmQGt|HJn1Mw|VTNeJenj-c; zS!lS3i=@f__bGG!j41YMl0B__Z$tGU5OT?6B( zlv#NcI!%isFJ|zK8v0u^I@>S>HaGLNcYe$^WlQqspy1KTeg2_V2fxkp)m*Utv6My& zMT^juyqu?V6c5i@nFv5xVLS1*v!iJ;13Q5+KgDEts{o?n|9LoHm}$O8iQOzZse6s< zEBTve#4W}RY!88)_cD%1f*E6XXAR8tDO}3EZ;$vBn_FRl&}+hj?^p!*Scpzb|HMX3vR-WdksqEcS?US^wkTlcQGu{`OZ@8G{($^KB~^L?hhX zHTM8Q;BLB6MGM!$OzX4|0g$RZ5z;9SG&g`~r^v`!6XjbC{02&&ah>HVa zfR8KVyLaG1t-bfM@VKn*W$zI@3f)VB1*Ci3oLn!7z;D^f-2ajiTt^wDKU3^B?T_wd zf#l_%9V`mEO`C*{pC}Rp{QTzxT#TDWQMook>P}ye8&n{p{;dcRYvu+7hUqCXV_fxF z|8Y#)0}Z7Z+XAxw8`&{p{FP8zqin_zkaQXcdgG*`Km65piN5`bZIydQI5tVPSXV-*j#p+y1&U z`JAlb-Kk%+1(yP+UXET$o9EL`^N~5C2^Hj3-+RF~Q zBaJU}T%5KMHjyGdpDyAx_?YUbDzwDzIx4rxqWu2sF#zZ6CSQ>}Ypmp8PSkX=QEUFn zWr#~mNR5pwJzhhi*bTIRz0sb9Z~M~#@0P&J1IH6j9RpGhT&rNtXzt-=9ep31`FZpg z@FtXFJ=CxLylFkvwoLDAJ1=Hr8Iu^Eh2DRqGZXcS24FEX`i_jZngPuDc3*k@f;k@* z7Hbz>T*7tA46f2yHQGS4*w5Q01S*#KZ)+Vr9$9VC7T{e}MC2 zVQYRiMZ8Bz%?g_aUT&O|F-lMaZHwb=jXemb8QPFfW1%PTXps_whRR;nRUMq{U%#8P zsP!>g&p3c^HV2j=&2q#KPRTGv)eg$)-dyhfkFq}CcE!0-As+x?_hN2FUUHCx`LDh#~MOChdYZ&yO=5JpW_=zOBlbMgnfairgL$DWSn zv)|EheQHbj9A|~1P|K*?)=#qTV0o%(;ezES^3w`!+3L~ZdAmZ6%8KjE-I-4wPYS-N z3iwD!p46M`kx@e5H7!WzVPN-+s^9OheP}T$m529)Bmltx}eBwA^<5 z<^_$R1f=^e1OOgzV8vMHDwSoiQ$n%3%JqP`OJ<0e_rC7;VzzfJmu7|bYxSRX>jIcr zFr8E>wP6R+`bC_)$lmV>0N_zw%Q-*2TinV<@DS{YQ+C3aI1ix+5`J5IJ@L|Kpz?;@ zrMV6lN`3IAdHQ<_k?z8dbh#VmcmcjP`;$FoCL#FeZwFLkOYOqNYPc9jGKTS`M**fM zn)f736ZuJN->vn+t!K~nmCi(VRlf+*$cUKyF0%R=9tN{fONNS+gigyQ)3N^eGTqIf z@sTvV_Ivjlr)vvi&LWxac4DA$bMjK!$(hF!G#6_iHO6|n1l#2cQ7Mdf@qC52hOBv; zwyu@!FLncC_88|)eg8;%2|Pu?`0^R7{v4N`70f@~1~DnZk!b%Dv)1D{P(?dxy++E^ zvC8-f0V^r8XuR^4s|)t>|3VfS2tDXi9oT@BsKx49By4WOLsR-(vKcY5kb?0(pVB$K z6Tn*yTBKw3%OpT>{daPr=Qz#LZa;y4cq5SPoj;hJcG5WCCf_(Y1m9jv{GX=QeG>oK zk#wTaPO^*W`sCp)wki|@VpNqew%mnp%ay@@>s)2yTnIE3x$Weq~=em0R za~hYR+uptQ@FXE}x68-0u%|nvg7z<1)%Cjv%<5Y^gxhhMv4?Ntz3){3au0noIB~Bh zVhL_#d?j14>TY(1DG(d?hqv=Y>p9aB|2!{H6#5C`Y@FlQU~NF% zMIYaF;F1ULbq>#$3e0U!XfC3|`~qgml#dMQE?n3)nCkP;WgNI*kB?p$-zoH0*I%kTTBfpgcYjGWu+e9N!F;t2&XCB+!R;SQb^3Q$qxC82aHEjpH@7V7BVb4LUe*LV_#l#!g zttqj1`bt6N&sJOF?F7>L!{ZIMT5C@vbQ(LB$J^Qth-THZt+3I8*n-&l<+9;CjHjje zz^Jyl<)6wP%HQ#43{L-Z7CiWz_#%0}E>p`d8^k92X5QhOO4?1=mljVs2*Uj-y`>3oj3L z;BwORRdETasy!tkG<4=%W;y%z23r<^Gr(uyubi4qeq4%LyTQOvK?+q(1b05dpKo9B zwlwI^w9|()T4cs)!yNn6$kiC=AshcpCdM|}3v;dqn73$n#PC$@tygq~ zNC=w#m*U;7fccpmx2-DJ@E_faajjj`L8nFL&%Se*IU81DH%icHumi%Fij3uW!lR5{ zXt+FodQCw*zw!58c0-R<0cw^$t%{4Hx!-Zj`~%T4Ky#~*5> zeX9?2r`3iUd%r>VZS_31Wv?Y-NpLtzCKdhXbHBc{sxF`~6Ua+(_x@8`SodA|QPVHd zZ4DhJDAVt#&wSr-Zz(dpYhO51jT>!}~*DA%9L-GZI2OX-?X7p5$y%#3ZpXcb)t4o{*wpF>$oj|Ym8W%00N^7&C zetb;?_CNKQ>oktcc*tC)lSe+1k?nqzGE3~ zN6ReDLk*(8GMa&oqS81@v#s!(-m-0Ub|_6xFTURyDbFRciMlq`MJS$!=a7`UPPmAO{*mZch-x23`5~U}y2pwrvdrp!38o zKJ8PdIlD(XmS+QX5bF_k(=Yz;)ReiLy9-SzC|E3E<|+}<9JdpulK-0QC7xnouxd`bqJ}fZK?yaTJ*aO zXm`k3uycWG@8pEk7d?-I3LJ1;D>Wa>bi@#kfv==gm+k;S`@Q)d>C#9_{b@?J<5^G!;lW5Xw!_@zbcrfD~As?8J{k$ z)1C0*1v+PcloDtO>S}Vlqinm0h4PS&k*nHs_3jjXKQG3UCBDaX2g~;KRnhO>v7r(fg9z6`)?oxg?{f18Z3-o?T zN!8~PD~~(n)>}cYQ}gkNI?wp^v%$Z!6IX{XrR9qJwIaLE!q40q0Jbr8;X$Ose^lG z0c;Bo!070kTLY(-1F`Di8b{z zY|gW;hD?z3nCV(kR0+~0(szYq#R+r*B$hpXomONJojb**fV2sdxnglRy#blYJ2{@- zQZkvb^)UuA`yhT^L09^qX={Wmc8tw21!;iDO!^Vp$+d&wrUZ}Nbfsb+%{As@^)#5D z*Y{tOs1+XAM9&Zy%_*E@>0}A+QN5C+B(~fNBDV+|%WQ_B0z8NafXY2cM2Qsuo(8xd zHS#y2YC^_=h}{^k;+7YJQJbhf5qiJtvK7lCe%#jNjJpoA<8K&eQ2mmWfam5Vy?s=b~nN>WgmQ`!VZCa3pUCN6p1 zBw8?5Yh~hdNo+<$s1L^qz6Zx$j!Fe0KM8C?zTSzcEAI>*1`V;{yAybPR@PCh=AVPE zzI9i(NA755d&e?DjNYM7zkDYcNGeibA962 zk)%~N9Le{M&i&_i(h?fSQn;de63dWTG*eW3;qGfsX7o%}E)0r_ZfUflC*E%; z83-bdMk+KY)WYkz4yycdltsZ)K{;8zyIZGzk3rzMBlhjfZxgd{H2z^&<@}Q|Tq8~F zYB^dty#wHIxq?>+ng#vd|! zXV*4|99_qB`I!%zk%$H1Ve!JBn(wPARi7My{&(Ay3&-2_RSjH=9yY8)Fp|}W1{sN& zf(x2}$M#XdA2k#RmkY|Wj!EZ|Uh-7g+~CHnmhA-eT(;zM|3_2AN#LeI_5Sjqf0) zaPfj1`Uvcd6i77H%ny!mnOcUHtc+o#p5M#e*S_x~f8ORFX&BEv`D%@Htm$|mCv}NM z)?KQ|nCBT(KCtehFU5x%r(pOR5ORQx-^f3P?K& z*!joArr$Fpt87aAf(AQSZdbWmj3>)KixAcR604*erxE(K_0?Q0wz-4p<`Rii;q#?o zi(FvYJa6Dd%2Cy;h5kyo^#PEWLIX0hhQB7aoZU$a7aw>X1J1Rn1H;c>Xf8_~?9aV} z^Xr}eyk)Gium_T#dte0F2b5*aq8enfGlq?B$Zj)*Q7*b2Lq`siycr<5zhsbkP`|&V=(Pks$Zs^TDCq=)69khN$BlVMgNMW^o`-gt zrpTK-_V~0qKGc{Vg(k$V`&f{RW29;k6C@B5ZhrFZs+p`BjH-PvMoc7~JlIkqBtQni zru6Q2s$P;JgfED;&)LCDl21I_UC8EakZfGNVKKi)IE)X;o^~~qU-_VjDZLHDCZ`Sj zO6mI<79IMUbGZv?!R93*-p^jTI;JYtw@}^Y_6#%Wc1FI_?l{TbNI8H7vU9Q3`iAQ? zyHY`6c7lYjK^o0(E@q~`fp%-UnBsC^mIK@>tXd@rTRS)y2(mL1e7K8C9xA;PbmOQ} z2ZV;X&)>&LnKj5Msk>U<#yTm>*0sss z$ySQ`iQX-I*6k}DcH#s|sLJDMm=2;Rm-M6e7g1=JQ{O43hqgqqskpI*@bO!=VyW(I zueo(j|G7iOIl3D>zG)6(Z3A@$CLt_cy)9X0ElNA`Mc)-TIk-?QjW-!C*h}s zb!@w9O?Sz$Iyj}Cx6~4$g_ux#Bm1E~i>G*n(yJ1IW!hu$>v0e3_ut&4*e_PWiSJR3 z?}r9gGROPd^h*HY-1^1b{NORmWcNaWX|7v`-Ey*&FZ$%uKznR%r;zvJOv~nXK zKdTz-FlN8N^hJs(+s*g=l@FTNto2``jPkypKcqhm>8@sP!sIAm_a&!Q=W2PJB;8_V zGtAe>qK>(*wE_1V$ju1rXJY2_>;}wEzNIuANmP6TGfeZ{3qwRFIvyyk%MfDCJ9b;2vzU;E{=JtkN1W;B<-sMGbBWB|e#idKRe6%L>pw7VBz`(?(Xg{vc}EB4(0&{XIS{frXD=aH zZW^SgM`ssTB_S!)(xG6IgD>+jHX{h}{U#=o@2v{oQFExkeW}&|e$5WMUA?P7ch$UBM zOS&I92rWh*^ zJgT`PMJ|z!Wcn*2SI!_?0YjTUQvlM}Oho!@j&n*kgta*_~*2{c`qea5EOi_E%hs(cB8Bqj^eFjaDLW^Ug&?2u#LQcDD=x?+1kAEZR_HXu zg0)4PPps&5X+eHjpn$qB-&<*fRaq1^cLcHk&mt_Vy7uk2a*wF@%UDgon59rO{O<)w z=>8nIvPs`L;e)(nI&*K;F5FyTB{+&V;J_{S(9xe+=Cd0; zMylibs^NHR!s90E5KOi6*WMJkI3ri3bvst@1ZLAO= z5z6XJ_{vkVG*yz`j{ll!ZQ74wZfZ*m%bJ z%RGXcKTQs#f1Arn73em2?3z;z93E?Gr4@8f8G>8)t;-HG0 zfnAQ^*U2Z)0*`t3eI6mca0`%%#S-R~mDH(>{0DurTJ%19#{1-lLV5fjs{ft>|EF*< z1oa!n>(4~3zU>aw+-c@8tNkWRcUNWaNgUSg3G#oRnqE4~?8!+?22zWaR+hh+%t=Om zyVa_}e*$6`AiZsj;tR$9i1W82`#&p)ZGMXLcSH4g_}U{iP|pvSteLRo9C)?SBQi{! z_~iI(e!pnCT}}sH*JK_$Sh16U{acoE5#-b_;DD*CVJ-y!HYdWuRcXTXu_bAy%Ws-P(pP>%tRad1Kf#8!+a#5^*X^%NsbfSqG;G#P}hUIn( z6%L{wk?Tr5YI@StB8mbJNo7l7ljlz>h0(B>?@g*RRMrijJ3OCLmTl?!Yt>5>?QJCb z&ci6uJCIDFwK&6wk^kj;>XSaRVbldsMax~!_E^ojT`~KjzBOzD1RW0^;Nl9_b_(16VP7S5~2S&l@v9Q`Hjq>w1 znqrqfz!6=oHn=k8ABCFbd-&KZ3EI0qX2GA`>pNx>aQiCqgSSH6we?)pZlZ*Aw|`97 z!i&PB-1RX_QA#Zf8LSFG%<+UlZ9sT6?R|@Py2Bw`~0im_`5M5J>PH_ z?+j_!ZvZB?sV3jzf#c_&?bog+4l1y3b7xRJz6WYqkT!R`bQ7`V1oPWCq3%z>1?r~i!wWnneV8W;AQ;yYahfU3Mf>e!o| zf=nkTcCzf18tiR`5PyGkYwb=yhLwP9;x3j|`8WBrqgss;Hvt(HN7Rh?}Sw{kifBoupQ zq|AqS34=>H5^&VR>vIrZ+{9CX>G;`gNo@VB6c4g@jW$^2M+^l7lvsK%wQwq_4_NYEkm6kuVmVm!cxzEV%0b0QxE6GYIIDk@w3Ue=z)ra|}CB5v1J2(zxWovJTK4cIW4+#-q9^8V&3q)p&KrPQoYHFy|gZVL4+ zXwp9eL6hmJh>`2rPMW#T$Z<>6oH}eAz;yB{DDKrn_4_IRcl%`!sqjEB5P<$EFd@wfSj7~>nl71L)-CuSI-i3fNwW<4}o)oBEQ zX2(B53RzTqeAN`R#e-ESS2e+6dL2Hm?^g4F6RbS*Nzn&)P1R-ouz;Z}Vi~n~^V35m zbTQy?F>(2f-E;Ct8D|l#)20hf5COLEx*gu(f-wdmh81f#=?UUq<1?rQ?ym!-$KR_< zl1$wQ31p*i4=hcTsxZA3B}o@L)X9c@*0$2@O+R=+{?hJqhtAVBTY6<%FvH|BrXqXf z4O&+7YeE1u7K8HS>q|;HXAUWcmuTtz;Lo={{^w1~OU6ckbKtHh%j0fQ+YIysFEN-P5_kv6K<^fU0PowXe6}=7)^mO_C%`cN zW6_K<*4-8o#hJLZlpZZ=lbhqk22y-|>ddFdzM!{JRdGU6cR)#7;2Z#hizFYEWb{we zkJt6_5VLODJI7jMYm^7k5`wWV4;l|J{u00(=Vj$Rg;)|HXo!Ul3KU3~N@hOsee3%O=FiFQ;PxOoBg3A{Z7x9bL=Y#|`OW|?im z&mjF^NHEFl zSGMPh#1~kX0!9_?bKTkRRkL$#8-F!(Y@1u7WuOq1)qo;bY)ZM5+Lm7Mao&eu35oDI zvCu!_swu)Shw7O8@IS0>i2rv$U@?5jV4f@@5mq=)RL6f}KEJYGJ-)2kR)VdL3oZca z-c#;0k_TMDt%O zW~iWehN2Vrtd!Mka1!}xt6p#L`P3-75$ zqszyQLO+H((!z?GZSyY9Q{0nnIpbfXS-p>#a$i}Tb>>eB<22TTfe75XBlxZ_A*1zn z!%~RN--VgFXVjLd@CgwCzc%;VQ>cV`1R}pC+BCp=kSu2m!#?SgCL*7Wh7$>% zY&u!Xo~NZ#CY6^LZkEX3*i3{XwuRjmUWwC07AI_g?EOx7UC`3YWO6ITlCluha~Owz zagdKLzajRT9wC*}p`JJ|FZh33)z2P&zoUgU7D-}(%=*l#9g;GnYxi(5b~GYbZN8oq zvQEh{WOjTx>>AoFSe=L0xkmqm!gM8o!w*jPrB;%fNMCBu zJ%rriOZ|J|Y&*doKI!PQ?=tzMu=nKIuQhu8yW9#&z1}ELQS-;DUcVf1>A3J_y3oUp z&Da~w#3RVlu{kDEr0W<+9rDPQp(jwjGmJDEtmM%X*Pg5O1RZfPgQiX51c|o7u73!4 zF5Dvh&p+_x;enKodLEX!dhj%G$8={G(;vpC6s*&>{dR5wAl7Ac(lw=uv0x)x6N3-} zMen1un(`DvmqnAn==@ljplt`|o*a`kn*-HW%@GI=c2LqVK1u0+a|3pXbR97yzyG60 z+jzcd!0LI_6Z3g;=&U<1$n5d!HeF8%Et#ENCbr`{*dNWhVXs6UT!~XX$SHn3m)!Lw z&|FR($LN#PMT=xNY1;wFd?1Ss$;%ujWP-b-t13fQge3O&v!^MnsM4PNz9g&@K*?R3 zwpZf5iu9s``c7zf9KP);;`<#-pxC$@_(1qh>eJx00FuWeTUQ^z(I|gvXK3r%M_Y$R zx-#|s&sl&b)3K4ZTcP^pTTEUC&EerBhKjx<<=gR^XF2Jv=?T?*_A*~C&LWZG0`^@P zh~@RAHZ9$o{+-qLbBg1F=n2&mcIdHG5N?IgG=%YQyY{kMrbAO*&u@RpNOSUBy_kXA z^AQ_0x!Fp*+aXCW< zBLg2n9V3Ka5bJJ0>f{J**To*+2uWJ}*HxuQXGh>xXo_1~z-u7I9uz$*vY&cJAm!&` zY(13mX)u${ah*AnuR$Vf;U*nan9ws1kHkIr2Ob8oeMl$`FOrtoXDYKha}kka-)T1c zu5$&)9lWb#3x?K7@!rGmioJ*TYi%B=55~3W0|b2Darj2R?c~pVwU1_LsxR-pt2ShG zsFlYg(LHCFKj$6X@@1h>jiERciUKOU#f0x{-N$odq>Q^?du87$+$4cdP)*V$8}@Jo zr9?;c1)qQ7>yQ|6ABcvXM^(Dx9+5-WsnmVP2)%+_W)btJK^$S16=&RMcRLfYkH3c1 zr$CMI-?*#=ZH7pGUHJ)Qd-xpiVf%zP?F0^rOoi<@M_xiXC=3tOF2u)jFf_R@y+R0P z7!}iK9}i-V*iZ|R{||5P0Te~IwTsDDM-P65$_u6Z(XRT+g-urn} zxHyW0#OrJ2$stq`dXk~JhfD(_96Y35@@McZAK3+|H-^DdNFOd&x8LB%NTmS)$iuW- zZXtmWmbj7*m5=YBn!bBIAriTo=((f8fAgc%BEMSgQ>o9lx#{k#*-z$as>9ZOjw-T8 zk6n3Y<-wraB#=X=C7H$kOJ?`3X2yy*?9=bACj#VPTDM|T4MD-Y+s5Tpy%exnuU0ZY_4~nz2Df`< z9KiJ&kSIgx*DH+;;1W7_Ge?DoEQ>v8wA9dONvrNufudMNY686Rn5uGNg@ zoS-{)0YQ8F@Hv67Zwd<&p>VO(gDd7_G&bd*x5ck$bfX-CeYIbHZy6EWMpv2b zb}nf|^2ylwkj3@qK&S?2+)pL&O9I{MKaZ>#pgxIiD3Pr*)4=w$LYMv9d9LOpd`}@h zcpLH7YVlZQ`*70cD$$3pgg0Z06`1dgy+TT;{hBPPDc1B&f-GTz)bPtA|W3U^ap z*xCsgXR>t3LfzYAiAElk#0o5sc4-N6obLSTLwe0v4j6MHF{5IvpfC}m zB8BT)Tj6KRLHT%5RiE#dYm06M{rDVJj-oee5xAjhD&8cY+6&YweLS$!+*73YDa%jS|iG*B>2j~AdYZ`SscP=JT$pjaS}G`E*}RvBd$Q`eHdyqVjPS;Tp9=%4T@zQX6eU-fCtC-MV_7&8k5kEuwWnVRl+ z5bynTS$^RkwK|q>QPwn5aw`|cJ2z%5+>reF0i6OdE5j<9`khB1;r*bla=A^7KNqCF5O(5sJyrT9FCWdLa;b8$k0~QFtshlA z`}bMIn@nv8`(d^+{Xl9*;71Dq3vvTWk;(G4CjxI_2kdvyMAM4$_an=1^h=z45tgTr zEDQr~*VBs1IDJsD>m8l_6G zjv>MNRuG;`a=-HoQ#$#BElOunE{~zv4Ab!VK|=@FH$b9{2#jAdA=Hf-M-8vd21}%W znd3~ctG_a2tCJiD3iTVxD&^kHkC-Vd!uA|iU&9f<9UYBelfy5pLVhBqf?yiX(QCOY{1yacK|cy#6^N#9YmBIPb6)s zwiTh*9@*3R3F4Q8zSgqP)KD|^!QY*(s;a?9S!WXmaYg8wTgyLP*#h)Wzf_e!c~ymy zUmxA+i8KWh*X?75o9yS3kWBEN}Y{2l%AWiXw>Ds73+OR7cqhg0uv z^5dmZ3_dpa3OFH7^;f_A$m1IKZ=tuAP5L}rCAAEZaL?AZl;>nyv1em{h2+;b#{WEP z?uo{Km-rC8xXr4AIB?PD`gn$yr{0ewEvkfh$sI@|IPm}RB1 z6T%C5m1Jk}%t4C4cj~VNp-{1~0^o3vaXfs(e)fqTC=d zZO;cjF;xltp~Eh?F*)#lZ_Re~mF;TOx75pCk?Imllp<5Pde)j@X)+v^4>F#C8(fCBvBS&3|A#?d9M@fl^-2EpzD)+mo*=1_OF-s>= z+$?~ct$J^3UXSFBOeN2NhXVM@9F}g3TKoFD;`C*1BrxmT+IVpkl%9tu z?ql~B5G?KEl!I5i&r;V{F?>t4vHe)ZQ^Rv`oA$6kS>AsqQHAR{Im6SBkfxH-B5Ghz zqMkO?I&_VhW5TVA^G*Qx7SB5L`5Ne{$dT5>&={%j*W`H7@2rw6u8;vtR@XfYgysL> zVayVHe>1G=yVbf9eO<5e6uj!JGZ|<@**JROfZtpzS}JrK)Y{JHAIUA!hR2U0%MRq& zOlao>5%_T$5zlVa-18Lduy|Tfi6+_@C%ORTyOB=$q;G@5 znHu)fVoCm+>B?bZs*d6&KNHict;vS*yhV!j58(=-mZJus=(Q0nK*qE6chy zQ!ENLV^$?>Tz&VXiO{)3`Tco4x@X|+{TpYzZJekVz-#ApuMo(vHDP;M`sj%9sVFck z)9GgOQsUiakCk&Q5zLNU?C2ycJ>xxx0e?k5VE*!0*6?#eZLgSk*dySX`Y++8PkS=a zA@r0*FEClFcaKN%C{RE)#ql4OKW>t?#LOtWjNaqM#G2A4#_l<;pLSjD!SX}{cus$j zMTyW>yT_%mwBahm6?GG<^K*$L^@Gc3Sg!5)L@!1ST%T+$+^}NY#Walc8@->{&20?L zojhp*n;KzC5@@2%D)ju*?OniMlX{0_?}U4L!tu6Z0LDA<)2D@o-DZ6Aoe$z?u_rop zydMmnJX>f+@9do^6dIJYd`gdJ^9eWg;~<6=NZGy^!<||Nj$>Cf&@+3Cn3#Ryh1=bn z`BNm&>>ZdkPy}Mib&ndDOCd4z-RtRIVc{@AjH&>p#h0&Ow8Be!M0XE-v8MGH?(WuMs}u(97<@#59XY&yOf**x z-@m?>T1XizI15*3Qaqj@fXdAb)0_!!+?P2*5IedhUqCx+vv9* zk-r(#^=WxNF*zAMIY7G|a2ZKFel{^oX1lJ(m}#>rtfT*sx_pD%X|IHfT_^j_ojald z6`3KwI9cIvX(*_FO9|h+$a0{k6;LAJg+C4IaPRiF^9wh&?UQk*uShd5a8k(Gp2Zxj zmj?~?)52!hG4XS!4=YL)=O`}eP>(cpkX08IXRo7J-T4B>Yt5B z*a(-?)_VqFwtWBYu~@~M=#Q!v@|1`I!$NnDjNS$2&I2IKA-HsC6u@)RO{!bWYf_6)fnhL7_Is&uBcc<(CxYn2#3(_E#=kB z7R@d8ac;b^yU5MW72W*h5(CxBl4logn%PtY&6;78FNN&2Yu+;hO#}#G+>V%%rD{o2 z9JG1v1b_`d*bmCqh4`lAI-oD2f72MXBnybPYs%rd{UB-e zFfTRqj;eN2F16dlWQ?-A-d1B57}b_IVr=f|r|yx-EU3^n21dMJ@dH%3G?^PGkT*Z7 zwD*Q+Ie)Qa+A2FeQP4Ih>L#8PqO2<53ZZ~VNlBGCjEinfl;Jx!dRzeVq4I zCQM+INO_;FGqbhK`=Tn;^u!01!?J;_d5}JsuO=i|#?jqfXmTG&pq=_|+3Uv^KT86? zO>r-Bd*q`2#d@u0&hcg)1aSqF;~X^2ys9BsN`~p>b3=^&Nf7C(;slX3eB~8 z>PTjrR+)ll3&#ny(=2t2Nz?D;X==->+5j@1;#_O|P^Xoi?sv~YGfBJXc4_}6i?hm< zV?*}>dyP0bHyuy&wiy7<`@x6z{nZL_prQu;awL`sdre+~XZQfrS@onr(Cj~nER!)( zajOiinS{LGX+}FIEqiV^DiN~w#c{}u___eKE2$1$E?lbTOY?d2>s^idaPsl<*y5~{ z3wK*zk5HUS2oy^_JiRM_14>~iW1YU+AOxW zByG_@W%XDIZqiSoVbuz151K;rex+|)rjNR6TEdfk$#p8UCOWP?Bagf1A-U=J{vFS~ zE;3@oZs!YA z&2Ln$M#p?w%uFq>Owj8Ag?Z z3Xx4|9{}I|wWmh4k~DNw8oGt)_mGSZZ>3{y3x8+GXU^Hr_iVv+zv@|vKhNu!pr3Ry zojp+t`IM;f)kwp_#|(TGL3ZRN4 zZ@1nG;^nhQ9KFdvwcYXFDS>d%CmwD8jnCd;CNC8-#6Y|{k9$wv+w7f17f^J(BTvceBGUjPE543JtNwue8q`fE zB3&yUt5E;pC#gTrqW!ni8SJHC{V@nCa0JVPER0(0y5vJ8mSnX}qS{x*6r~F*R*6(9 z3BnG4@hY7?Y+DrqhW3r0i3>e@c`M;*9UvE7CayTh^7ZBWBDoxt{pXil!fy=}@CwPO z)p4J~M4?|q<^;{hYOLir@w0^{TZ!?6FP(&I4V8JH_VgG@1;Lor+?=D-Zpg*jn+SMi zEl8vsONdbcbY*%pRV6NNY6=3K`qKS!JQ5RIjMz|uucE!i-rZ@M^xHRLbS&5hr23sp zYEX}Kb+4Fz{CS#eNAC4U^X1!g0>`oH^Y9=G-U6UA&lfI|07f8+wm_u_oWZp# zokLd`GbGzk+4*YT=Ss3@J>GL~e-3YYHQXVWALI&wVNB?sO)mAP?kPxNJTP`(Wd!>o zV+##@y3RoH|iaZLEv-Lz+E8$Ta=c`Gv8&q7BO;KMK9m zKuo206F*#M16uqUG662@7Cc(WvDkrBxS=zc)wzE^VCT|*=^Cri zQHzfJilbQoiGsWH!@y?4QNJGG&w*+Gpi{X;RMQLzRYEX7yTdjS8|!g}rf3$G5e#R( zz0=fcq*wHX+c*#ea)s5k;Mrjw?&?Q2dvG?%vcql6$$eVU`o{4TGo2_bnrh^iuwr*> zjckyoKZm)$L7Jf5s~3QiL9^^CT}hEoflD$|OBskx$zW7QQIwyM&T>oQdG>otAfh|C+4BK`pV9WM|8tUb`KBHR}z#=!;iOz%2T7d_h{kvCg z6bQc%Otkubb6QnBoR$Uy$#!b+eqtcUdL`x7)xfcmP)y5N&C=W6pI^nXJgmX%^8v$3 z=M`8rsik;%sPYU@1yRwzrMq>dw^SVMs-<_YtT$N$Ciy{#dz>nX!QtlI8=0tcgXcM4 z!xq9yNXI^p`s;xKp%4PWl8Fa9_`|{{Y@}^R6w3=atzHQ zHUGs-q(8nI^<-7wIlcF*VpJ%u+7BPm^$N&#ThW<1H(PPca-1K|E|s<-hblh- zKj9;$eju$ZfzT0Iw47sSeO`?sM*I;X)fzu05|^Z#NMA?$=m3bCHfWRiH+RJaFw43NUu{OZ z4dc+0Rm{_HvoHR?&yQ8ZLkKWFXJ%bG0Va6efZb*o10jVD&Q<>GUcwRiH`KZZSz#(T zX3BJUb-h^rJ%awCH2QWLdRW+Fz!0W8a`Y;=>iCz!SV7|bqu-3}1uweL8^itvChy%3 z;^FkW1t0z}M=z0__n(Z}5mT0*8nKH`;;R|gJ}lRsw1+Kz5s^>9helSTOnLOPWi(sy zv!CG$PnHX;@wlGkxl3@u)LX}VQ6Tks<5@18`ICW^Qb_ftS@sMtxR)d9_WR&cU96d}pa$@bFwT|YKvp%qBWE zm0MTNTvy;5#zS-XbhzqAxYVH7t- z65q|(!*@#V7atj(GAr1ym)j`P9+v&=!xdZ=w43@y(VwA21)NrE!6{QOyC{S|=SY#6 zmx0nGxMG({#N_1DzdN_YK3UbV{auW~HAA2)!opd{t^gt`Q-8Skq^TO>%BUZm1Iu_y zD0*~(9l<#a5xs3X47DhNazJCdCPsUTxKai28Ll6dxd+&Tlk(%o772;OiWA~NJ6f)+ z)ezJZ3a;wtS*~Zr6Ce@1SVY^9c(3T$LN~%!v|Wau=y}~lHut+3(oW35Qan3U-I}l3 zsjq!aVlj34r1#gNX-#yR(%G-w$ZSbKxvdDM*ElQm+(NFin^QpQyPr4(L>*t5+<-{5 z*Ka40nO)$1K}{4Fwc~ly{1{!1p1Bvaz>8}CGY)=i$gPznXfiWxi*J=)^B$J>YWuff zVJNgkCaZWDt?Jht=t=nIhr8P`QCYB4d5@!Ew{~{&G$@q1! zVqEQ+LlzdCo+2u?z|SJsWSSB?UCWYGf8KcaV+6(FtL?`R5<~eT{$N>G2<=Gl#JK@q zvaQJgoP}AL$RH1HCF-`gt*upFR3OZPZy7IL=XA0qAci^G%rD091}g=vRn@-Cwz6_g zmlaJ&O1k3qn#tgDH$A=oiOA!Ub#g!yN?LBNxUdhU$|&@t-Z9%j@Hv-BZD;$b6EPHW>9NvN;)KuUlQIRC2c6wk<5gTyL8V0 zDjBn!nd`r=_MS-_FoH24ei#UvWgsVJGxSN_f=H_>=d0({KxKu=Jv0ukpr)MtXRsDG8 z+sr@`multYVfjC`00H~>DxUZwy!6AR)nngHjOlFNY8)zX@dW0Ko8}$g)LIYV1F}yC z2TYN?D=@JeCodX>CoYz4P1z(9l-x04wwJ7J#M}@O9^&;J%0p@Y1CpZ~xU8;KBcOf5 ztNa&{`}}HsEKp%%b&GYoTi{t^`R88?r28MTFiZTPK5{;Xez^imjw?;d;$?;){-4>~ zJ)U>}x=jZ=i2hFYS7|X1^*>KsNPr}}Yua>eTzwn(ck4O<`)R?GM9L!yMFFoV08Rfu z_}8yj+?u_p9zPD7L$oL;!jt}UR?l602rg_d?K_G+_{ijxcU)B zjTo4P3ts!X5%BGE4jQb0Pr@c)m%fj(szeC7@YC`3)JyID&R&0Ei$J&~5Ah}^b}I`4 z7?=^r`!`a=&CDX{l?KJHz81G9>2OhF4LTxDBjUxhd~LCV%RRif8qb#1z7)Xl@neC!?sO>DJOp<@2={8lTf+ltpf&|c$v2soscuqe zoa5gM9twaCQhru*h^WWx)N`p6<*Qu5? ztiZq6%D{7YdZk$NY48dU;>|p?8OlDQ5`4fF#6P426=qIVY6R|*A`^%ocNWppT{!9! z+3qW1QvBwM%bJt?k}{_C#|4D)kz=^=7=n)?XCI$pbytKU=MbF`ri)Iy9}Kb+_Fa>i zt$ir+X(-Gh#zhLVvtxYyk@)sGNMO8fhGtINoHo_N)P8MA+T0bS2t2Q{M;#rEYpaR}yeEP- zLwD@Ohc9n?5di!1fuF}mtzIxdL0ThLd>Nxq7dU7Jb=lEHXPKQFl2!M&aq}%a{>=dSK6%5@d$?&r zEOkMrLDkkd)r<%kYIEJe_&j;?jBwct&f z$Wk4s3>4jTuipK6s>eGB*#qYGZrP$AO)FKcvs3>y)juGW;Q2d}-O&9neSq`9A0%Wi zS@z7`qe&v*?}1#GCD?J%3NFcl&w7yb?`j1rA(c)xvsZ1GmzOv0cASz7Z$h9}F^h}3q7_r{;1M>2#{&)>uOD}h&(PeM<7?SU-GF{n0QmJaj zId%CLnMAi-pl?m`|8P-yqosw&O2W0T(sBR0xtx>De!~ChRw6*}nhMa`oElJ9tc5D| zrY}x-;k+o^jh}NSEv_=r`!xFsm_dcSsj`|b|af1Z69FmoF)DSpsW{iE*T^=!eAX=Drazng&C zUBpTPc{&D#kpkyC#$Qc`nSd8q#!9zlKP1*gqSVYR3En;!4Y2+SRi*l841RI?!ktN# zt<^tHa&YU)FUthTuhn6L|83aQ7RUR52(|RW_iU7gykE*ccRzLi7p#78B>PV*vd}Ni zFhCr%h9h^v^y|$?0RhFsigA2CzG{3R@uQ#UEcF(4Un>59`yUv*#4`^mz?akwYRQE@ zBmZZ_m#AWq4n%+9T*O!;{SLt;wi3Kl{2Ni-nvOKGr73v+eYNyB5~Q%d@op`zl4t;> zR!9~Au@#tP{;OFkSph|xv`tLOXxYt?^0rNB%&+mk2J$eV0PiyC8bJ~w`PbrEG=a5N zz~2c?Vzd9!!0c)WwFgxp@&!IZ&umUiP*62}cP1E2SjxD%#t-cB{b#h#Jp3R}o;*Dl zA%?Y<-vyLA*Y4AQV)$(N#=P^tRPadp6~3+#NvPtPDefuO^0hYTI91gxl-H)4!OO#vY?LZ~x|un9{)k!{0YAl$?Gv!moo4R$ zhUG#BId_m*Vpxr*z$I;LzP@cr^+NAyoCK**fdIK}US zfq;FRLc<@2_b~W9{IZuJ(37OBGSF@7tU|V1Dt=M}6WtdsKg@!QiaLY$$)~k}-ecl@ zwA2)+A*Fe)!lqECoN;`m)4?l8yC58*CcK6eAQmx}E{oi3%U)hcNjJP*_gqWwc3t$* zG+-Wv{2(`i{rb~W;6{n(FW8m80hb;wW-q>Y?x!7WgjCYG#952UU7fEgz5328yYU#2 zaj3zHg7>_SWixJ)76#s}*v`p&5s1O|9&dgEFgN8nQoNphKAH0nooYtPF>FfLugLCX zrGoS2j_*(Fi~1TR_j}66OOaYv-%}za{siVln}?VU#Om?Bo6dFUy2zXc?(Uqd+-?)= zhk|^%Z}{<)Sd|Z%!O8k|(j^}5gK(G<&~%ev5toDV6IjhU>Di5g2PpI&4xgn#v6s@> z49~ON#o{&fF;9#2*+RLHxRnL7W)~8T>35MC+M;-lHy{A7bJtIVlu_8Zhc*E7_q9LJ z`ZdIxpI_8kcd$BC{gCYvSO0f>th?4qr*R4r(TF$`GfS&;pwelWNb`Ptj#Jug2pTGY znO)Y{>MQY@%nUr<=3LP&K8S5 z_Z|N2l;^Y!1nB^HrvMH_ag3+mz5|q`nYzozZ{KVtuf`0kJYYN^CaH+c1U20yM2UUy zEc^uHzb%HGytouWV(uz1bw4Kg;)W^u9Da9U7<7pKMS7-V>?)?lz=fDs2Xbsv9d2I( zfi#Bm79IyR6>!z;HHfhn`f2@v32>j&z+f4-B`(nMzYeur!x*2OAwT+1nL@W2F!q7i zGu-?itvz^rUGSvrcrz7{ESE2WMQw?yUKBMpzA))xRtiK9GrT<7xaEBspvmzQIsU`N z9f!`d`K)>u4|~?4Sx>?JZwP?j2}q)aiQM6ok`N4pM|6<*)_NJpTykZ^|3(ocI}~(h zLnz}Gg05!ZLQ`G`sEmElF+Yiu-@33-`XttjC$)+R0#WqkT2~oGU3`^;L@gAqf&O~5 z9ZpF~dU~)AKYh#dcXQaTWAeN)G4@%^q`|)Q_IL()wn02SyNtKoCowD&<)_a>#0~#Y zHmtvF``xx0a1BItB0u7L_72F&noJ4)MiA)Ic~vd(ZI^(iIn989|4$HhQi%p=7WrL* z{~yZ>qOmm~By^+9$w5>jo@M;&++QRCd7aXK$5`fpGV@7TSC z|JSFeYMW|gUU(o1f|XC4Ga4`>sq)%cU*5qqqW72BNb=e~5kfsoQ?H{nN3MOG0Reii zdXs+Ik_-NWFXr|qV9s0u1k7L37)$@cE`n>K79BPOo_J? z@2CW>Y)SKPOva71!XWskgE^|fvSB26paOy+cdf1zxJD%OD9r(o+1R|`xg#Nv(ucp@2R+%D325?K8_Zdou9GS#C`g@60YyO)L?TiD6u2w};wbu`r9i22 z3oBVSku`a><)ObOn*5}L{N2Go7VK=yXFa0q&%bH@M@0^Q3y9fsplJeQ-pI4z513X? zQ>#gX?PGGNw?xrV-bNpC>}T9roPQ7FbQk9ep#kP*Xq=o}+J;CON9+rsHikPNjgx`gBmt7|dIn zia)h1DiN6ZBf1~NNmmdFxjn8(|G2z2dK7cmf?R*J=S0GR+ZVBP=Cs<4UY4XIC9L7x zK~lx$r}*Sq2N`Aw3j!stoflnkX0urobShe|Cg?DySEq4i&%GKoGLPuhssS0HW#4srq^*LUl_z;nP~pva}u^HQr$q6!JP6_S)Tj1YT0N z!U|*#t7FGjL8-liOKi8g8QgaC@C z&^s~)Cb`b!9@muzl-!rJz?uWz#OM3rLvYXS=afKa9LIq@j#o1d08IUlo~kxSFHvQ{ z^@uJN1=V^$-qgI_5^j?Z1znH3U(zfeTgWATGysF5YkbxEtIT$!2au321alR`i26;8 zAKtBU5?N|EKTo@h8pDIqN++fg8@$#)qn3Eg{NClZKo1CV`ZMGTH^sm`9_*0%d5<9C zqNne{h-HQrb_x1t&D_jxs@FY5>quN@doSTW(6;==F&z5pI*`4z_FjY7?BrN8S=Q%s zefo6n4WQFXwNHU=&J=I3+Q~SioCBCE@;XKlZ2WSuqIts=z-u2Fz*}hkc6p~^mk5x@ zpxOX)UzAy+w?s3#I7e?sL|V!574?`-$i?nP@DpgU0fW85$P>4#zX11C;|vo z{MpV&Kvz~A1>0@&?%zkuGNpSe_v5ars9Q6DlwI+0{3dnYQ$9GQ7~0(*CD!%7&kCPvSk>F7jc36I_|) z9?;$9gahJr#>rTuSxHjCpgUQ;mIkEIx4gfXX1sx;o$ z&WDHF7QMcEd6FxCL(kxqu4A9MVqX!NgAAUqC59jX)WSJXq32NdE_l?302El`*0M1g z=YtP=xRLM@hx#{jAcOSqnBA^8!fkHG1q)mJCYCJkBRLy@c8cLtYSw!P8e1;}1=%Hj zh-CUglH1eoylx#M%f!r|M9Z$a5|}eVnej@a;SA|;ZBhhSI+v16-({v|sjM&^j2+5q zGjL=fSy(A)8Y2H0Ys!@g%mfE9lQ)-^QuFcgp=^Z=_cg2Gg859qnQC9LNyA`Oq4D~U zNQmLMiv{5PV-=ZC#&wy03;35i1d_HRd7Gw6lKmxW0Xkwv3?)!mBMu3tYM-{Bp* zwQ*k~V4s-uBk)dX1PkW>KPrGz{6&o9YUFU94x20q<(cZHOClt{D8CgW$8Yb6B*pi_DEO(F2_ z^hzxWb}|q5DMp~#10IQX*JnascuB(-WY39)gI;a%M4klVxdUhA9wMX}Z z{POFCa*MU9@x7K{VgQJ0Ml*gNKXf{*$&Qsmm%89;m?ug~dXN@tWQA3bj{`vkkC9^hXTuzX}Friks&`0=F1{=~saWi|txu}8bR zaNN}Wn!2jyLmU zHuN%}+Gl|U+gfj=!16;40L5PGKU0$XWxT1!EU516!@n9__`h=t|H(Dny(~T_35rk# z3$ZUb85)v*s?~F@{I%_d8doCZe=sWE>EsBy&9NVg<7QC*FGt|!S%TjlWw7q+_5a7E zMg_p7fagL&LP0)$ga7fw5hODBTuX$6gev_1$up#FQWa1r*FMVpw=YYqsmuqctE&Sr za9((r7#SH2M*g?Ue<1|v`t@u6-o1MQH*T~g3hJ|$B*m&48L=cJB)t3Zf$s3l_W*Q8 z$$!ElueX_$GW`7ENgqGH94j)KsBtm-vW-tn`SW+KHiYZi5AL)>gKL)dE$67SHh=6t z_o3%c3JDM&*a7#~uO%GDgrStH(xw*^oTgA`QJY-ruyM|vgMZQ~9a*33Yms?Zlpj5! z%#yT@(yX(4U;AeLac}Ca9@OV|jEiE1oY(`Mo|x&)zgeCfl-X@j%qlYHrz?CQ7Es>{ zYIwr+{9664E&bBTkXh-~!JCv4Gyi_VmkYv8NFN~oV;SRLj5o+AX15HAQFMmp?$axG zv5X5;dbhNq??5j@uMYIBlaCSdIO;S1R|EpATwil@>mn51CnkpMEq1bvQU6EsY@1a1 z1cK#K|DP?oc6jt zrr%WK<$-iKCkv(lGsM7L-r$1mG9Jpsw&8fM(DY1G-UWZP?Ozq#G{ z(YW`+ldN8+OeC0_Qv%=vypUHzo3_jabpMk7U$2e-w^kDjm6L*r_e;IzdVc+XQ(xV` zdC33d+x`#cz)x0?x)ce%_u+b7j8c=&fz8UmvH7pAF4sGkJ5DAm{q<>x0XUa#{`z|F z!>Lov3=yEEt*t*E$)yDDTaDeS7{G(cnpJuFm0DR@p#=56)t*X8O4gF>v#_vWz+F#V z_Z({IzD)Vu{;+>1%rFq>#i_YB+(Vbcu_Zf>f&0meFZ4+kA#A(}S5 z$t_SBSMhwy7c+&#rasFbVVOT|!IRO^(ZTz9U%wJ;U0&RGYC>4*JR=)$aWpRd9JijA zWw9~xof|$BHpMCUAoXS>xG@|lIO#U(t$RMr?{#t-By~EohBr>Ro6N2@>wsIwDUU+H zZob_i_gaXG^D5ZP%s7x`6b{fexmv&QY^&dQVA+2MjdA~+T!8?c7kQ~Kzo^av^I~u8hzbbkZjKx{_p}EQl9#TJxzkgfu>s~wVR`~4xdIdUjsjfIE6cM5q~;=J3wErijW)+3BoXR4`tBRG(a$uHRT04rw4C z9u#D^6>y-CWXT-*XFLmY-aBRZQ`E1PH>pD-FiRIfZk;~u-CD_C>cbX25%j3(G0e0M_Ah~xuPsM4+;!n6sW8%R=L{*O@LmUsce-qQLouK;?iL$(FWlW$I-qZvDQ9Kc zp1nA(wJ|olPYgohg`%iIKKR+^rS^(l<7>zKtHcHA;nl@gi3OXLXciSy)2myaa^OF} zTzyjX)+xU7dJyfKfZIkUqF48&i?pT)ferNj{yyGuiD@+jJYC>faP93=e1!C_<6Rtb z=9?%Il#RW;2aw(Da#ZdFL08$8;6?@7Gb+rU;35Z<8?uJf>OqiNB+VyKrr*5I$M=1+ zySqE)o*p?WoZRihkD~9MMrKC(u_3jd%1%1ZrJXRx0j}133p0{wl>cGsRd}5{BV8FsIPv>${ZKE zD(>&B2ypF|Y>KZ!abjF>Io`*MtR{Xc)(>xKe65x`JeRh`jcb2P-r*-{HN(Zr}8U`_~IIG!9U_z(zrhrwnOU!R12rOW}5NqE9W?eaa#a(GF;LY@rtDr ziUX6eAlK2p+VC0#DW*U#vsa{Gs-76w*hB>4mw{kaWLy&${`pq(M%FEI^zn9^Vj?hZ z=8_7(!{v;?w{ZagOkQu$FDBJKf{+EG^iQ9{8XM)sJ4UQsPAf{pYNZ!8{|wW3BWw3> zTQN3iuP_KE5_;JE*qKb z#hJE01HWhqBl_uzRv20dFEPi5 z3B4xLm#y9BW`A);E!uo)@nC1(j!L{vll}6*!&u;S?Nj`Fx5Mji-}H1+;~!x5d&IQv z-P6Mn!PeI7lKf-mlIYsIYL>qo7co@7)vSD2@n<9(*YUB2yU#{-tKIX(kc9e-H1d;+ z9TnhJ$p_f*;su1WjHif&J9O}~+t+T*$H~7^Ve?2iDw``0mrETxbydkTed{^ZGrFAV zNlGqzB-w{svX(k)qsuGoQC%RO|J7rYx{{Ti+zySuwc$>61+nx~co=hOgKBg#i$uM) zCTOH=Q@yY!4|J9WL|qIsQF1qSQZnsQaUbOx_U?^)>LoQ)6?WbLqsgw_*Q5y0zcTqW zgPx0KJljFDsMlU(ic104z8#0;IwVX2n;q9!U|&=|ie0AuUk?z60OEVW zq|9e+0v^V0ZW6_{3uGQXOH^N89CP?}dBnh!Yn_H2C-$9~>syDIOF`KXo}F!cz~L*o z+*Ju^eon}BT(vyqI`!?33cBiTlNDLBsU%^j3u6HUb%Ra!)F!81B$1?Z4=Km0@T_qm zKUxWk9)EZM&kD%U{vNK?*6;c09Xc>5Zo1-2*Q!7qY{Ih;Bgn)6^$Co$pS<)NAT7BeM>?APLw!a}Lb8=&iY znoPvH zah{X9Egos-vtw*h|BJUXSC)Wo!#i{OPxdLh7Tu zuEmAQ)6EHjKp-ba<#QdOk0OTM*eoIW*Pq&nKi}En$rD0>HE?LVq#&6=O2C_4dy0Sk zo|)86kVuLG-R6r(;}XsQ0d1gl-Gwqj^w~~}sW96Np|(ptl0(1RZyM=86(=~w7E8ZI zwWE6RO)d))-Y8{2ac+N`Ev!+Bi3-#Bi;oVF(Ik7}R)~IyZ)2+$+Zprh?u)es#4Uat z><`-r6fAflf~t^6L1u&CT!|@wON$wG_XAkXoEVAqb%ZgBDMXTPPUMvQZVD-i5knYg zg@-2uLEQ%8S@?i?R5+VN>tz3D)-BZDhY8G9CDa zWfp`W9*t}Z3JSj3gWHj3*X))Cy&;ekL4h8hVf`?!JMBPxadvftKfvi0OaRNohi8GT z6O&n?E?u57|0xelZsPD|Ef*8`N1+Q+gFCi2-(O;l_uCC38Sq2GYS8snbe@(e(V3{Q z>1zeIsxyCMhH*uwk%OyJJO3#s1U)Xps#gq^QU?r7Oob`H_IYisOwsdYWkk*m8HHh^0}y}E2gvk4{sYUzRz(;=@aIG8*eHC?`BRA}_i$`_I|4^b z)?|;GSyO!=m5aCreJ2lr9s+{&vEDiXUJD5cpnf^<8P4Kfd&})wKDu{|wGyPV0!4LK4o4sV{!Sc=uUsk6@$fujoYQz`#Vd6? z{>LrqolVYltQI#fZ}7?baOdJN2*8UK1B&E+u6ZGIH{^%tt!9 zq`(jlwe&1o$4q{45AvAX@eA}zgIT`w&v{BVjs;h;xNv!2#s~_aJnr{V+$D zr<3I@Veb)sABeCSsJ#bYoMhYOufw%aEIO-UtEnKssQZ&Ih{Jn3&@2C|uCIWKs_p(g zLw87biC|FD5<@7cqyh_3=*QGuY`bI>)Q~d6z`)Gh!~1>zweG#^ zUe=m5YtAs|oM)f?JbUlo{_Xv=kYBI^&|WMp{D?S9|Lhmar)_D?^XxhrYHwF)h^~vl z#bi%I7cyb>*iR9{PYmwTLd=@ zU(7qVN0>BOzCK*aGee|&$T=suzy3qd;_tZ<_`P5I=hX0PU|cxJ>?*r_B}5VqG)iMB zOh6uJZ2HvzDVrCb>#>}xMie^q0?@{|9qzC=aqih!Ins~Y__>}<1vh*nj4lKv>{wJ(cb)+P3-;{|W za{0de&*_D3+~{71c8sQNuIBob6cm?fYG{y5<0Nl!9rTp^^wYM$$~ljJynO8B8O9E| zHpuNRIcW`^&Q$nz_kq~SlQXkV2d9>!l<+x2dSJEq#CtiotDb|JMy0f@3zG*TUNV6} z8`THi^V`d;*WiljY4tdZzyN)prYB*D6WaICiC;f;Ce`21ABr((DYxGT^lmJNE#+u5 zIQN6X?7-Z;d-qJZZe29W9PD-fato^TB?ocxz<{3=ZgsnFvbybj<2nt1ZmoZ5R)-qx z-~_raZOa-<1JDPY0BGnY%9p1~VzJ%P4sS&WT!_vV(hEf`62S0B`^^fS3#^_Teg1w7 zzwue`UTb+>tR~LzJ+Muh4eG$6klvf43hLchLJN795fJN9&V6!5%Tv}4cY5zj4F{S@ z+RNG&LO)HP()JyS0FWbg_`BnPCLDigwjr_g1d0~DQ-+Q%_I5YEx(*AAs zAwP87zd9bn+V3cHKrou*9n!q&i zP#6azH(>k@`7g4x=(8LHyIki{wUfIN4wuhDNR898PIJm!r_~;9?+op^5{D}+fGyf`+q}lV6K!2n)h6xm0N=b`COkIpu0^q$p#gLPM z5kidRQo2r;asj+00fI6v%H30?X8k;%_YJt+J%pAc>l)5LP(#tj?p9l~`q%zO8z$*I z;%v8znpbvqCl8{SQ@8_75GdH+UZL|6G&D?Ra&o5Jma;pRV?&w@5@V7}=^WZ9Acnpj zy*p0I<&W+*Y~YdhW0=D9Z#;`2YR9bCL|kCWRYEYR(zd0BT@-=%8s`1QiR}Ec>0O|q zp+PS2OuW$x@p>Ck?J!O?3^1}N-0e`;v-mhXm!V&GvG$kPUB{rrIJZ<`dNB61P42Eb zXeGfO7%uyte@~bAlT2RVa!b>W=X@S=DF7|sIPO~T1U6HiRN^?cZgE(n@o#1#60)BN zE6ut! w~r1AK8x5>%f#@-Y*-?H-TSA1DAz=;fVMSdOf=Q2%O^p>~C&v6s~RQABF zH+QT(L3s=v&3>8RsrzCwrR3a!2LY7!7W9&nqk865+%4D;x7rJ~8R-qxbbEAQlV^c{ zW2c#QvG2O}4Pnt)TO~k+9zI`>k~8rD{2DAeWC|4E5u$Dx>>WFcfe>EMm(P-_Z+ei$ zARCNs^aV;oMp8%wum@YaOT14G*@@Psn{XNL+AgF=8bjJkVf9eF+eO!-r%#_gG*|EV z_8>~%$S87gUoYFF&V}{fTVYU+Qw2zV)_Y#N8yXrXA5G+~gu33^g00(y z`hYZU_?0?H*mSo$)~tbvyKYbh{mX$TgONWX$cQf}waQ^rihv3}Wcu6LhC^UY9cw5_ zJ^;r^-EgVpXN|ITuVR*6o=a^vCc6^Hb`ob)vuS}|$P$5NPQIlMAl`S#4WE0tQn_~% zI1jBuxN;y1{ISGyQZLdKV=EXU2+1z5w1&2>Ehqph!@*+q_S10BQFU3q4JDWne)8l= zwx~rd4659+duxEH-_O>U+|cT?=Xp_C>$}N0I<;C{BjshOMTk1)!tnX?tm^8Ct&^kh z9L>0ISy=#l{gDZ>L6&{LqQu}f1qFp0a{Eb_($ifSp}p^%*lp4grutPkC7h=q+<)ty zP!Zma`~Wlv$zI`g_a4Lg=H!xOP3CO=DTY4fvjqrNXkllBSGi0O&pkeb;W>b#d?=RO zraO8Sd`P+4D)0rlRZ$w?1(WS=<6J6xR*+)roJsU}ev!EM0&g;UhD2$%vY6T*w-gu- zHHDPlgwo9cjK5JnxlMfkF_D+wmttUGqqH^11*%~%q3L}7CuXEk7r*JjfzJJ5c zebT!5Y_Grm_s~d*iEK^Al6`fLGB`D-7LnIA_}I&((+w=-ZAlZp!PFXdZ`Ii2dY-la z?D8(JePU_3d#|1TGJEzgpY2IO)Cbi}G^fM4dtg_^gBvRei<6Jo;6U%-;II9<<=7uT zZhgJyMWK~+#{r`grdch!{Kv_>XCQ$4r|d=R{patTjtlGQ1J<2;AxIuyk=6_O`W4bI zEC3;jg9)BGj*7eA)*h`5m!+WOdNBOLtkF`x^>wHSd)uFm;OHj(F*{}G7~xpkyja@gD)=GX70(fI zu@5#Adaq3l3=YzUp)s1N7IYjOQD6c-r@ET4rlw|lzD{f?6B-BRJjg35Dz+z!4E6ih zW-^YZvIYw@A~imrh>Hj3t-J0&Yiv_uZl>qpKo~db0||n0p3c?3{9sj?&Mi9%$jgEy z+r@By1xH)T`h}5KhbM;2-?siq1mJqOT2r&-Ahq;Vu-qTpvn5e+C=I|FK5&IdV9jE6 z2qDA|(`4S1dm#**7aN(t1i%@H({`nQXV!V~fUR|5-30aMjZRDt%y>=Vy4A2yCh3Mn z&04NT$8@rg;~U^;a*-3e1QH#=am8(Lz3{axTXUP5vbGCSKBbu{5^Y0Gnbf0~0w!(I z*w0ZPkA8e3+H)o6Typ9%OL17)dc~<6$lBy{Nb~3>{B$N!E-v|+UI+*0CGk9WBNh14 zHZ$0j_x>(LGwC`UKm@+N_pY1CoNAcL7{E+p;dcQ;WPK`;;2@%Ln*yzlfzX5&NqetYpt-2VK5}60j)$X>=q6J;jrN;gkX<)F_K*``CwPY#m`kBzz zRs!qh^I!ST+-}q?J?T-VmJ144=U*hxFKdqy#CQMvhqnCeEya!d53IUM%q*)Qem8Fh zUzkuB24Swr@Ur_bA>TR_x=PL22wl&3QdTnRygq-broGQnGslT7y-D}&qnw%FcD54}0vyZOm!yWO^h zA=9aJ-?0;1`e#?wtql{?sYKDUb}>5;?{go0z#@%Fj*ri3TFMMc+YMidm3=QaRe;EB z_ul%h_&O0F`&ol}JNUCr#cH1e$5x?B+cpRIQs4l$-972;guR)qBQ0OO4j#ZL zS#)J6NY`Z!B}NM? zS@5Ywmsy;^f-lw;uCLDV+0++=G9@G=Sgwumo!O(g+hWnsHmu0wQjw02vP){9=D%KA zKMR~Hfn_3?Q0zN#j~{lAgs2~b(;6@(RJnc@a%7HA+D3;n=n+8goH6<${1^9g1$jUg z+9fq^^&mVe7o6Q*US8&CcPi`Ymu50WEP(D;{jxU>4mWGx%ul_#hfP^Ms%REQ%F|PW z?Ws3;aHofa+vE9h{f!OyQk6`G7orF-e!d3QLr}&_?aBIxVvsw8Eya<;Z2uc5A+Er1 zgdEpfPqEAB7}tYxIVPe(q{8Z7q=G1w{A{?#wSq%v;n%vtHZ3c^ODB%^qgfSqJ>~5s z-+tTq8ujk_g)sF$)1I3D@Q@v%T*1nkB{hiXQawGC;7e?vCCd>Kxnp!bg=)XGBBg7y z+8KVf1;tEp7qW{z70yV zC7vuPp6r?8-g-D4HJ!5c)oy6ZFGBtVtGv8*+D`Oc+wZ>7M^yIvOsh9+kU~_xGKeEK z8)S+R?)a3rK6?I~@hZ{C?8OwTlj-QuqHvZ%;4!wS z2JU+Ef+o?*b4_GG?{Vj9*ZXiLQYS}8PGi?Bh19gPa54af2hVZ2d1Uqezy{6#Fz>VY z&$+qMuT^kPK*+(-@vc_SuV2{(1rKw_7P$BDNFJ&-dab?$&4-!DmdBazW#N8)ey_Vn zCadG(uLz%^Edh-eh)fOI}jdN#HXb92V8Y;9E!Y~g-FDoATz zJMIRgpHNnlV(BgwyA+wbyE_2)S@P4A8a`o;CChX@&K;i-7pEB*NbYDwH^!rpJL7UN zoFcdX8QYXcjS@H%LloX83S~r@vD|VNt&RcoEiA5snx)8g^>}U#r*KC@sK;Q zMh-m+g)%4smn5s31*N6Ti*_odWB~6t9=c%MvnmS6Q#UIKOLw*@fG#R)i9vsAUgAjN zc>8=PBT1{m+S(eOqOVc1pR?Jrc>KlcChYRO`DW<*Rgm`D`LxLl)n>dq9O#%gi$W{= z4i_PR@dlkBz)WvM@FW|rEXx;JT0ozQr1u1_^d9%BE;v&;==!pF4{|BCo#Sw3#%LSm zpFc)TOOV_hTCYBE!Tgioxz_MmEheGG*q0kw8?!x!q>$DGY#(ZY>S`$ zQhC+ptlji9#1wc)dN6zNMVZGu3A24CNn>HO`s>@8HaMdhL|R(<4D`nle}gzD6V`=E z>gS<`uI>IP5TeiJ%xDgmb>V4{(lWN;@(CC@LyBt@e2v6fpkjXejLG zr1&M+a7)|T`kNW$M+d1?(U^IVB4Or|#RU!i+OQt0;GCqHGdkmyd8O(}NpmkU+?8`z zWbjf@l8Z!wW7D||8yl^y3(fg2WNIK9=lxYVh`oHqq+<+V-a4%Dw`kTQT(jwdyybrL z$Ll`6|C?CJ-};UagZRFPV=CmNP z3|xdOv}t!l8eJe0?cdxRzXft!B{=pr?NfV}UXnF4Sh^ZUwnR+6be6yN;lqdGmQY~- zW==MficL?Z_K0_Tn5NtD+JmdP0k4N_l%;J->ZEa>Uk>fgH-UX|fevb_H zc<;i~gluwp^H|lV#9AU}eq;m=Dpq#*q5a%cP?MTVjwtcdfkQn0>r(MR zbiz0*nHt4e!_3nvkX6vcZ3NCJY1Co}xLQ_)goN0;xM)~f^1cfV9i5rkc4J>@58-pr_V0%+7%j=E3a#X3;qO(`u6#l&)(caRFEYkmvE^Ty zSocU1Oo=@3_4LVs{s8b#1g+s9q~80?b#FQVPYZ}wTIe;`qZF>w60n;LoM7F;zXF|} zMyVCCC5@(05UhaJIiaan12b?G=QG`Z8gwHFY^$1(@ceRb$-VO&&&aLre*EOQS!v>n zFDKF*xpcv6WoM3jOnqZ$zjNlId`{ocaFL){?Pj(tveb+uG24385xzg02& zE(2$IyKl&B|6w5-Rzmw%Ri6;85_Y;LlKQ@`Jt!XlxL-fIull@99goANdk_FCakr;t zsCrV^g&XuupyJ{WtEHcs20r(Gqk_d0bxbxoeIwa+T$JV;v~Y5ER&#UHD+>6MVF8NN zYeRF!3^hmO5J3A_D&4|2zeZy*56NO zoL+3N)OQKU6(B(%o_Y~dZSy!ta^@2`B2G$ZD%`TJ6_~-K%kzg+l^SYxI5^V6rt@a* z9rj{=QS8j0q@%lsEpCD%?t{>A{1O!$qKc5*$CJW$@n<-6P5HP2I%>9^@*g_Q9TD^2()TYh{x;Y@ zKQrzrj1fOGIBn6~nYV%enWzij@ySqz{ej}=sYgZOHv1n&%tra{-DAI(e!u7TJw1Z96XZ}{8f*|Sh^_5El6$3ztiIt5uXQa=_TY<__T zk*r0(BKSUOSmonh3)xpMQJ%*;-5RBo_lNY8=P(@j#=as%8OiAc8}K8o5nqW$?9{Uq z*S0DxH_X3Wo`=Hp_#`Di5BBwWG=AdS1(5smEceoN|K>J(lav|WUaq6IT?l=sqy zc5w^JzsLCUjysF+QSo#xcRF|5L?xSUc*&~x6mZc91RYXo8qnx=?`-!xD62SO{n^&Y zfJHv2Ov=9ZJ#)|r%l^Z5(x3?k8ZnixF3Hn7RVS?C4aNKz$A3~%dP`qck$`#jS9NdZ zHxn3mcY%QvNm9?v0aXJ7W}vjDU!1BHOz!Ye1D;Y$Ury|aDqBnFhsu2K(zkmtGI?#9 zupSdL>k@l2Dj3L_h&c3*qCs!opu{t4LZZTjZoFPHuX%o!tW<;WqgHFp?d5FsaPdkg z{g~B2+{n%?GX|lcNz`Qf(!G;nZa4PCxSuxLOCER1KB`NweuqDJRC*Wlblm~PGENF- zl#~6c^#h|2RfG|2aBHAC(0%>-M$x3>DgqJpvg)E5iaJj8%TrH_(B99sy^MD!{7 zuX2aB`wt$3kBsR=7ZUoTe(i<$U(O6r|1>#+nJ>=L7#pHPd`$osF_)jhN!p{k{ z=ovdjlG7w|pymsh^zp>ao25-5iBNfJK+f{va}k20-2qGO^T}m!(wVUE*|^74e}k7_ zODb_=1@>@gAwbTx{!&bj7dM$s*5nIEGEK?8`4AzE6aLW3F89Q4ZV7QVGhW`Na8a4fWof1D^cQVp%n#g>9NWl<<6plpFl+*xb-W~WWH0Si zGTmIb2<%L_zKg}+_TepF+#}Fy>U#T~Funb2e-(*%PgdE~{I?6uRN8QrJ2^N-%w*;v zCPL}YxM36SyI4!BP<&=)+|GD@m%UV{rMM*)gVJ5>xkcc%F=;6Ndm33yYo5v$OFx?4 zwZ~&Z5*CZS+5LcaZy-s5Fdt%igzhLYsXKD(DM`~%4Ef%Jqb~m?SL0FLMZ7^>-~emP zeU@!Nq%!dGu1HZ)cU$pZK+i?e`0DebP^91(+KscY>W|`nX+deLHs<@`DJDZrRW;Z_T}CLmQu0HbXrUP*FuDTbCGJ?J03V5!(R7aJIg-Y2exxpQ(=VauD=!R|Jr z3%44cL}yuv=nVXy>49E-g2%;*4wm6dFCanCvCb)D^kb4_3<7LcoVr7g4i z@kjFSO&~p+uVPAmjca^|<_WmnoKKwoWpjzA%MSdodT5Tjq)=w$%l zj{z$#Kd|qnc@df|W-M^$k%d{%l}P}^aqAz>%=$#X@8c->&8dE#Lz(zjQP1jqE7*JV z0;3eVV>Q&&sCGWLYVHIOaIoN>_y(O@=RQN1H!zmx9#<};=uwTkwLFiEA+#5}0QTM8 zJ0B9(yoO}`!x3q}OJtN}*f;zQ=39Tni=?I1v|VRfP0f|P^L|^D8Pmi5XU{s0S*|2h73HCzd6RBRw^@jqo~&SLayW z#jaZfD+M7*llsT2iT_T?JHo>1 ztaPCERMhlPdH7HNLgZi;@F|Kbl#F&DjtIDaiYPND0#r7zU?#ovt0H;3cgp!ad99fe zle5jVGWV@?AM&2t%(Pt`904nrnWsQhF0In%)<%q@rC$0U=l@=gy#5-Fw2_sNPJHu8 zvWs)?;OBt7KEoF;!XbntZ&U0Lx%US&ZyxA!h1>a@7cfI+YTs}GDn*mln*%9}OF2J& z^xfRg8~dy>ARZR(VM2482J`Gw)3`K<@59n%?u6lX^6dZ1s6nIWL%|Us*Q*h zQAV)k%z1uSM#gHg5Ben+fk6Cn(Zq1)UCkrEaSa6V!#l$YCokjwBT4%j<7Q;H)9W36 z!+ePGw^4h#YuDaIM37v?s^fOU8D7m1W^^DOFS%8?XZtqJK*Uoeg$yYB{OME3Xih^7 znX#x=QE$$q^28f%`Ds0&ATQLU%Kp92|DJs4|A`B9jM~COTsVOxUog$9RyM7W=wfg0 z)|w|Xvh$XVjI2FH(k`r8Fem5xxKks|c4?$0pxw`BLey?QAMl6e7u~!<8q$>(TNpQ3 z+fdXi)RaC?T&yrrDhW=sRE(pdXRN-yemgj-DXIN|pvJd=@12_$8!>qTp!aesp^kM15)$AHaP5N$r?Rc5v`cco2WpVK6WTD;x>r*j` z8U7UW-r35Ysjbe4?R$hQuQlzv9lx7Y)H_X?t!(ltG?dyO*dt7Vh8>kgDyXW*DVF1@k3}sh|m3G?(}e^5B{U$Nzd4L za3onLL;Yfgya(_vONesEgPr$k!w9-Mp^bmrjD@j)_`%f?U%vnE0qbdVu%!ubk&LR5 zCq2uqk**wufbpeJ&{*=*OiqB7m!E%M9DQr+pP<8sJY)b#SL+9l#9ov0N3IsyT(&JN z$fWR~*%97z7#RpcKFUPqj`{fUWep5y%iO-LRl^iNF=a?GL|(oR3}oV`RB))Nl3%Yb zZLLo{)6LI91?C|@X7ahEYR07qaCJ?gpqnT&cEb4odahM=Cay6BV1!eoUb#J6VzOnv zhG!IwX9KeeO(l4i%g|chvIu#v2GSed|0wT(6FDHSb(}`!|L`4ex`a(m`N(b#!<=~W z`37v>2MfIfb#)Bou$LAFH(md|=|>j2LHUh9l9N96d}n9GGI8*rvC z8BwBo`^U(;NemBTS=AhdoSfV_C`ifJ*f?wYc3Y6_WajSS;IPHRhh!I6^l}bZPZ6hd z`lT`y0Jn3H2*SK&jnQDGA}O|LTbea#Xld=R{PJ4?5+u;2|IDen?*#25Lji7RTleDW zx-0Fb4Uq7BGa8RVOpg{BioJ}%WAYEI*&A@J5k1s@r)sI&61(zmxvmjyB{ao>K*FgG{XF8(!Pr=q2W3r)2Xv$s=Nd`%bB(J-O)YQp%F{QKYW4dY~OQX4jk zW{iT5viGbOtA^JS(aVQ-;$VW^!g($+wnQop6On*0)9G+VMqlNfDD~vjk)c& zNK;_H0WGUilgnDW`0UqICQ+FL{>+A0e#reb-@_XZP?M!?sThT6hZ&^ZB?S1)5YqdB zDz^JnW0Nzc>j{uN1^Mmg{r;$N&ob+Forf;;21S7+!Kzhz?&Du5o#Q;Rb}-XBYu@5d z?$B^?i8U_GHZ&p%R*;}FX>E+Gt(7UiLkR=-HLb1foUS`@YF;_$C~#>GCsB|2`amrQ zZwsi6d~fNFFXIko=>5ds=HNahwERyJ<4>?0LA@Ip#epzJ!FV2leOSq)gMYzfAan=`xFC#FR{-wCMw1r`zu??yq@t>43savL)7p>z%9v zE)y2v*+c$Wd7NYy-f}|^Fo``TVIJ+5;#v-;C4J^o&MCQ#<0V=&@@H0jg!5-jf6_#s^FQT0iXZtKw zoSDf3sx}?#wHsmBb4UnP*Gl6k01EE;G;8@mfA9IaGPXM1IO7k%l}WKKy7ms9JH7e7@;?WGKgxNgbQ z`ZwH2B8EGDZar*6h~3Q7L!l2aMJ0#(nXt_hQ*2S0cSirk%rQn`A6S6lv9CRkYm7xe z8Z@IPFfp>lLbyxQzzo@4U@BL@&X1p6k!Z(OkuGrKlB9G6A5ne*fhQ&=QFTlHTJ-CO zq8RXNqSfB|YOZpFBBoApM^=j()D`aA`OLldKTvR|q`SYue=7DAS^mdL@{#`AFszyG z|9imQPwc9EwNqY-J!b9!Z!_!1|J#~!FA`_XPBsW6;N1UszXQQ!UNXHN8v(#!OZrZH z^u{aTVZ>|0)XCHMt9w+9T>nI)GUrEqp=wY3&u6V8@Xcd0k!pAnd+pg0|5|7VQyycJ93!4fQoGv#K-C4eeVHJx zB1(B(C|URg(YvF2Nup+s$)4%y=_38EA$16bun9RuvLm6EAPKJtk)jh5=2Khs&FhV zE4mWykldA&oGmWCGs*1%+V=)zvZz^KDtn7`KA4(P9!K9XqnLUru)U8V;*+J(1eiD6 zb=%)Hvu}1K=ggdco7tepL;kRz*i1h86vU?p~Fg1yer~rzW)}!f>-a+s53Eq=J4lKIaVDc0; zw075=z9dizxNXg^XO|SHOjbLL7(8DYs_PN>(@D0+@om5#NJ&X4HYf@&D-(M?m>LdN zL*2f277x0HF4$oDg<*A2QY$gpBI~4X5$=P94r;;U0rASJ^*rEMv@gyqEO8Mm$|VqX zQLB*ZKfC`(evqcR7IJ3zIh?1Z3U>3^z|EJff$~jY3lOji#T8|n5C8)ac2MO-goWc< zI6=?x@s4Ywt1L6uigESq?CbzoAJF(#szfotl=m!7fyP}^^=5Z^ELNE^GY0LoGGL9 zUIm9nrHUMoC5U5>$Pv4p%mBtSyv?O0C5h^w^St~9X#uSxOH52WdtoI2SPoAF`yxL( z7ENnL7_52S>Fk$Cdo?N+XbDyc?tXe3c$cqd7d0Z8QkSc&`a9$q4SW;bWQ5NgT)!qD z6x#6$c>sH!B&@O*@u`@{Kd0rZ)&+z$TJ;XlK~L96zz<}SBEXGWSH2QofBZ64x9`Fc z@|kCqaLbkNA@|KE%7M42&nz?Jmky>QjEGStHGlFZdkRfR0b*!~A%$nf(Dg<1x+(9i zM-tet)u!Klf-mcv>_k6ieZ@^Ia0b46%eSb2cHu32Sb1S*XD1nz5PqvWG`h- z@3#PEu6?lMPt3|U!Z>+prlBO@?QwSYgQ5MYobo$-%^ z&C!yob9?Bf6U~({v(!HU@R`4#ikDY-tM4zUXkAK+b`ir4j($JT5M3XBHqia$d*2@> zhSg97ojk>)3_C)+muu+}=F8u|M$)a%p!n~9F+N+R*UU3jTCbxgoR+ZTlx=^PjwIbgbfN0;mhd4_0~c{#V9y96 zmoc;iHk@GVIk+J1<~lQy#(Kpaw%=~bFwlYGpwO&KJAvopuFV&uL_AORV3)Kp!tC^W zb4o)R(W@30dL!2Q+Zz>M{)z*Zqu)LVF^d?7>7>=id)wLyzP&dz+vc`P09YQabO2W+ zY?6fXHr-TVt!Mn7`!YvnDztqZZy^f{sh&3Yoa=u5Eoxj%cKfe40OU=-`E_E~P}827 zE=TD6rPi*!0;yyCc?b9wQ>Ih+HT|6LR*Z%e8FAy*=h5A|XA^nwVU6*5}orcO&Y59%dP7t5|C!&Tw zA5#Zx4zPQV=jog+M#w%fHH|*M(QO#LHGIP+c+r57g#|=f{qvMng(J1-;VV9_-}aP$ zGefpN9@g>LTzegDGf!IA^_Cg_k79a@)+AYbJt0pKJH*#^di;k5&1O;Az2fj<=0FrQB?h7bGT*mf~21lnU)mN{+528&? z0$B^$x|+NuP=$p9DdmKBXl8~aF}*?+ug2u6JP~d8B3$t(u?I-RZuGaUuC6ZADIqdJ z_aBrh`01V$lS7e?5_D3QAe2<(T;5&@C!b(Ws-m;zL@_Xiram@&j!(WJ2>_NFTC@*P zL6mEQV~=p?n?KqPmi%7tq*@GAeR{?{hE73nIX*SOfA-sXz2kI3^T_*9BD3}V=RyX- zCJWtK$hc)hY4?08ILl&EBsO$H9DvV~sH* z(<52xeg>pYKIBI>{=)-f2Q1UA={Df@t8pGrr1%yQ=gz(5NG6pT-xb8owdwK4v6dEp ziL!r zPz^Sae@OlWknjeC3ETB>Sbqw)X}el3pp{lp-AJg+>4x(%Z*^yG`#6$Z?WTR%<9EEp zblpItK1t~x*L(P!c?p1qAKBrfYN=005ZY)SY^)m;;C3YqkRtVt_kINv#7NNJfYUHK zvxNC9S-!zODpLI7;;xXPR2e5GR;4@B&8~nF^r|Ge)BUaYGW5DL03ggu6!eLyK%!lI ze7q&Pr4_-7Ers=2`uK!{`)_|Rnyqjy&GY2rjU)O0y*a}dq)j|%5|#%0Q`IOK=*#Bn&rFy1#HH@vj6}9 diff --git a/sound/chemistry/SoundSources.txt b/sound/chemistry/SoundSources.txt new file mode 100644 index 00000000000..9148efb61e3 --- /dev/null +++ b/sound/chemistry/SoundSources.txt @@ -0,0 +1,16 @@ +heatmelt.ogg - from https://freesound.org/people/toiletrolltube/sounds/181483/ + from https://freesound.org/people/MrVasLuk/sounds/304619/ + from https://freesound.org/people/Benboncan/sounds/74899/ + from bubbles2.ogg +heatacid.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/ + from bubbles2.ogg + from fuse.ogg +bufferadd.ogg- https://freesound.org/people/toiletrolltube/sounds/181483/ +heatdamn.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/ +catalyst.ogg - from: https://freesound.org/people/Melthurian/sounds/319384/ + from: https://freesound.org/people/The_Chemical_Workshop/sounds/408137/ +bluespace.ogg - from: https://freesound.org/people/Agonda/sounds/210582/ +shockwave_explosion.ogg from: https://freesound.org/people/Timbre/sounds/115659/ + from: https://freesound.org/people/AVA_MUSIC_GROUP/sounds/397147/ + +Work is licensed under the Creative Commons and Attribution License. \ No newline at end of file diff --git a/sound/chemistry/acidmelt.ogg b/sound/chemistry/acidmelt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bef257be557ef92ba9a9219ecc24dcb2aa7bf804 GIT binary patch literal 107224 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%0DiJhNJJn9m1#VvM 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 PnY zk|1D4w{Ew0q5GVB-uJ$7?;GQe_wUxIuC7%ztLCa1YR(GF$iu@7fCB%7Gwt6Qj zFbeWO_jtbGZ@Z>gDeNA^D9&SWVpm0>D5ZNqxi!ZZ5+d0O$a~kx!T= z%UwsfD!WW5A}?F}A~%9e%F9j~fxDzij{Yk_pj?>&fEd6Dk*8N2=y=a6c)$hIgGv>= z4CNmp$dXNV6vziZ3%K}Kw^jT2&kFOysI5sr3IS+s?l>mXi^MsRJ01=u37kRW+z*R_ zC`4*Xqba1u5i$BwN0nKIibpjS>59ifZF6dr;%y7M`jX2QE{%Pp_IHA36%LF3NyvYV z0|CB^8Y!DAof_<-`$XaDydbcv-@`%xIB=MNRwk29Gt*Qv=gd5x(FZXTMwxkOO*5>4 zIT%9iEyLVa!$McXBCYe{Y`Y?@yW(uu;_Sb~Il<%qiC-gMe7T6fhK_&$rMwEcyTau> z?B%Z%%86p*>!E<_1xXO(cphPVg-*4*ccWKfhi6@f-&Bj(R14KF5Rm`G7jFZUdKFav zzoNT!uG{}UqCLk&05nL;u|UqTKt4@VzOf)NvR@P)2SA>pO~ponP+GyLv0!B|YK3S_ zWb4m-(x?3w6E4^e0BA|hkwDG~kQ%1qi$OA$!78i42CE<`E-3Q94pG141sn)>v3ssJ z4kn%9^ouMwuv>T;Or7dCCJ-R8Y!6W|SMYI0fu>-;w3exGaUcm>DA-+_SNMyAzO!t* zATNa{^G8ba=L&*nb*Kuee&-?>3dtI37r-*M!y=kdHYX6yYoUOwcHIhWYdu$RP}9u> z=901t1>3u^zx(?~ENUH!W(O2rf-RCZ3VpiC?ZMoiu0>}vZp=wBm806;9=FDd?4@=KI|OK~MW zS!7bEby{jl>>{ZjnpJ$$G(@LPB?(Hgm<%YzY3&Ck!Ho*qK2_~2HlkJ8rn#XtrRj~f8IRL0MvA=XO+c{NotSH7%jr=!*|D`#BOkyCdE=C|6s zSPlIT&ACt!9)Z9MV+)SObG^jGrfygGP3YrH^2u18WqZGOp7Z8^n%(Hzg@hk3~l z6O#`U(}j|9y^;zD-Q~WMjc{1glcriMs+-B2s#O--=I&n-(uWY<81!Ggv8eFwi#XCk# zx%X?xz-bQ#l(7LcV-QXQB2GObQ1dQ=&LUvI1esyHFf(B2pGTn?RnUx@zaRh4QV(h;kzQ_b-P7 z033u2zyXYt=zqUcg*F2K$m3nDLH|M^Z<1EO$tG!x_k7<%z`94LMkG9i>JKR`zU>;y1PEuc*Hz>y1jj9uT0fYt?i0c38! zn&XD^0^9X8iVeFa@v2-?67C$l zZY`qH)Kr)Rz+I9De^#)#_qYw$;L~9 zezKwNL>^csSmg@B6=j(!f@L(I!w~|4RA!s1y)Fs{{f}Z01OlLcQ#;w$5Xpf3MQ&!G zf9HZ-C4wNib@0^@C4!*e>W#1bT~eU@>>uh!l>9^EAbXG-7lh)Uy5LbQfj|L1ErNuK zyYP1jgg1j77xZ5Zb=tfj{+phDknW*wY+V=TTZ|F_i~;~aq{%5XHmkh3A2f8(3ws$W z2@?i=E>iAFIyG(KxQzd&_(O1D8ywv~D-_vOr+;#R6#uzu`Jd~T|37nUHa-pQ765!U zjtFfXn*_MAr78&V=j7TXH>f2_!m28lYi|!7^|tK4QAvU|I7B z+$T*_sL=MJ)~7*6ct2RLdD+ILzFnXq6@O7y-@d|=Z7Ma&WCrF6Vv(a?;4bx&hc;OZ zgI~GK#6e&mP!@Py(`rX;K*1q*OHC7B&JLa>0njS)0Gc1JD#&Ke;#5J-%7y#Im~L`&hLxI5=fT0{{`d6eElY z9Ti0d$fLD0pa2CW)uka#G+KhYqQ5jiUtX|S7Tf_yoTf`k96?Byu?vY*6X8Zk;_m?C zb8FhYT{sCMySWj2GBubQU9=S^8bU5F|1w_i`MX$-qEa*LF&e}J0Gz-MIDM@HJUr$3 zyRYAU1<2{yxP>JZROx?J%K~2kK-(0TnCN*Ruc&+#t)_v|*3~yO2B$a3FH499ATZeP z1?R;x4EB3Vq#v{%7vW+{Ah!V*Rr-&wRQaY$IpnL=|8i7-us#V6aO>oXU@;m zPePJR+Rk0OtOoU5{2H$gb3LUK7jHgaq^O5$_FIHTN_MY`z$yj49R7Ua(mVMk^1+## zb>&}0k|XAyuX-H6dHS6yj*4po`iV28G!_tzUNsYQrNE=OR)jwF$*`$NHHf4(Hn^0m zu6!?3V7l+y9`x6pv^Sw9632H&IZG;5s%}bBF3&q0U;XwSVM#hL=Mv@6h}x%q==s;X zZUn_+o>_p2UXPxGu3XJGCDCmzL#@TyCg<)WqgnGPzY|Qljrk&3ZO*O8E5`@sO)Q^N zkBe4AS>wd+-C+GG$VWu0Q1!7O^m*vU;TY%BtFhfrPiu0%>B^%C)u?a>2p{!L$PUGv zepVAF1$Kg^F61yrh)>qV7*!#NO^w`m-Qr}QBh4A_jbKk~^TQQ$ zy+S`)iM_b`RN>^&O4fs`MW@$ZCVtv%kMQVBy!Pdgr{z17A<3&bwQnSxOT?)FaOcv; zg4iM`?n|SbXsFaAxTfx@%24_-^ISoisQPVDT1}^{XR?ftdDcd&m!xgzRAT1QcbbIn z9Mp`|Rs~e8SH{vXCO=L3W-_+*mn?Z$E$0&(%5NqyFx6LM1$OB!g$uiI*__x*T*{y_ zSDnw1ua_FZD!H(8coSDOxy_uC)gsCtnqHD@R5|t+aF6Wy-cPQ%mjTslfB%OL zPC#+NXJJWD!Egj#!F|7XipipM237_vPAxJNl|1~es&TI|B084!m5}KLXcSx+;G8cP z#HkT&b2$i74@AXK=@)4VC74J!z@`6fUN4A0t*ZXUg>U6=7L& zj=>KQHVbuI`W%ABp;PT22bz?qYehV+bPuxfqTr9`KCgu8`1RxxV@|b{u@5E0%DsA1 zJ(w#|I90JIr#3>q{!=0$&me?KQEQxADqq?ez;1L>+cRO*IKdPej4+)M)HGAKIH&&d zR#EzBP-oZsSZtfN$@qrH^(_DBvD-Hp2^0uy}{MuO`9a&^XhRW@OxDbp|@fs6iC6mro2w@K;cE?>V(ZYd~8=Vy` zJr!vc>+9(rZhTK=>vs}Qd;h9q>Serp(QNjOsqDX|Vu}418A@TUoY5iCs{)Mg3z92I z0lEzQYDS~yFvK{<7EjD&$w|x!uH0<{VL~`4LqD^)%UZ(ny^bL<9yO8WCS&RcbgT^e z((a)Rl8d=vRu;Ln#c3-TH;*#vPQz-a`!?>IvhjhUN-HAvGX5)x9hJ_<8_y-5F)1Gt zlpkF;6<#W~X^F|)oouIM9nq{vXx$vJ(+Kn}lz1~a5c(ncWv#7vHgH;%PZ zFoIlqeZ>{kAf$!Z7fUTXhNQQ0f+s2&#>d{+vBgX*S$r^U<&g`#@#t zWpZU9o4q-kC{3M))D=ehC+QNTt84ahbK2L?=bf0ESM2hBG%XDCV*smo zWwBEqUhAyEmwI=wnwd93OuA6(tVxD1EZ$(hhxh!hy_zCq)10~_+FPx&g&Uc?jq;!q z#*9yY?6RW&h(NgBA4HlVsg2Arxl#M6)N?+2+vjDm_ zTw>;M#+DBwDuOl{mK7(Xz0L}l7~d{%oHL(c)kyTZi?XC}6Kiy#tf%3A`?qivM+N?w z>-L}B7rV=@C9xm`_s}iK>*O$ z;kI@Ne{$)GJGFS#v27a6qu+ZYACh8UY_yw_j_t775Vy$h=rZeR5B0S$_3*{}pBlLQ z;pwc)c4=Lfrc0Yo)3T}FNInTZxX+ww^Yw_B5KX+{o>*AK?2g`!e*%|-xKZ79` zwLj+u2U+UvYen5>l{-ilE8uXn4jPx#F4pTV5Dp)=_a`+hQD*4ge2%v)Geb8Q%SXMRMi|J@EYLSnL$1bqUg5d*S$hu=a8J(>> zgoTLYUX6u&vxn1OSVWTT z<jphm-e?#LlCZ`|!^cdsEihQWzXw-;ErJOzcBQL^(5{Nv!x-?I_BIa^ zFP$CPS*XAt;x92WS1}sjdMmNw@W;`LORin48xoVlwMW0~w?f#QX3>pzD0>T`xQVS6 zbgnD1G&T1OQ~g3he#-sOJBZW#^IV>i!nZ~D#Dq`$!TN4NavFa+-*K$rsp};?Q1ZK} zcf)Ok2N&jQIH0#3lS8jhFyAdA9%gf}JkWb|5+B7jS2(t0(EL$Ob5WXXPRU++^Y%A} zr~x=11s9z@@mH083LGRx%wH7}NYtTQjubZ{-sfE(6u?7%P-s-Z900k}Lc&j;vb%o` z#b^|>IPI|PiAF%MQu{8x`EggFu^O!JQv}^>t+qvr$8VgnOurSd)nFtoC~84I5hvPt z6@4d$9^Fsg;z?Ul(^g3_0RVgwelsyLbU*;x>&?fWOL9Er)PAuep7v%#^P&A}nvbnc zmjf)=w!Y|`PeLr}#Trgrx2zxi$P*d6ar=*U-8vg<36@C9=hq)D1#(`#rSl=(|8Tox z0oJ0wBK|EbZOzEG#nyf&YPm@}k^M=Vbm6V-mSeZr+u^wMZG!y7$YQb2EMlZ}25Dc3 zZ|7wvOJ8-WuXKF@C5 z`SH-q>M2c40u||Hr&WW~*vs#{jNO;noOc``jP8B%brUz0b8@#EES@iV-Ttx^4|%7RLIBN;H(fW(2u!)+v6(Uey?=d*A>6=$ zl8R{5sznST<^GvEKBSg!4VuJ2mkHRU(k*=mqcN@_PY#51up5Wg4QzjI(5-v@7;?93 znjPGO+X-OPWd`Vwq~Dj-BomKM z2i93hPquwT`c89Qo)~O#VBf9K@_id`UdNK4wLXe;56-RMrE}HfGO*VDR8#P3oNEY= z)g!W@-XUmeTv64EbE5Sci`_TkNo%gA`NP$rSu7WvRR~Qq_`H zLNusarL^%0_AM}A)~#W^U|eOVsH>MuNF_9HZ^0!6!}N-C#TxY)A3U~W-p|%!|19)E zzo3BN5d3uf^PDsa$Ue)TEGvjpPK&w`d+klp$L8-Zx8vogB_joNMt6!oUVaFt8^H%< zX|{j7#7Qgk`GfbjaIF{V-}8;Gwbl_FogLM)n(e~?|33QpY;t-OX>qK2Xm)Ye8h ze!zYG`*YL8k^RA!g~cJ6fW4ERV*7PC!%r>Kd%9GAk8u)HfV;Hi(o^98nppU4 z_#R#JO9UfvBd+ub&x;Ngzq&F%b@jKexBoV~F*y9qeX)o^($`K}--q7^qi$bNW%2p* zUu(r!>UEbp*d^7`FOH8GdV-5@XPjDiw%AJ380&iEdviQ@~GH6I237NUxv+QMn7jqCMqPy1fcf;UJk*#R6#Vk=wB>q%UPdbfuQFv-e zV$;kvlCr}`q)}ZmfA3RjXW0w2<8&6(an;K+c3EQ-aw+>Zeb7*TpT~C{(qu2{ zEVfe?3$Z*Aaov0@%uOeI6w29{XH0HpTld%T ziLP{0oe7+7w4)tS#r4Uxn4-OjyS)$k z>D2iUBFb+TfM1 zU$H&1Y_WS?&4nKlP5XQjb{r=8HLS%w9V_K^?qP%oQG2omn|4PshB}`l2Xb>AFSo=; z@5fEV7N1cEXyn(inf+}Mv^POq+_oeW9MSU-HKf$nxp!@m9EJL^)Fgen4jhClUO70X zjj%A!Iq?^&8T3i`v9_p$cu`;{bIrh9A;HGR%rx8Q{qt)NC_BAlH2e3d<1s(5xrGJz zKfGNiVwjmTwc7|BCJ&LA_~z?IdHHfUVOd;%Zz+AY0s_H^%*0ti`J$R1=dgAltqxNS zl7i54<<^k+mU*{+-1TiB5utU*#XpLUT!46H-S$R5kS56is zc{aqS2QXbrGBeBhIbD$BpIRB>h&gDLQ?8flO?D$Be z&?U63%W}YpF;LcwD)Yys@z}x=(em$!{I$~|QAZ+D&t8q{2fPgw`^dD+G& zU{dCDW8Wf4k%LF#{Yr(2VJqtCmj>~WuhndpW?#FlZ{5CW!t_p_mDQ~N>CUx7{hMfy zebm_&2ZO!E_{6aKR1Wo@Zid|SKD)b*b{tV@emrBi2f6y1la7K07waS+LIbCnAwf97 z&%$*1c-MT|wMUDFRyEq2JZp5>WWpkXgPyog3az#|Ag<0cEKT%>bKdFUQR%cwXjneD z>+o1(b$@pGac$Wbsg~|g*XhJ%d>S^r3vLqBwbZq#_o#BCf@U3VjpsA|mSoRXG#opY zmV{k5ec?am0Ix17(f?D^*14RwMB^QvXbSNvE}te?(v3%4N5U(ErG2TgJ02kMvxxhU zA)ag!hV&8FpAU(ja`I7%;#GV9Sf1m4db@vI>#I&)broKN6*4dF9A^SfQaz1}PxKgh zIJ0ZyXJPiPtjm)f*QcfLF}>Kdc}dgS!y~`s$z%GbqtJI?GEgc4Dr@`oXLk9Ap8u%4JxJ`&_sro3_-IM6u9($QdgSO%y z;#Bu{)J8{J6Kc3egw1Lo*Kk}MslGTL1{FHcigY3KpWhF9b_am_a=D!6okF{a!MV%} zJiKzGFOUW|2b#_ff$0wV=Y^dssiu?OZKAd#3mCMaD_9OKQK#KC4Al_o)Yogf zZTWeJOtVO2dJJF1bnr$Nw~K&5ukoY=uhA;~WTOySXe7U0x2mVHj|^Y3^-IHAyOd5Z zHoPg!=Jkm%gL)fl|3rb4`nLVd+=pDryBWgxK?-dKJq87=&sbjuFMj?T+ko5j`%3$c z?flZsNAHGLitD1i>jm^Jm>C~C-Q3%Wy>v;W)-Juf5vKLsge)*?`*M(1^`ob3Vf(gD z_CpdhA+2&^I}+}1pYrD;`t~8``Y#XPuBcnQU&^;x2yIZD$=XIct17HxLZV)jGnSR4 z>Kwv>a#>U`9Q+j&{5ti2hMGPr(|br$$Q0TJ(n4ao;)m^JdUtSAmlYwYdp4xRr-%N z)@tl3El=3z$>e)38&njyQlP%0lTPlo*afKumXJM>5jAh%b{<7^#IN>Ra14$4XZQ&O z<9~#*^Sl1hpQZU@uAqCVCJev3r0Z5TJ$Y1a*;^quFd{o!&|W}%$FFafi*7>uL_XeG z6(OO`4~z9Qp~-$cNF6hPdtsplCt|fQv5Cc*_zqD6i79g8+5ki`rZLi zC$pwOZFh>QDeKdPIC`}dB5q4n4X2tR!O=vH~ym+dQ(RmiDP5U?s)Mo)t=Eze@Fh%5@0U%5=<2H_MO-P7KbB zN)#?fl*fCmDKdJXPVJISAJve=W!INw`?|pv5fhA>dFdz^Bd-QOAEGylkeuU%_aqQP zW448@w5wX2aOFlz>p_SLq&+Ku#V&*+O~W#hm;?lLSk?8rZYr}XqUR=MO7n?#S9B>? zDjy09qFx`AnDmJpD%R-P#~oXH_m|kL=om8BD#59jRi!uUZ+>)-t0?Q~6!o&+_!vsY z9kl*IN<3&RnfLy5$&=~u)v5UXpotu(_#$^#slVRXM+Lt?N}+rxO*9iXxm@yNhgtduf^|kG=(RPi+}NjCchRg40*h z!>BfQU|T|XG2%Jso5na>_fZ%0Yd`h|V}CYw&lu$zR`AH34tE4gmgTvw%X8EMC3KZ1 zWhj&~M)K(?5i3_oegbqLcfU@Xfiu$1I|V*iKZIx}*9t0i`Uc+WXX_KIliX4xDlF@3 zuOr|yoV2pJS@TG@{%W)7Ba6b}Z^D5aC;=?yODnTa`?|rVFt0hMPIJB& zhgC8sdm}BlyugKmd=|;#m2u~rdo3r>jF#7>iAe<0puE|&M+dzXz3OO(Tz>7$hf!=_jvF`_k=1XVbM(}Ppl}~@G)1Za zo>CqXqaROF=q$7qc-T21S68>-I}nHvaC4R#k(3Sqc1qEK0%4Mh9=0z$)eYRfnmQ4r zd+7w-p&N{ZuDkA%S#sX%555%{*Xd;?tla*ah0QiT^3AhX-^fJowIGciKmJlvt=L+9 z^lE^I@L^53i^=ax5e7vel{egD!lU^793QbAKoyiTb^FtYag8Kdhupe6etEiP-PTaH zLo0zTHKuV1Cxsf*4R&U?72>y{6Qhgz#G91)aluir;4Cj1Nxz#p%6e{U7JMx=D$=gz z$jEhjdlk#rx+SW_WXdhYc5N$7+1DgYVPRW2lPdGB=6`I`uEY9(izDb9FC=c=DRh0a&kbGxD=~41q?*jqC{b2s%s;;r!&J+q+%g+CVbkd zBreZhYO8T2-l5zgpLX9 zn1Hr?oW45-bIjDA7B$>>W9nCE>elMzliVpO7VjfDoObVW_OPpXLF&z7_tk5uaa8Bd z*Lf2*6M_Xrc}F8RjLk$R%dgb42nxPFlX|crRal|26t1>+oYx_#zn83{GCD+YLwqf7 z=QbIc#TAvWcby(6%$Fc(eFyp(+B8bb3)!JotW3P5gNu^&T#h*&C2KQ$#SEgA2`CkX z;cbgdy#Kyy_X2+oEqy0ZmAs8^vVMIW;*CP1ElWnt?YAU0cb+67wOG^VJtnP3n!b4J zs(Z-kmNL#(hPeifzhyF;xRqSStz=M~q_g=&Lch0+w~0^f#SaTXdV2ixi4?^V5vsF_5m0vRg?F z1LC^FYw>N<7?;dZT-#_hpCrSTL4>bdV!}4mN=$}yRBRfa;mRQgjUG>m**nQ{L~pG* z0>t$IjB361l?hgz7Q5ML&%3s?Fz#Mc^`*U@je)P7Q&qz(LXD|u4QZyXq>k3#!|@#^)F;{)Dn`-#llf1? zs5hrclIHljQcFei_pajag!GhMxb5gI7DQ*nT&x~W_2$rdKqse76e+6;(URVal(}XK zAx4kRe~MZr*fW1rb}BluQBaK-r$Z3PD2ObqB=o(ztiC(TFfgP9iwBL87N~n|l4b@sy1ENYovLpdqBM9O;KBB>Mt(L?lmL^NHrb{;JY%usl zTF_OXO!}wi#1r88>K5=32Zf?v1j`FR$bkTHa!aG=c}c~DN8YizZZw_lx=Bv&EnbOZ zTyJbx=QwTMs~u)ore0oWdU!sl`sg-i-|?1(;`-RPwJg{5c$93oGJpGq6aP#xe(D>c zTvA{$8(Ee^Qg0Td`hv(+d!YUxJtISeLfCn$^{a+18Jfaip&+LxFfm)r*8Ex9!;Bo8 ze%^2d}cOrL*OX2wNsYJm0qxSDDQ{)!-_HfhduAP4bB9mfq2SI%!p~bjQ@}JD{Ez#Y@O+Fj zJse;H)_nYl5daz@@3^}0@X;5)HoqnD#k3W*+Y?3lee^ec!VMT*0@+%op^Jk^Uzw?n z{WaG=Y_Gq4{um?WTM{Og5}~`5HGh7jZR*my(NWj(R#x4Hw+;?3?}wceq!|OKBv>kB zVD#|StE>G1^vTmP0;^F~NsEK;&>GvH z=di*)@y3mIx5UJra#MxFyHbQ-A3a$x_QP=r+&GLyw+-{P_UF}kFA3cEBYSUJ$BSPF z$U<2!d4_uyu*LD-N{Qd{ai=y|)%IjV360HQQB;Tw{M}+>5lMawisZ@bSAATVlT~K+3tij zpQ-VB0lQkpvi@v|?c_zzK2k|b+JYrZ=8fpO(i@#HX#)>-TWOzJ!~MqUNJr5{t>)N} zODQ&H%$ZS&-Wno9YEdb&uKdtia;Nx%zRLDj$44`74%lHDw$mA3G^Lo7YWNd%_^Ywq zcyenl$0FI!0nZ#L7g|ic#a~R>6ij5a2aJ*AXK#BP3Y;Tna}asuLZ;ch(BO5VIC$lF zWv~}pq;;IUe-Ofgra}}d38kK^Gq4#uOiiilzqe^~+WhBxFD3Tg8qR*zOvveZ2`^-@`MeWNSyklPi1Ys?oz_lFd{DW_tJ9Ol?11bFEg(EO8hQ8H%&yy zHaEoy$-}0_B1?wJ&YE@g9s8UEutoFR4oQ8+;;+)x9%=62s+7K9l&z;=$%e|$nsdSv z?@yD8)-lzx-lp@msE%H4y@ZxiZTnt6g13c)mF!!cJ5_g>=mtq4 zgJh+hq48o?AL8$_Bp;`Z9Qm>X4qvulI)D%`4Xz0Qas>eB1oTr**W)i&xLEltBQ3pp z%B18us=cyCPllhH9)=7^T6ezT5OJ0l|4b{}arRBi+E4u^hUWF2s9ZkWcp>z2Il%|} z=nGGusWgi<#{W3^8%!XR2cyEs-oflO5X;z0q=A#Fju7pLoUm%&TVrM2b(i!Q=dc}< z)8O6hAQn_*QFeTAOjGsRVD#LpgkSwpX4EW~nZeRS7UAq%Zo1NHHih?M%Z(Z$Qq+sg zUo<#2Gs{^$SP0UxVXI;_$xJyrSj~z4;Tb;a_p>uV}1T8mu@#gBq_+OdsAk zeVdv!n^0uR0mM^sK;XbF)jZDcp9U@32qIYJ%J00a&JZtP=cni;ihh>7n8__WKEF&$ z2UyHCTp-85v7ve)*{a58XsjFRk?dq_{I*sEQvNp8$WQv`!|8t7Qsi|u&cTKS2ue5h!FA_Gn!&rj#V>`!vEmD^!% zctlt|SgI`4ag?gyDD{ZlHTDcsSs&>Sp&uMxupwW)b$_5wY+l@*fsw7Z{4WcBp$Cl& zpFB%U&2*l$)`uewvzF4n*?GGHWJ`_;T2u^)ZI0|D#dz^mS|;9?FVsbAqEt`c9Kr1BwC>xSm;T(cqA5Rm)^vQW zoNOwK#ZW`iqV@5vEX{N($CfSwaa~!CYZ$dgB)3KuQHZ`JcZ=RmxwEmLwz&zu(OYqg zO2f{-CugT<)tq|gSlGl&t7f=f<7}q$o=l+4UUEx|zD$FsfZ*6(ayzwJA1sq-B>W?I ze>Nnux-=N)HJkkU+mYyvwYsB3t6GrV1c}Hcg{NRzG*qeIjDdR^hjV(8BCut(%jGcN*UF?ljXeNaY4- zTGdOteOzNfGLRPHA;p5-rxdFcvD@0Nvx^5F(G%(hljOVu{HRaULz^&fl-cM)nU;_KF0F03rO&X`M8 zh)=iNXwp+0aw!C;n8bv7n`+4gACi%D6$vdcIOuq(K_Z-COfsLfZ;WK|sc$|*pLCW> z_(t7+x{($zWs@(@?)W~rP?F|#xOtuoCaxkc({p@=DR7iscIrf+B~htGG>J#IDD$RU zP$=Jmp%g)1zxT7try{mz<*wN1;;m z%ufYkjPNu1V}y7i&0{6HzQZV8Fp}tFW;>H()7Ua?5ayb24NH!;!BqU_Zra3W6o7otmEtiXgF+^W?%jJc8Lg0Tdi3$ou ziM3ye`GgF(6LnXgL3J-^6Glc);~~C7>@u*!7f)B>lOltH&iy2%+}iT0t;V$`2*jd; zwV$kVswwXQz$cjmfDHV^flQ5I^Ysb*Wx|S9EXvDI*xal*lsc<}*XRzMFhkEVC9vsi zl`88eRlixpJ(S0VN!d=ENws`k!fv#kY`L66m~PQFfknUtJTWMkrJZBpAez5*`wc{_<5 zG36tHs-(nZ-%R57gNy1avj`VR{|G zhCw3}GghkdN0+{z7Ja)G&_Xq1EFApfshxDJWbO=7jFy2UqQMW0 zbNKGabrVUJ+vjvyuGi+MA*{7Yoy9j098bsldAaE725|Txw=yU|w?@^8R3~~u?}(;< zp3Inpw&1x(Fljm7(t{Th=uxK(AOmRR(Gax$_23LV5 apOj0F9RQNN*2~B6-{SCAepO6*oTfOw}BIX!0hsFB$qhx}Kmf0kuFY9_k;hw9zG+Q|gzzm5VQ*vV z<1?}0uEE9t>!$((1;THjV-ooFz{+hWRU;26UXM=8H5rxpczy?XqTcoMrLhy=WiQb; z#rEoUrP)`SCe@zkv(Y%0F=!;2Gc_yAL|0?2Q{VVMZ&4J?C*W+rFTX=VV_OI*Pg0#; ziz%vEC$(I<=an9TDRROX%;!@xnyn|9EgM{^@Xn3O7amO4uyrjaVy<@xOM=rYOHC$lRruMSB{JmhZtgSOgxpvhXM{`IIXPxCYH zyqGJemEQup!yc);Nvv_u$YL>Q9#fvI5D|Y@Iw7AErLrp%>=i9gEAecf?OZeaptk&T zXL7LRF{Sj}&?d zx7l8In9WA`a4MEkSP#D~ml!3El@R>_iXz|3)UXWCu5vd8>FHUf!;sm(Zp!(b|8Rcv z&c(UQRk1uLLtjA9eU#*u2ji&;nFmF4@`z(9zxVs@xI-t^QX&BD44e^{)=BJH4<~U@ zG=);%^2E0HT~~ZzH~^0_NU^LZKw|sbSm_velNS7`<6asBF^psRnjj*kKM{#M2z^Zl z7vToVCu5-SgNvS_$t5#i@9Qdg?|_{J5m(Os~8_pM5GYa}`H% zQyEa~>+)23o*VG2Hw%+GOrF#6Pi8yryO<=$me@zj&LUD;l+)0~6qy3ZIB% zhBY;>)a>N*j-Ojr{vN4LUyL`uEc$DzKh&g5T4pKFR4p8;g3W!(gn6*e6W87m4|9S7 z^3>Y#kI8c8d;uYe2@@JzGj;Rjdd>3@9`)Vc%$aJ3R6knMGc|bs+*}zYwdZ{-$0Z_! z=AvX)Nfr}})fRw@<4z}mBR6F~vIkP;_|iS32maZmsK3~w_`OR(0{+`nkSnr)cPbKo zrh#9=6#cqwfdh9fvVSIXjdMc5qfKxt6-I{x&z<`O&yKbND*H1YHW z+~xtYExLK080MOoXkRI#VzFvDq7*rc5g&#PKefK}Y?(Cf}zvy-* z=X;h&nx7r7EW|C{T5*eMJNTnlYle5A)Fz3}kC5%Y)Zne<2|%Ke+5Bw8ER(fgtieJz zZG!L6NH)=~+TH&ruX*u8PTaFSV@&>>zvq>QJsS+wS2>cgkjR_ve{idj(!EH_);;|=XhThU8X79dm+?sn#s_V7zEOmSz zX;NXl7{}&&L*5NbNDDP33{lmbNsqP3Ag1L2FRxR%P#HmR5OAZ2=a=Rjf;IyHBowT^ zzx&+qXNRBdvW=B?QbSt)nq#6S6(jvhGiqXXfoy2uK&-Js)PH$$yxSy9OUk-?dm16K zYjvgGu(fzPHi~m^Jo*7mUYw}i>u8Ok9%Fz|+a(a37Rb-9RDV;>pdTi#*D;cED|bOO z024XaFPf}b>~&ybLp`X%CoI!m%LT`D2RQpH+_qTpT{@l(y4qb|Tb;eKGO1I;oO?_3 zoOzLp7XHv#>S2s1uVDW2d>3N2h*FRcyWdXfA*f*UAjmwEDcZG-BTv4XP2`W)3@jDX zVjrf(N4_^vNxYfbLb7KKN12-i8hRn_i%f<>RIaTUSESUckv+g_sY4ZfdV@>r+*|4w zvY61TbJr&@awyp@YT271IT@tnya5vn6ex99atQDVBP)!`vD)F#V24>Zu#~n%Jy9L! z3l}H4r(auaa#eGG)TRB9TO?fH8lOe-XU7n?n(7}mI&p}oOX?zOgG+Yz#7Tj0SnnD` zY1Lv=+2M7c=gc$~O4)ejnz^h`LH7iLjw^bxft)Sq5(1Hi-*vIEor} z&)Eq}txUSoGC$RupY6tJEVu<@wKic|yu{Nx=_PTvD`_3~iZfNb?0(!d6MLGg4vl!k zrsu2gSkdTKWv)@JW0M@84VQA>D!r$hIybe|;>oKF%XHuNNN2VfJa@d;lSG<5Tke=c zlR7?`56nfFkm#0Pb?&%QEw?JmU_%i7vPUVCn)LizpV8k<>qaL!Mb?f}o{IO|Hn)f= zhc;hHP^>+jb$T=fGDs%NHFZ*3i=6kddjGA$gw)7E78qBqBpc2S++JVQY1itK(QbNTHM{eNO1QST264MXdqZ|hvH6)I}~>)#frDI z$Z6?0y*b}^@47oHYwaI<|H%7J=AC(Fo@cDAY>69F=cDuGJ}(pX!wDc2+q>bizuU+n z9|NRv8KbJh$#7t&gN2+(4unsAj*R`UOUy^pg9y?7Irh$6^|d9^)ySR60NH?iy?pGF zdnz|)_RUVl&OxKMBQM!~L(S^OJhYyNacRtMP~^kcOXROCxbi_YjLz69foeG-B|khx zrq-RzI+ry*{+Qu0Oig0p^DNJ{@T?|S6h!hS{ba&lA@_1$$HOc!YJN`SQm?FjLQHnF z^cL=?Ty{Wzf}I$-3#jXb2Fnw}Q#x4E)39CJ z=0v*rS&ZI?piITx(?YOjp zLJkD%qFvu@#lCy{{-LL;Xf?N6t^D0xdTG(gz`R&cQ(7s#|6guv?Vi}5b)##JXAGYN z3C|ckQ(tb8H(5T3zj0MwFm^uae1{T}J*npAaJu41QxBSKT(n7~a{{|2Y5c_g5@8NJ zh&XJz3;4*SrJhB3I;M1%u_vc0(?t`-*i~kp2j}>PbXIy8ggt-t#zi4;DBRJbK`kv( zfJs5umM{zc$^T3Gf_C4dp+Ln4obd<&Z7}dK%g)3&ySZk^r`kxxP|K+Nys;Z3GK=S% zRMcJ?b}tq!mw&lq80hSXEIv92+B+^R7S9_sZS}RGn<=|TSR(@x6FEkt4wG8kP7O|s zfVq<`Dw5oj=^uGT)d}^G)53@nU$T=b5_nR{xx48t#XCXCs5oFD%e97Y)1`-R%}Ok< zfEH|Gn2Qh2jL621SAXv6lMa*R#b^7>b^e&`vOh(h!Dny8;`RCjL(HRtS1^D=@{zG! zTHE9<3*XMimZ;Qp@?-OuXJfWx@~7PflX z+BYjqr4BjxT&2bq-76jiRQ1|7x?}56X%Zpl7os`oW)>*Rj@I&Ow}a|!m-_^edqKVD zkFZm5wb9J-Gg0MJ-!NK*E4*!S6PflAogp(4Fk!YKwAxSdzt#KDJ zP8Zk{`wF&i2O$y(G+G@y31<66A2Yd0=*7jJt^4jyYe%txzpM^$+z9nYKA>l>D^rw^ z8j%)_vDvbgWxafFm8I|Q^l`#&RGzDO@EBI3=A|jewr<_JWcAmf^TW~S*@iWjxs$xd z91Fh_@sm#yRlF#g%ffJdDea{?Kz8B#5_4i-b0PGC)Sg76HsV~(prktdQ#NM63ZJQe zt>m+EI_pCObLbx*JO&$13UI50SZz6In~`IB-w^=yHj>ql&Pi-8CgMQE(Xk;QY>Y*L z1P6I63CH@%umKO_*4~9B_UG($lqSbiYiPtUGo>$%7C&Vc&R-Q%+hF+Z_QO~tzR&Z1 zI*V2`QCxkq^2}|ej+4;qmIdY9>&Zixo??0A9*f~cn$jD#&`3QA;Ej-MSrN@zNa6%W04T2q6cyBCT(HGv6*;!?bKrOlN0Mepk>ko|&_uw`!X= zv{utRGI**JMCaKTY0=`e*1KcZ!s7lh$UA+W1Gg7L7<)(Ak-rBv1E(5U?4FvJ@+yxs zXX3xivDkA{vJVUjNwAMl^imeBBx0^vXuI$W6okQi@tLxQ+w!++R(Q*)9A$K3YZKK8 zobzuj>e#RO$6W<##n$<&{JZ4^lWH-j!D2q0V+pp#L#V$_6X6?@uM9lzLPP$9Ld99QGBrm6mR|-21s6Gva&@sr!0zc<8+F==V)z`v17J zuGHjKTPPd1lwFi?JC)h5aZ`Cq8s>VXXv3VCEjeeOHaBSnG`5N#xGM>?3|YN)oC(pl zlwDEbPZyQaj?VIDt0p1n_{0T_*Up>@KCVfuR&+A4mb$of zruaOpEwc3)oDTkB5|>m|#4&qnfC;rji8!3q!}vM+5aAqJ%9E2&jd&*|J%KUT^5Y%X zNu3W%&5sV3EP~gKgqEX2c=JmwNK__-ne8}9Hb^y zM$v(sh!^*<5n33oV^aqXHWB=SD6s==5R40OmpGmw<#MOe73-z_ z*=^P;V`)a+IW zzMwP&&tD55v(}O~V7v{;k%9KA&u1t;2+PCXGdy3Y3kc7G-4D=FnVoGHk{j{Cz2)T2 zx{s7_68lk{xg4O^?ze zmP6#Lg5fZS>n&DGw#LdDLMV}tT*Q;|@B{U{FVLqQTSROCK2T-p1;Lg2$#ySgxgk@{ z_f_=C?Vj%Xc3V6FFONlF)<;E%&?uBz+`{zl|A>%_jmWQ_rJDf9#SzLcDY{k zn{C+aq${m#Q??0u+6N|eRh#QCt;MH8A0l=~b%Ty3NhsvfUQ~UHvlTi+Eql=iKtWcQ zXU2YhN?`kG=hvWtu+mq&-W-ZAA8Ukb0(dg}}mehe4+Q#ABQrfo%zRQt%Ss*k3dM`Xo;1P-6A3;u*tgAU{ zG6$`d^sK3K=^<@oz1{c_v8AfSV`#H_?aKcn6@lO7=YMwQSS7h+M5 z2L#~C&i@zxSi_wUxa&Wb$$tTo;`l$(bhzG(;6GtF6eR9X5UyXt?SE83f?3C>aS}m* z&)C*~FQ6?+#ew@LX?{;1h^bEGUVNKxFYwe}@QieIHTl4A2R{mc?ug%E;+al87g!AL z=eQ4cCA+N*pIS36w%O5h%r<&wh;`jlaHthU8=tVp$Jt>&&lE&i-@1yu*fthHFi+uBxR-EWwGku_-DrE{wN(o3wyb2@smo=N`I$0#b4;eF&ug?1Nt z;yB;O?Y2t>5L`^R>O|9Vm-83*D0A@n)%S?Yzx5wcQHF%UmpV++6FBZ)U% zNSylXIxcokLN@}`Z(F2VmBsw)H7@B(CrYD96&l*{V^Bnc0jt5(m-vX%i*cp;Wd%iZ zx2num7~Ml#vvbc#yEPcO+jqFd<6@L={(Ch>WG!8y{{7a|#Y;GIHsRB4{`Ol;dA)rN z`yy!Sg#^Bl{x!AMiQ4*O_I=9368pzCtF_y*NJj$Q8>Ryx!Q>-e@_DyqGiIiZf+-SP zW6y@m219kpcFU<8JztvAbN*GgK&&J*JI;{K_dUcfi>fuQ_}N-(D8Z)D-A(fQ^FuZCt7vfb(1wY`9c=*Gmeg5+R4z8NjJ@x!B=p z*`iODWwEG-aS!uXa106&Atjp_wlL|b%$cp4i|qD4yG`7FoV;z@7BKF7zqR*Utz+3^ ziv25||CtHbW{JjGQY4yIqjN-fD=-a_E^=~}0Old} zC;!e?)fRk|_Dr{OH=~GNjt7y{7!v#58EZP_Bhh{}whW^=j;+#x_21mMZN1HNVw8uH zER2(P`tH4#QC8jpQW<*vNueC9@UpR_0#o|5?u}+Stn1NxbcM4IWpE(CdfDvs+eoBh zJtLfBP_W;Vzn&_vb&G;>!I-7BQMUNz+R~#I*FPlXxXkP5s#V)B$I>xQ%0~glYe=Aj zn7LV_8!^|u=K2>2HD!MRM3Dpi%DhcAj+S$obg-Hz8;Xo(VxL%rW?j(JN*vD74*=5w z5^_Wcwg{452iizEqZ%+~+8w{l`*o~$sd!04Qp}2R;nYiGF?I=wii5TM>bF9S6@%*y zJ)B7Hq3Zw(XV3m8Cn5vnRg}+X>*v1A`h=y)ycxA_@y+BH-&!p(l&4*_aRU^|nJB4X z2xQYS=t-5!!IgT8rE<>UpI>PqlK_lwTBl3m?{2}x$Zc1Lm^YeyUjcL zZDA;DIL=hCnK`G?@>n`UUY>Bt?6e{#-V+0QEhrP?%v{dKqJKG|qxWUZEMIaui3)6#_4gv{_}rlh*7_2XO5qSDvE#3XQ5 z+UTdGc18rM3|_>kuOKlzEfnmw>!T+W$x5)T($0x-Apv;ZtN9XR}37z})C--7>l0^9{S(O(<(1eZ7Fl$NZwbJnP2rx1y17_{S6 z5+?+2z&4h2r9(Q7rYla!$v4c#j(R)?r&<(K$GA<#ZHk;0hjaJO2IK@j$NaPhzRaTVZyUV? z2JE?+88IGaQt(YGTd4gwVW5)Dl@M17wi*$-9*S-{AmS~gy(uvyc0fL zSKMs?y=YtLbcRiG8pKMWT{;`?5Kh;Psjq5&Q1P9G0S1Is{xAC4dx%qgz#ZJ2e(2&4 zKY#sdZ*zfP@YNfiXk@*83)g>$bT1UA8W!w%-529hB6_hL^6NO~lF=#81N)}Q@iv#$ zphs^ionE`fF%|NTzlCKiYvq(HdaiqDVVf%?IG;21yi9V1Hg?*GHET&*4C*e16^2ip zomWx99JTz6dOZVY+_a5*$Du3Wbv;e5ju@oor5Li3YFdukUBRa3VA0vdlz_4XuFq@A zO{5=&?q#o;n1@rFQ;W(CLu@f=5p z8#ZhpCMbGb4D&bqV){Ki{JX=y$6T7mve=!A{G=9XpJX;yMwyHTBKV2pk1tp3gmcsMF>E1fkKuDT+b91I@|HUEkptrx zC3r3VT>TQGRXH9e++eP z%qrxqWK7l8&1Ocg2l_lsa?*I1v8?!uC&!q&yE0kx8wn1#;Fcf65^yYBZ8Nqs2my=A z##*DK!k3*1jO&}MpD{7SSj^Mp0AVpDa~0Zs!?iA0c?iadN@Tw}n*WBgcD5MPbspCzix@Ks8ptLPZz<;c|q)2yrirn|NVlq0GPE}5R8 zPZqy=5GMMuL$tr-vgY}^N2_Npl@a`yT-*%nzNFDPob}q?`b}qr(a&SgZL2PH+GUcn zuH&>SUGBQop=BW<6=s_tnjm6^$PlwKyJZsBLf9K%Y%x+%UB&UkF1bP#5TlkMA+h)c zm7k&Mir!Au5QNf%-+=pPum%i5BxhR`=Q@vBM8NZM2np4QzI}xG(F6Y(Is~T12Hs8X z!WI0$fX{~vp+wm2eEYHmbA?5=YxguF@@CiKLw)Iqku#Gh6_wb@if+Q3Ae`;kY? z^ux|+HqEn8fl@JHP4Ppoh9qM~)Y!#~GcUX2-N?ZWG5JG<239?igdR!r3g!OK+w}Y7_s(p1mcg)Xg@C zAMuF$d%Bje{hn0(pLdt{Ur6xo`Wc3rA36#z7xHsY)Uh9ZCwbUn@WRijCQF2$nnf~2 zVz$DUkcO(IVWD^TTs1N_Y&_zWw0W#;nD()Qd7_08L=Yk&2DCAt`D+6b^wa1E`WPwroSdmb^k5CJx}!7Vf{qUkRbc|Z&) zVzYx@s-OiU-;0~!&YU3g|F8sUlfZg^Avo_&+0 zoQFh_?1z)u{LXIX}(YAlBhLG#gvZ@jdHI@plN zpQCfzLw*9|v>o;dg6b|_E=kg7IZwVW%!*Yl2y0oF;)J9U%ix_@H-ef%sH0QW84b4Y zrOZakCqrv)_7f#VE7F;;zbfEMEkTQ?g29Q_M@OT%HQ2&p-)U_vl`H?hqJO(@(5tUW zZOb(?ce^v(h$c}je%DjCCTopP%Fu~Y)UOG&bR}qG-9^#%Ao@Xo6@aFRK8g`0N=_Rl zMMkr|p7JA~HzQLnC0SwIRY(TAR_;&Q3>h?Zq{@8L73r%yIkBwlob96s*nt-Zz4I&p>d6pMyo0JS^zJh#FOuy=!`5 zdzl=GM%vQ_iqF-0N}}WYCgf=?(uMGXVFCLVX++3l8bvPhLnvQoHC?MxdW!Sag2M)) zuj@}zF`HUDRqw_cfkeRrmy`9TgTvWEfLzyNZeD(t~wHsz**@|7tTB41oyc*J~7PNX%^ZarGc&lF7 zG5PabhSEARZO-F$>I1!E?j?@7D#>-Z5g7$@C;0kCj=aqG8vO`f#5w(kWQx?19-3HG z_|G{rEsHA@mr|xuQmQ$-DIIsU3X#WaE?~q=4$AdHew416v^N!;(~4go@vhZKkx zH1@{V)>lf_wC9rHsyRmIgx0a=?o_RVCz8fToD`Fp_N2UBuPDF5=wt~3C_Ee-)$O>IqbAvEJr-l1{QG zzMqhPIo~TbWgwbGEjo9-#KdE<*vW4FZd>mh++*JnSGBdSAk~k6;)}tC{8*L0%He_W zcIm&T1q;)nwTBk$H&;uZbLVJ10g2!WzaT&nV#g-%($e$17>)ypumtwQy)+C=>nv)P zZ%jMGS2Ddm@^BRw)yW@^8YmjRYc9BCW4Ek=Bj*5CZ0`O4ozl`zgbQSF*MA@cPBR;5 z+W7N}0oQb4{m1){&mR|@EUDig6z=PVyZ8SWvxVltJ+y-vdI?a$fzG$YXHIfN$)^D%d5_WGs zCT1hGbUp2I=DLCC3cTUv^A!1*2ogq^UgAceSFo^eU~fv4GrV4E=1DZ~gTQc(Tt7$A zyz+cWj++DHuBhq>$&_5Lx^X5m*}wK@T8s(gu_hLr5mZCLzD^XB zeU+b(e8c!%O}I}}tH|Cz7sOFRLXxwh^{EZ&RO1u)EVE%CM?;+>nckm6`%d%q6K~Og zzhr6z*%nb&LtH5&YD2Tq(^24P}tNCaob3d({y}5Xpn$|GsLfO zH*T=w3${h$UiRjrvRsL&) z>BspkPF$H&FkWqwqAl4)K*6}X&ZIo2`ewKbS{FlE*?y`t@zhKun#^RjaiX40Vj7XpZhzJE77{3t`LOFy!xjxrb0Dlq_xcJF$|nEk&acjKS}9h()iy^sfVt9 zF+m0iCgXCw9g|9uJR&~%)*7It$f;SF#p8)2rBx+z28CiI=^Mosw21UWTDWMo7{=0< z<}f(4K~4PGtWWyqAO)UI;g6o)Sr#QpacwW~qAU5;Ecn(>o6dgt zeSAT-Q~x8VzJzuhWxtL`fs0zY6W=ltq$-BbD#%H6JB*qIq&LhGFf-cAG2EcN*$)PF z5WC7+>-8)i$K~MqW1qQ5vHmo;qEj(g2(MoqV9jPBr(gq!sfT(0x1Rq`SH<>*XTnCE z=aNLGh{kd~>L|+L+@MJ~+17i}_7O)9p6BX?#r_Es^YCm{pupIMrJKOVX^u9}%cN#a zRA66g{c~phOMc^%my${aD+o-Z|GVUIHjb5pZyCJ3&pIT8hZb(yryLx*XKjLnU%;O^ zU?%q391bcKITKFV1qa1KgbfCx%3W5_mJiDm3e-OGz7n-%xnNgGBo-sc0}?fYh4GdP zhO&yPshjFf1RnreCU3homzUw8mwumHTpl1oD=NlWmnfCr1?hM0du7TgR^%LL7ugq0 zHqe#c*7H@@mL7HgOwr-~yziAu5M3{19Kkf{Yh+{HZsiyR=>8&>4BFa_ldgVpI2Y9aEwTaCaKhQVQJTrI>P zf*uq{AlXmi1B54V5%Uxf&Hf1s4o=l_F_?n@|5o5qvVKsbT)rOzF02O#*OorL-u(5= zv($}7Kzk^QhIc0ZYFN^V;U->O-`Oy9;;E>64PB|H-Eu-Mce_cuqse-<9ns=AUrm^; zqoJGGh0vu?*FUpS6I4BM3HcUP?>z6I4*J4aDs|LiZdkL%oBe9!U2fAPv6prn-5l(c zVWFS0T2?_=Zh9g0EMmF9nQkvXivzJdP2z2Kkf0A%%xE*BtA$JKV!!i&M%I{(Zee=7WFog_wHm%fcM7lc{NE7gFyq|~t{55C%$nT?&uXd!ROhDu(6HI-j~@Nb z_tlUtXDnq$sDF1%W01J$2n*d~ix4M}mrqI?0GJ~8%5%-r=pI3w$#o&y)2pz?Ego(thHn0^7odz~P zRp5|+PJ~95fw7^})8At|FxTp3rcv_8*|m)XKsgRiIFg7t3-g}In(1%@-@#o=AR|G`nB>b7LEun3(yxjT zuyCMCeA!t+G{{jIb5H@JGuNX_7-iIC&Gd+lb%%nkhm+sr!)ztXl+49gK8FP z`I}dNd7>aWDv2mOTug`x{}T+9^r-Qf%_;TI_3==sr!|*x(XhAFBg867H~=<7*f%F4 z0=rJ-IfQ$2OhK^-VapuHfcXTA0~3| zUY9Sw4@$B&=6Iw#_VBsu0Tas&g^rj|OQwrai%s>gkmZKgK;K}$t8o4*+p3P&(F0B-Zx}upc=7cew`H)Xu%ON2X;_JWAf=%wqO8g{QG|I~Gmi?Awbuzj@uHsJtt}yfyU>b@DTN1G0QV% zM$;I6adU1))eBpy4OBZJaU#w3g*0T$w)hARP2X4+`{5WvoA6EoP?~kk+J-zpi9Q4x+iAoB4SL&l$KIb?vGZ;M#^f*)i2u^ZRDj_ z2H};zCf7-`-`FoX>!{Xv)FMY_esVkM(=5nZ$%(4Woj%P_B6h$|l-c)Kt9!M4s%vm+ zHr}MC<`fRTOWl@ZE(5b+nc4d}N>2T$v+y}YqpH3$F%>Ehols0vV5)?`n>(vF9Zk#; zHL8N#`#-azyaXdh31pShf2bXo_XB`Sh8%e+3LP;=u4e7UfsgD5o@TS4Aw>8zXvsr1 z+;Rh}5dmI!PX91m#H|=3uOG1iGADs}N*&1O9JZf#cPLN!6Q97jwTMi1$N zLh_IgZ=jB$GbMM~tKjk$TZ!9JLr^9y0nT8PTcZ^* zakGCC*iAF;tbztLUac-J-j{ntyZcQjlx;I@)&3dT4H#u>Mk(nQ^3*D7$mX8Z(a6B3 z3^CFp95Oa^738}}_auU&@P+`z6l%YE2aY@9?=0JjX})YOzO@kh{wU*D~!o#a#r6sPD49h ziW*B^=*MAIzG55oUY0*VG|8LAjN2xz8nKy!kM!{_^2E{!CpxvL^?iq|nF*| zqhzw++}k@*9L|VmKI#f)Fm6_$+xPZw!Kpz^5E&K9V z_p*rCy`eG-5*{>vVJ~?w%YyXkdU((<@UlK26{!`t%)QO;3MvPot*U3g+t!ZOsn0sD z(aucgXnAvDJieH!(&=|+UyH)#-dspYNcK9X6Vl_^I8~hJ7z9XbLm$H#xjptX1T^wT zW@PMvB5N>ek~b;pwOyEN>))Uk(NF)B#p5;6S#*LHh-6yJ&*9Tn^D!8t8CVnu1LO#f zFz6plM(`;gp7L)^>E1agDmQgYv;uC3&jqNj`4LbUvjxcYgNSV}B%!#P6L5*d75ivy zlQvxbaoLR1!#MF_Cr0vvVwM=!N9|W?JBYj5-EK?}`{{_wXl=39WKl#z&V;QIqM*iD zF?q9&Gjbw@=l(P)cyYA;xh;w@2ObV@Y4Jz>pvm04`2NpuKz;$KJ1A7*)>YpsWOMES z=sWC_QCBdtokUYfcIQDw0_(H5$&GAQS6sNwoVpMtv%F&o<~=RcEH2sH2~+D6sKoq* zWu}que_t>VKR;epQ(3ZC?^E_5m1EKl=P&ujE5%gCe!|bxRY~FPd?Z#Arf%eXyrFxi zHN4oB>SQlGx?C5KFN)`=eYLxDQJyi43|kYN9!j}_Vmr|?Ehb-`^tO=GUnC{S;xj6c zF7;YV=gDS|@c?18uM+-pNtNpZ0YL5jLgEFZffR7UM%Lbm=VSgE!c<;%n=vo(@G?!U zKhag+CrVbPh;5i93-z}V#Ag4jIA=}$vtuHXfHi0nEO zm3f!83L3)-6?JgK`eA+!gK0gt#6h*$Mg99WzPco9%nG8;LV`L^^x29H2eSdEy5D`{ zR8DI_V(k{`l0dCrnI)v#1}kzj5I{o|Ctt!?_q(C-WYeJL3kz-EQI;`ZJDW0rFQs zxoy-@($vJERwfVUihXx6ce9YQ<1YInhwtVyIn~l%hQ}P`)b$JaXy^5EqoT?xSNY5O zCzomPX|$c)4PlSA*-q7^RNM5$?qEKK>g>zZu~gucvY-jJGm;RBT{PgMo2pXeTtID-6!J+b z=FTBTMa|fdm+R{zB*ajZcTE#K;i%QC@nPTR$G}SGgd21iDNhfr$)Km@epxB4q&wh8P|Fci{k3>L%b*tHSw%u|3Zm=Yqlu53#Hs=PxH;9LWR- zwo30`((_+|e;@#`r-3j!t#MoCQU)lgZjet^jH?V#P2Ka8&&VX*RZc10*WKVu0HwYF zHteZf$ink7_eBLBSWq#j0TdxfBHJQj?f=)}flJx{yZ%F0aPc7Uj=sQ`;g8cF%RkPz zj}s14G5O>A#{q}5xc))en6Qje?-JC3iPZSXaqkf^^vlx8&RsUGc6k2Ns4r?vX5qR0ajc za197bs2F5;1=%h`s`-5}bc`8b_RX}g*yK!{ihgxbxVUd7_Bvg?>SlcEY$9wBl(}AQ zU2`d9DUZ`1@NL$Tks1#FjEzW;QA>=qaJM%yai;t-+z{<}1$8_;oMcezz5*XGl4RHV ze=E)rQk2Qys($0}Gj;Z}+U&&8f;tvqe%^#<`PKFFA*-3&{1 z3lQEkNA*eR5f!=YOt*rw)j+QuL$L<;Qr41vKk+p+@RpT?7(RvuJyP3gN+PWjt4lSS z6rmrtWpFwj8yTs zB!(!Ggb}6kmln~ovN}yk(*CHzc3}+k0G4N+V-~>pg_iZX-f20SESj#dHxK>>u^vw+t$K&|pl*FDtf<{>` zA_(~U3QCXWd%cm0x{v!L3-}v_)WdIZ8r?7%yEOdEf$vMrEg+MbX_I^t;mft;V6vlP zUe&rQZqvNiOrJFM&G!k&zUei@K(^C-9!1KbzsG_m)p97|bjLPaT&?6vqW&F|5isQ; zjZ`0XynSB6xj7Up1(B391$1h+0Cx<(r6!SfDubC7@sf0SgKLVKKlK z9yPI4$maFK(u*obCprV;NbGu&dj%QT>@2aq{$pv0Yk^Agm0_Pykky$)sQbQxG-mx= zn3{LwGi~Xa8JV`{QuE|XUTZB$b0cVQcVpz zxaJZW;?wh*a*&XWU<5X#d=dtdhZ=#o2N zsAovTra96ZBBFXP-9p0J!4=LHL&Nze8#sSEeJT9HPCun-v{yOrciD?~7b)ZR3p9qm zZ%@zVMW_>8(Qr_l8o%Bkmn;#5qyvbKlXjJiM!xGag?<@TIHHsz*RhNl6mSD?gP^sB zW^C~L6#>_)2!Kqvn(liO@+4wwPF@GDR(gz!xK&ul0bCPbQIaHt4ZsQ8k_Wlwxl=RL zKYFTC%2}gRrm+g+C3ZUdO@=w3S>YwzYi@&OzIgt{&B1YFMLVYfX)cYas3}jHsgSon zV2j!10g*_4pKn~?cMEK0pJ(2bbLoJx;;=kpc2B;OIdz(KBktxJ(zGTvzmX{xpz-Iem!OrIT%Nt)*l!UaR4xwPj^|Z!STE*bMcv8 z&_y7M6OWApqHTJRP9^ss>If783R7YE&tJ18NhbXViU*VCw5Oia3dNmn+PxQkWf@eh zr*5d#NLMbbTA5`=!$Z&|&$pUWp+vnt?{*c4nYTM=%}J_goUQrFE>gvz7?du0PX7^C zTH0jhyrqqi=UdQcpjSx23Dnce*HTxpx>@A2TePfjWFys|JL=(E<;3_3_RUR7UcpTw z41|+Z^sOvu>Wso4W=#kQzIB2P)kyCu^dUKrF+bk)xGK$?6!`Q?4=O8tq2i%IMiW)> z%|oVl^hX0)^Z!ckNfDFcu@1Qp2p0Rwp2KPJz4L9CZ<>|ItMhEr56t)aR9)2blhuKV$%ScMzmY!CY8WiQQN!4)sO9^D+Gs=8d+NDC&<7J zyN$#e*SyqJ(+$4MxmkO91~KiuJ&(zAtr`26Tew6L$-1>-x2Om#I!)s;(o5xHOwl!3 zzWx1xLAI!Gj7%Ca2f9JDId+$cfk};HNa&#six%a3cg$z@8~pRD+}n`s?d>>U=S~bp zR-KCy+cfU>hMOCi4oh0ro0M|S4al4fCloATad&NQ5S(4pOLq?xj{)Z@7(Le-orjq* zrihLGU9ruS(;C+RSN&PtAaZc#6fU(qG9m6@SL(J}%}7zhPTi73)t- zPdoC+`}3Zf=SDam|4{4#o0C!*UJu$Zl%nMqera1Z;hIYew*?}Ls2{T;U|hS(7x;3e z*_Ri4{2agmA<(Z5f1o8l%Y`2<0!|tp1(YFdlMS<+jxSb7P6)2FJCv#6e4OQ!{b`x# zA_@r3WBhmE6?sTPgm!W4bH(Fum%LSVHDJ``%-wU-C(Aq+#Z85ckLBRyT5#!-7I3ygQEz`%>dhi-DWXq6zKt zMob^&lP)YNF4fRUDN=wim(qXvb$C^>)N0JEv~|2ZPO#R>cPiIcpI~%&xoC~NQ#qf_ z@UZPI;th0bKV|9!Ku%JVJ!}{*0EiEMnT==4BtXNXqr3gnS}J-uVX9|!S}jSEt8h)z za)K`$&_$H}-g#LK!LFPRsd#*Zu$E~IWIo5Sne|Rw^!TlLT-5oA&h^4S5qkPHI%0-F z9Tm-fPP~%+2~V8A)os&g2il8C_0Q5~+Kre2w_l!U+8fcz-%_aULUV0wWSrEcOTzgE zOSWMdBqH;XN%C}hl&%t(=LhFy0fZBvbM!s|l+}a<0+9m%yAgRbfTKvmuBVqrOCAn& zlu~-~W(6vC3p$ht3x2KD=WEkh`W*C9T$6 zFtD*At_BOp{Kau@p!DEH)|`Seo_zAWP?pr+K+4i?k>KYOizp>=P!zW#V&9Uy zc&}cCP(Y6K4XM591`WvcG{w%AUm4VlUeHcM@iH2x1EN}#_A8Do99)fd4|CVcQZNHI#E?5-i%lSb*8_ zXbrW)OAoX(TaTI`+9rZb6fNW0YYS;{#~lun#rWU>IPIKWA@#rf@7C8ppN+Y!)EMw# zvDjUlDBsgI;!~ej{!Wuu7UP|lQiM%jx#lhw^U%5_Pwaa4YE7T(X3jMIP+`N9{?M|k zmquRBS+Cw%)6?DtiGx?8%^k38(Rjr1PVrjpzE5K}uQ1K(95Fk}e_kKcDyxt^&!a4A(fRn2XEnEQ zJd)u$wmdxIZZy#BbZjRRV($BS!=@1r zHVy~!AS@t4Tu+;f%fh(afX;XV(sCPkV}?jr zIz(wTrycn%iF!ObrDop0>~sGS))o1W8o?A^FhPfz*Flv)v&l%Qrul{2>|ozXVv;%u zGR-Bq%+V^&az@Y6=J`P#V_L>zJ&$}*1z&k#Ts=Me+scESbXerk+ZXV;xlobs6UBB5 zjeiWY7R>(T@38#xWP9(AW2B<3;pOLBXMdpB2_W}kl2o~gtd!H*E3BTS(ihIDNZuaD(zz^ ztHf*n{`H&9l8aP!232adnuJA|9tJt6wy^NK(-mUbMUvmwujPGpMy096r)}#ABmZ$7FrXN)4taPqDr(#!Xu6Ini3{ z>wJ7kS0i{;V%jIUidr+{KBiGaLhI3oxzaNWyv$|HSC3o$|BdPR2k%sDTgaEZnOy+y zA>ukRk5yj*oIMN0o;uH4SMmCFp2SNR5imbZNeA?8uczP)tk$4vwEhZDR+5~P~Z zYRJLYnR6Kgdf30-feIM_3j(|V5RAZAp3>nlJd8q|%xXL}x^WlM1b)FcA9daC0WJj( z!v~L9K!wV<2(AbOn12BMSCH}2v{NgO3iq?(bMM_Y?_U6n_a*(VdKJZlw0s*<{VP#~Vc zZyU4W8#Fd8VZ2evIAc^U+Wq7UskxN@!MT=wEd!Hoh>(==_DGp%jz-{FxW1(6Kfw|o zrnV%Q>x%GDsWZz3Q>k#_(3$G$C}aEwSy@^NBa5YbUjwt_K>i?xjCrq|k_kh!2au}d z8ZXfoJSxvYAXlQlNfCzMnFh%d?|oM-7cIVrj~A)r@oY5Qlmm{1u%xn4GW-vV1wv@> z{~-=y+)7jM5rvWCbVe=y_~TkgTyS@$|0+)_s1Ys7aU*z5Km5Yk}m*+e z`O;om=IumlDRqfdS*u4ntiAVn5KAm2{&{PM?#{nGPCEJ@qtuF=f6)4bqCSr(a1_5P z6_;9!hmjWB9um(tk@{yUbUOwgc9zmb&bg>c*X`5W*Jd2yWz`qJ{JQsp4S(>Zf7m{! zw0XZ4j{t}W4{evFK0*-i41p#n49{vdGX&_OaI8~XQED|7!dEUMxTJ*baWshZ2gf@$ zDoPV_jW|i|dsr|syp}<2gg{QE7mrnCT5md82dyWc^LQAI2Sky0DaM4a410tb89jeq zk98x`FhnN6^h__9PmNBe)~t0^h+7=aGBsX%R5{g4e{)!5LXl}I%*^kLY`&ySv~)8s z%~(3KFq2Uxi)INH6J2Fk4QjuJ6YwM&YMbR8?(nm%b&du~x7-I=N-ITQ`|stvXD%1e#*kG^m>KhtzNA@ES%D7E~xFvL%=X(&^3#!1ebGM)9`HdSymjE4o@! z_yDz9a=(=vvb$ipyQ1?>7tH{OnVU4tIlf#y4KIy{c9&7f3*X1vGIplO6d`;4)}w-q zLxlzSL0}({sN(p9Jb=&(1|SjED$k(eV=VR+J;%HbyXumlB8jyt5~;5$7XHR zh>lm=kJi)%Tl$zRS_xZXC)rt>O;~R1wKJ_%aY{7COq;dh3|HdpPFIEqIf^Qdih-CMV-@H$R#(8n zyftndNbLBbb5HkpUT!rV@UXahfOu*_D^oRbhCkFSsu^I->2_9S>fr-xS8Y;G4MbqvwjpMr>v$&9)hqB3*&7 zahWW@G})a=QzDy=Wr{9}NI(JIgf*seRX&7Ko89Tg#%>&=|vlF$Q3j z3j_>cJpv^XfYjw-#XtizOuA0}MHUNGiWy-_MlWRm4U&eAB@KIn-+fF%m)ZBCDGLyd zu)Uy2Bn8nTIsg(d01CcU3@D_*4ghQwGmOy?2Q+{iLLvmt0q~-Bv{8#@wNP1WB>^;1 zgK3IJYU{<~s+N%0Ac+z>F{f=EEu=N8ZK7h+Fg{RUmvOY4`mEI36b~I+trw*$LH@;zpGzQDpWwOjIH< zz9^w)HPUuhlG0nQ%6X}Xq;lvft)8mvwyV~qG$%WsAuCBHhSf|>0V+QY@{m!D4|G)J zZ^?G-XJrG~P)}B_Q+*oIu@X7fUd}hlU|_M^E@hc(SRjI1g=H>R%rSFen0C1{Empj1cC+$7ro=zz+f;MhF@JBVwU3c+22-B#ew8 z#>UVRphcD!QBwfu;3+Qv{$*4hW+rZcuplg{7|KDspb#q73ryNZo3(8tEX;K!T~(DV zC|JOZnXcHx+qp(<5VI_0u-Ln?!G_#!XExT!qK~ox7IqekBu(u*wM)rK*GDmDv}Nst z)UIE|nDFGf^a^DNRHmsBlaVGXS#ODks$?k+7(v7xjHJTq7>X_qR}~INMJdZjoNk-y zdxiTZ$ehUcVn#|w)uky)yLl>HceyfdDgiR90O$ZZ@7B0RapD;RO&R&@ ziF=qLV;PL8bWbf;RmHd4?6u&fX=e;2%o%zxRKQH^)mx7@Sw&?EXx{ELq7w9b6Sros zw~x)AE~%%b8FD(V#IXU0xpF!exCk6O9P@xt8OT|(z#wcEA@IhP_jX`Gd%Vz?$EvJ} zB*>HF;ytn=r0Y)4gb z69TKHqv`<+1q%QkmLv`3!TcaJVKIdzIVafR1%*&&*8NNmjM4hm*V+halD0NTATH{U zbI?xHMz9q#ZK@p^tQv-4%_^Cf)V2Y3HrinG#x6Ja=UHv5S=FwY)#FLBpldFysK-)F zO(lrQjx3{I*Iu$#dH}JwIA>wG^Cy|6dImb9u%;m*=3N%jUL3e+%E)q0LV1>&W!l6< z$m0l`2nTLg1&QpYCkLdx&_i{`!%`$Qw4D;;PN3*~r`;|HYP(790D!_Q(b}}fC+KEY z9#*tW8%8G11tT8(WV+o0LsL2QCswt!r&pDGH!^iKIdPQJ6rBSctf6ZcSq<-*Wg3cV zu6c%nGzeZmlf^6yFx^wS$-$ztSI%(wC~P-So2soO=JNEvY@nJ01SA+ z92tQDou=bme&+#xg-ok?XU1&g!jm+)LdL^?^GrcdY}F=*0h3!BZTMkoS`EqtMJWTA zo^7z?nh|_7Xd4DxI{;CU3|7qHfIHuZXJ*5w63tBu6T{MCpk67Cc2QBL)My0

    Pm( zS{BGznhHWGT!yxs?Wjig&YG;8lj}1M)>atd$S6jkSQk$T(M~xHZQ&pk4nipmTyg`* z!m@DSlvSfj7_=@pSX=8-vp9iDH(rbsKIT_bR*q_xSd6TiWs#iAA~~|urhZgC*GJ8L zu{e5>8Vyj{meD$o@2$I!^WRYWXE^_#$+Mf^1BM0I{F?fk?JM|Sz!#guXf3Kye3hd+ zsjT#yHyOS1;Lcu`Oie>uh2p427PRH;HL8*Ger}j`Z?=!%x#9!=z`|{0;boOQ001^$ sNu;laWw4B5VR?N(cJnJ^dNZfGu$h`}yh{`SvMK|km{I@$*ZE$*0rH9;qW}N^ literal 0 HcmV?d00001 diff --git a/sound/chemistry/catalyst.ogg b/sound/chemistry/catalyst.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f26115bfc73ae29a4b8922227f377150cb4369cf GIT binary patch literal 41252 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%0DFrTFZ9~|v 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%0A|=-d%JL`*(Z!pFo@_`hc5sHh<<78 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 { const { act, data } = useBackend(context); const recording = !!data.recordingRecipe; + const [hasCol, setHasCol] = useLocalState( + context, 'has_col', false); // TODO: Change how this piece of shit is built on server side // It has to be a list, not a fucking OBJECT! const recipes = Object.keys(data.recipes) @@ -31,11 +34,22 @@ export const ChemDispenser = (props, context) => {

    - - Recording - + buttons={( + + {recording && ( + + + Recording + + )} +
    diff --git a/tgui/packages/tgui/interfaces/ChemHeater.js b/tgui/packages/tgui/interfaces/ChemHeater.js index 40e09164ae8..b70e6ba3eac 100644 --- a/tgui/packages/tgui/interfaces/ChemHeater.js +++ b/tgui/packages/tgui/interfaces/ChemHeater.js @@ -1,61 +1,293 @@ +import { resolveAsset } from '../assets'; import { round, toFixed } from 'common/math'; import { useBackend } from '../backend'; -import { AnimatedNumber, Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { AnimatedNumber, Box, Button, NumberInput, Section, ProgressBar, Table, RoundGauge, Flex, Icon, TextArea } from '../components'; +import { TableCell, TableRow } from '../components/Table'; import { Window } from '../layouts'; import { BeakerContents } from './common/BeakerContents'; + export const ChemHeater = (props, context) => { const { act, data } = useBackend(context); const { targetTemp, isActive, + isFlashing, + currentpH, isBeakerLoaded, currentTemp, beakerCurrentVolume, beakerMaxVolume, + acidicBufferVol, + basicBufferVol, + dispenseVolume, + upgradeLevel, + tutorialMessage, beakerContents = [], + activeReactions = [], } = data; - return ( + return ( + width={330} + height={tutorialMessage ? 680 : 350}>
    act('power')} /> + +
    + {!!isBeakerLoaded && ( +
    + + 'pH: ' + round(value, 3)} /> + + + + {(_, value) => ( + null} + ranges={{ + "red": [-0.22, 1.5], + "orange": [1.5, 3], + "yellow": [3, 4.5], + "olive": [4.5, 5], + "good": [5, 6], + "green": [6, 8.5], + "teal": [8.5, 9.5], + "blue": [9.5, 11], + "purple": [11, 12.5], + "violet": [12.5, 14], + }} /> + )} + + + + )}> + {activeReactions.length === 0 && ( + + No active reactions. + + ) || ( + + + + Reaction + + + {upgradeLevel < 4 ? "Status" : "Reaction quality"} + + + Target + + + {activeReactions.map(reaction => ( + + + {reaction.name} + + + {upgradeLevel < 4 && ( + + ) || ( + + {(_, value) => ( + null} + ml={5} + ranges={{ + "red": [0, reaction.minPure], + "orange": [reaction.minPure, reaction.inverse], + "yellow": [reaction.inverse, 0.8], + "green": [0.8, 1], + }} /> + )} + + )} + + + {upgradeLevel > 2 && ( + + {reaction.targetVol}u + + ) || ( + + {reaction.targetVol}u + + )} + + + ))} + +
    + )} +
    + )} + {tutorialMessage && ( +
    + + {tutorialMessage} +
    + )}
    { {analyzeVars.state} + + {analyzeVars.ph} + {analyzeVars.color} diff --git a/tgui/packages/tgui/interfaces/ChemReactionChamber.js b/tgui/packages/tgui/interfaces/ChemReactionChamber.js index df9e0567be9..62d5ec94800 100644 --- a/tgui/packages/tgui/interfaces/ChemReactionChamber.js +++ b/tgui/packages/tgui/interfaces/ChemReactionChamber.js @@ -1,8 +1,9 @@ import { map } from 'common/collections'; import { classes } from 'common/react'; import { useBackend, useLocalState } from '../backend'; -import { Box, Button, Input, LabeledList, NumberInput, Section } from '../components'; +import { AnimatedNumber, Box, Button, Flex, Input, LabeledList, NumberInput, Section, RoundGauge } from '../components'; import { Window } from '../layouts'; +import { round, toFixed } from 'common/math'; export const ChemReactionChamber = (props, context) => { const { act, data } = useBackend(context); @@ -14,22 +15,99 @@ export const ChemReactionChamber = (props, context) => { reagentQuantity, setReagentQuantity, ] = useLocalState(context, 'reagentQuantity', 1); - const emptying = data.emptying; + const { + emptying, + temperature, + ph, + targetTemp, + isReacting, + } = data; const reagents = data.reagents || []; return ( + height={280}> +
    + + {"Target:"} + + act('temperature', { + target: value, + })} /> + + )}> + + + toFixed(value) + ' K'} /> + + + + + {(_, value) => ( + null} + left={-7.5} + position="absolute" + size={1.50} + ranges={{ + "red": [-0.22, 1.5], + "orange": [1.5, 3], + "yellow": [3, 4.5], + "olive": [4.5, 5], + "good": [5, 6], + "green": [6, 8.5], + "teal": [8.5, 9.5], + "blue": [9.5, 11], + "purple": [11, 12.5], + "violet": [12.5, 14], + }} /> + )} + + + round(value, 3)} /> + + + + +
    - {emptying ? "Emptying" : "Filling"} - + isReacting && ( + + {"Reacting"} + + ) || ( + + {emptying ? "Emptying" : "Filling"} + + ) )}> diff --git a/tgui/packages/tgui/interfaces/common/BeakerContents.js b/tgui/packages/tgui/interfaces/common/BeakerContents.js index 6517c844616..0dae690513d 100644 --- a/tgui/packages/tgui/interfaces/common/BeakerContents.js +++ b/tgui/packages/tgui/interfaces/common/BeakerContents.js @@ -1,4 +1,4 @@ -import { Box } from '../../components'; +import { AnimatedNumber, Box } from '../../components'; export const BeakerContents = props => { const { beakerLoaded, beakerContents } = props; @@ -15,7 +15,10 @@ export const BeakerContents = props => { )} {beakerContents.map(chemical => ( - {chemical.volume} units of {chemical.name} + + {" units of "+chemical.name} ))}