TritiumFireReaction.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. {
  7. [UsedImplicitly]
  8. [DataDefinition]
  9. public sealed partial class TritiumFireReaction : IGasReactionEffect
  10. {
  11. public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
  12. {
  13. var energyReleased = 0f;
  14. var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
  15. var temperature = mixture.Temperature;
  16. var location = holder as TileAtmosphere;
  17. mixture.ReactionResults[(byte)GasReaction.Fire] = 0f;
  18. var burnedFuel = 0f;
  19. var initialTrit = mixture.GetMoles(Gas.Tritium);
  20. if (mixture.GetMoles(Gas.Oxygen) < initialTrit ||
  21. Atmospherics.MinimumTritiumOxyburnEnergy > (temperature * oldHeatCapacity * heatScale))
  22. {
  23. burnedFuel = mixture.GetMoles(Gas.Oxygen) / Atmospherics.TritiumBurnOxyFactor;
  24. if (burnedFuel > initialTrit)
  25. burnedFuel = initialTrit;
  26. mixture.AdjustMoles(Gas.Tritium, -burnedFuel);
  27. }
  28. else
  29. {
  30. burnedFuel = initialTrit;
  31. mixture.SetMoles(Gas.Tritium, mixture.GetMoles(Gas.Tritium ) * (1 - 1 / Atmospherics.TritiumBurnTritFactor));
  32. mixture.AdjustMoles(Gas.Oxygen, -mixture.GetMoles(Gas.Tritium));
  33. energyReleased += (Atmospherics.FireHydrogenEnergyReleased * burnedFuel * (Atmospherics.TritiumBurnTritFactor - 1));
  34. }
  35. if (burnedFuel > 0)
  36. {
  37. energyReleased += (Atmospherics.FireHydrogenEnergyReleased * burnedFuel);
  38. // TODO ATMOS Radiation pulse here!
  39. // Conservation of mass is important.
  40. mixture.AdjustMoles(Gas.WaterVapor, burnedFuel);
  41. mixture.ReactionResults[(byte)GasReaction.Fire] += burnedFuel;
  42. }
  43. energyReleased /= heatScale; // adjust energy to make sure speedup doesn't cause mega temperature rise
  44. if (energyReleased > 0)
  45. {
  46. var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
  47. if (newHeatCapacity > Atmospherics.MinimumHeatCapacity)
  48. mixture.Temperature = ((temperature * oldHeatCapacity + energyReleased) / newHeatCapacity);
  49. }
  50. if (location != null)
  51. {
  52. temperature = mixture.Temperature;
  53. if (temperature > Atmospherics.FireMinimumTemperatureToExist)
  54. {
  55. atmosphereSystem.HotspotExpose(location, temperature, mixture.Volume);
  56. }
  57. }
  58. return mixture.ReactionResults[(byte)GasReaction.Fire] != 0 ? ReactionResult.Reacting : ReactionResult.NoReaction;
  59. }
  60. }
  61. }