From: username <113782077+whateverusername0@users.noreply.github.com> Date: Thu, 21 Dec 2023 00:14:59 +0000 (+1000) Subject: Add nitrous oxide synthesis reaction (#22774) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=5a4e04ea14761bbeec4cc9b0af951292a04a38ed;p=space-station-14.git Add nitrous oxide synthesis reaction (#22774) Co-authored-by: whateverusername0 Co-authored-by: Kevin Zheng --- diff --git a/Content.Server/Atmos/Reactions/MiasmaOxygenReaction.cs b/Content.Server/Atmos/Reactions/MiasmaOxygenReaction.cs new file mode 100644 index 0000000000..0d4e1ef71f --- /dev/null +++ b/Content.Server/Atmos/Reactions/MiasmaOxygenReaction.cs @@ -0,0 +1,33 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Atmos; +using JetBrains.Annotations; + +namespace Content.Server.Atmos.Reactions; + +[UsedImplicitly] +public sealed partial class MiasmaOxygenReaction : IGasReactionEffect +{ + public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale) + { + var nMiasma = mixture.GetMoles(Gas.Miasma); + var nOxygen = mixture.GetMoles(Gas.Oxygen); + var nTotal = mixture.TotalMoles; + + // Concentration-dependent reaction rate + var fMiasma = nMiasma/nTotal; + var fOxygen = nOxygen/nTotal; + var rate = MathF.Pow(fMiasma, 2) * MathF.Pow(fOxygen, 2); + + var deltaMoles = nMiasma / Atmospherics.MiasmaOxygenReactionRate * 2 * rate; + + if (deltaMoles <= 0 || nMiasma - deltaMoles < 0) + return ReactionResult.NoReaction; + + mixture.AdjustMoles(Gas.Miasma, -deltaMoles); + mixture.AdjustMoles(Gas.Oxygen, -deltaMoles); + mixture.AdjustMoles(Gas.NitrousOxide, deltaMoles / 2); + mixture.AdjustMoles(Gas.WaterVapor, deltaMoles * 1.5f); + + return ReactionResult.Reacting; + } +} diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 24fa5ada20..71908326cc 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -241,6 +241,11 @@ namespace Content.Shared.Atmos /// public const float MiasmicSubsumationMaxConversionRate = 5f; + /// + /// Divisor for Miasma Oxygen reaction so that it doesn't happen instantaneously. + /// + public const float MiasmaOxygenReactionRate = 10f; + /// /// Determines at what pressure the ultra-high pressure red icon is displayed. /// diff --git a/Resources/Prototypes/Atmospherics/reactions.yml b/Resources/Prototypes/Atmospherics/reactions.yml index a01bf80f31..6553ae551b 100644 --- a/Resources/Prototypes/Atmospherics/reactions.yml +++ b/Resources/Prototypes/Atmospherics/reactions.yml @@ -74,6 +74,23 @@ effects: - !type:MiasmicSubsumationReaction {} +- type: gasReaction + id: MiasmaOxygenReaction + priority: 2 + minimumTemperature: 323.149 + minimumRequirements: + - 0.01 # oxygen + - 0 # nitrogen + - 0 # carbon dioxide + - 0 # plasma + - 0 # tritium + - 0 # vapor + - 0.01 # miasma + - 0 # n2o + - 0 # frezon + effects: + - !type:MiasmaOxygenReaction {} + #- type: gasReaction # id: WaterVaporPuddle # priority: 1