AmmoniaOxygenReaction.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. using Content.Server.Atmos.EntitySystems;
  2. using Content.Shared.Atmos;
  3. using Content.Shared.Atmos.Reactions;
  4. using JetBrains.Annotations;
  5. namespace Content.Server.Atmos.Reactions;
  6. [UsedImplicitly]
  7. public sealed partial class AmmoniaOxygenReaction : IGasReactionEffect
  8. {
  9. public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
  10. {
  11. var nAmmonia = mixture.GetMoles(Gas.Ammonia);
  12. var nOxygen = mixture.GetMoles(Gas.Oxygen);
  13. var nTotal = mixture.TotalMoles;
  14. // Concentration-dependent reaction rate
  15. var fAmmonia = nAmmonia/nTotal;
  16. var fOxygen = nOxygen/nTotal;
  17. var rate = MathF.Pow(fAmmonia, 2) * MathF.Pow(fOxygen, 2);
  18. var deltaMoles = nAmmonia / Atmospherics.AmmoniaOxygenReactionRate * 2 * rate;
  19. if (deltaMoles <= 0 || nAmmonia - deltaMoles < 0)
  20. return ReactionResult.NoReaction;
  21. mixture.AdjustMoles(Gas.Ammonia, -deltaMoles);
  22. mixture.AdjustMoles(Gas.Oxygen, -deltaMoles);
  23. mixture.AdjustMoles(Gas.NitrousOxide, deltaMoles / 2);
  24. mixture.AdjustMoles(Gas.WaterVapor, deltaMoles * 1.5f);
  25. return ReactionResult.Reacting;
  26. }
  27. }