FrezonCoolantReaction.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. /// <summary>
  7. /// Takes in nitrogen and frezon and cools down the surrounding area.
  8. /// </summary>
  9. [UsedImplicitly]
  10. public sealed partial class FrezonCoolantReaction : IGasReactionEffect
  11. {
  12. public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
  13. {
  14. var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
  15. var temperature = mixture.Temperature;
  16. var energyModifier = 1f;
  17. var scale = (temperature - Atmospherics.FrezonCoolLowerTemperature) /
  18. (Atmospherics.FrezonCoolMidTemperature - Atmospherics.FrezonCoolLowerTemperature);
  19. if (scale > 1f)
  20. {
  21. // Scale energy but not frezon usage if we're in a very, very hot place
  22. energyModifier = Math.Min(scale, Atmospherics.FrezonCoolMaximumEnergyModifier);
  23. scale = 1f;
  24. }
  25. if (scale <= 0)
  26. return ReactionResult.NoReaction;
  27. var initialNit = mixture.GetMoles(Gas.Nitrogen);
  28. var initialFrezon = mixture.GetMoles(Gas.Frezon);
  29. var burnRate = initialFrezon * scale / Atmospherics.FrezonCoolRateModifier;
  30. var energyReleased = 0f;
  31. if (burnRate > Atmospherics.MinimumHeatCapacity)
  32. {
  33. var nitAmt = Math.Min(burnRate * Atmospherics.FrezonNitrogenCoolRatio, initialNit);
  34. var frezonAmt = Math.Min(burnRate, initialFrezon);
  35. mixture.AdjustMoles(Gas.Nitrogen, -nitAmt);
  36. mixture.AdjustMoles(Gas.Frezon, -frezonAmt);
  37. mixture.AdjustMoles(Gas.NitrousOxide, nitAmt + frezonAmt);
  38. energyReleased = burnRate * Atmospherics.FrezonCoolEnergyReleased * energyModifier;
  39. }
  40. energyReleased /= heatScale; // adjust energy to make sure speedup doesn't cause mega temperature rise
  41. if (energyReleased >= 0f)
  42. return ReactionResult.NoReaction;
  43. var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
  44. if (newHeatCapacity > Atmospherics.MinimumHeatCapacity)
  45. mixture.Temperature = (temperature * oldHeatCapacity + energyReleased) / newHeatCapacity;
  46. return ReactionResult.Reacting;
  47. }
  48. }